summaryrefslogtreecommitdiff
path: root/tests/registry
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-09-13 15:27:20 +0100
committerGitHub <noreply@github.com>2024-09-13 15:27:20 +0100
commit8539cacbbe7dd7e5bece23b971cf1792f9ade3e7 (patch)
tree311368b8c8f86a4c36f71a84be9b9d5df1724302 /tests/registry
parent1270d9bc93dc6bceb0ae45b73ca154bbcf1a5db8 (diff)
chore: update more registry.json files (#25615)
Extracted out of https://github.com/denoland/deno/pull/25614 It's better for these to be non-minified because then diffs are better when adding new versions.
Diffstat (limited to 'tests/registry')
-rw-r--r--tests/registry/npm/@babel/parser/registry.json61
-rw-r--r--tests/registry/npm/@isaacs/cliui/registry.json118
-rw-r--r--tests/registry/npm/@ljharb/has-package-exports-patterns/registry.json62
-rw-r--r--tests/registry/npm/@npmcli/agent/registry.json99
-rw-r--r--tests/registry/npm/@npmcli/fs/registry.json85
-rw-r--r--tests/registry/npm/@pkgjs/parseargs/registry.json67
-rw-r--r--tests/registry/npm/@types/lz-string/registry.json60
-rw-r--r--tests/registry/npm/@types/node/registry.json86
-rw-r--r--tests/registry/npm/@vue/compiler-core/registry.json72
-rw-r--r--tests/registry/npm/@vue/compiler-dom/registry.json72
-rw-r--r--tests/registry/npm/@vue/compiler-sfc/registry.json89
-rw-r--r--tests/registry/npm/@vue/compiler-ssr/registry.json64
-rw-r--r--tests/registry/npm/@vue/reactivity-transform/registry.json71
-rw-r--r--tests/registry/npm/@vue/reactivity/registry.json70
-rw-r--r--tests/registry/npm/@vue/runtime-core/registry.json67
-rw-r--r--tests/registry/npm/@vue/runtime-dom/registry.json71
-rw-r--r--tests/registry/npm/@vue/server-renderer/registry.json70
-rw-r--r--tests/registry/npm/@vue/shared/registry.json62
-rw-r--r--tests/registry/npm/abbrev/registry.json80
-rw-r--r--tests/registry/npm/agent-base/registry.json87
-rw-r--r--tests/registry/npm/aggregate-error/registry.json71
-rw-r--r--tests/registry/npm/ajv-formats/registry.json101
-rw-r--r--tests/registry/npm/ajv/registry.json153
-rw-r--r--tests/registry/npm/ansi-regex/registry.json162
-rw-r--r--tests/registry/npm/ansi-styles/registry.json121
-rw-r--r--tests/registry/npm/asn1/registry.json68
-rw-r--r--tests/registry/npm/assertion-error/registry.json66
-rw-r--r--tests/registry/npm/autoprefixer/registry.json48
-rw-r--r--tests/registry/npm/balanced-match/registry.json81
-rw-r--r--tests/registry/npm/bcrypt-pbkdf/registry.json54
-rw-r--r--tests/registry/npm/brace-expansion/registry.json85
-rw-r--r--tests/registry/npm/browserslist/registry.json43
-rw-r--r--tests/registry/npm/buildcheck/registry.json72
-rw-r--r--tests/registry/npm/cacache/registry.json110
-rw-r--r--tests/registry/npm/camelcase/registry.json67
-rw-r--r--tests/registry/npm/caniuse-lite/registry.json35
-rw-r--r--tests/registry/npm/chai/registry.json89
-rw-r--r--tests/registry/npm/chalk/registry.json151
-rw-r--r--tests/registry/npm/check-error/registry.json117
-rw-r--r--tests/registry/npm/chownr/registry.json74
-rw-r--r--tests/registry/npm/clean-stack/registry.json70
-rw-r--r--tests/registry/npm/cliui/registry.json96
-rw-r--r--tests/registry/npm/color-convert/registry.json75
-rw-r--r--tests/registry/npm/color-name/registry.json58
-rw-r--r--tests/registry/npm/cowsay/registry.json87
-rw-r--r--tests/registry/npm/cpu-features/registry.json78
-rw-r--r--tests/registry/npm/cross-spawn/registry.json102
-rw-r--r--tests/registry/npm/crypto-js/registry.json59
-rw-r--r--tests/registry/npm/csstype/registry.json93
-rw-r--r--tests/registry/npm/debug/registry.json88
-rw-r--r--tests/registry/npm/decamelize/registry.json68
-rw-r--r--tests/registry/npm/deep-eql/registry.json119
-rw-r--r--tests/registry/npm/define-properties/registry.json121
-rw-r--r--tests/registry/npm/eastasianwidth/registry.json59
-rw-r--r--tests/registry/npm/electron-to-chromium/registry.json29
-rw-r--r--tests/registry/npm/emoji-regex/registry.json116
-rw-r--r--tests/registry/npm/encoding/registry.json62
-rw-r--r--tests/registry/npm/env-paths/registry.json67
-rw-r--r--tests/registry/npm/err-code/registry.json69
-rw-r--r--tests/registry/npm/escalade/registry.json29
-rw-r--r--tests/registry/npm/estree-walker/registry.json72
-rw-r--r--tests/registry/npm/exponential-backoff/registry.json90
-rw-r--r--tests/registry/npm/fast-deep-equal/registry.json86
-rw-r--r--tests/registry/npm/find-up/registry.json73
-rw-r--r--tests/registry/npm/foreground-child/registry.json153
-rw-r--r--tests/registry/npm/fraction.js/registry.json34
-rw-r--r--tests/registry/npm/fs-extra/registry.json81
-rw-r--r--tests/registry/npm/fs-minipass/registry.json143
-rw-r--r--tests/registry/npm/fsevents/registry.json65
-rw-r--r--tests/registry/npm/function-bind/registry.json87
-rw-r--r--tests/registry/npm/get-caller-file/registry.json73
-rw-r--r--tests/registry/npm/get-func-name/registry.json117
-rw-r--r--tests/registry/npm/get-intrinsic/registry.json122
-rw-r--r--tests/registry/npm/get-stdin/registry.json70
-rw-r--r--tests/registry/npm/glob/registry.json145
-rw-r--r--tests/registry/npm/globals/registry.json85
-rw-r--r--tests/registry/npm/graceful-fs/registry.json62
-rw-r--r--tests/registry/npm/has-flag/registry.json67
-rw-r--r--tests/registry/npm/has-package-exports/registry.json121
-rw-r--r--tests/registry/npm/has-property-descriptors/registry.json100
-rw-r--r--tests/registry/npm/has-symbols/registry.json121
-rw-r--r--tests/registry/npm/has/registry.json77
-rw-r--r--tests/registry/npm/http-cache-semantics/registry.json63
-rw-r--r--tests/registry/npm/http-proxy-agent/registry.json86
-rw-r--r--tests/registry/npm/https-proxy-agent/registry.json89
-rw-r--r--tests/registry/npm/iconv-lite/registry.json79
-rw-r--r--tests/registry/npm/imurmurhash/registry.json60
-rw-r--r--tests/registry/npm/indent-string/registry.json67
-rw-r--r--tests/registry/npm/ip-address/registry.json122
-rw-r--r--tests/registry/npm/is-fullwidth-code-point/registry.json113
-rw-r--r--tests/registry/npm/is-lambda/registry.json67
-rw-r--r--tests/registry/npm/isexe/registry.json185
-rw-r--r--tests/registry/npm/jackspeak/registry.json123
-rw-r--r--tests/registry/npm/js-tokens/registry.json64
-rw-r--r--tests/registry/npm/jsbn/registry.json54
-rw-r--r--tests/registry/npm/json-schema-traverse/registry.json75
-rw-r--r--tests/registry/npm/jsonfile/registry.json72
-rw-r--r--tests/registry/npm/locate-path/registry.json70
-rw-r--r--tests/registry/npm/loose-envify/registry.json69
-rw-r--r--tests/registry/npm/loupe/registry.json175
-rw-r--r--tests/registry/npm/lru-cache/registry.json151
-rw-r--r--tests/registry/npm/lz-string/registry.json107
-rw-r--r--tests/registry/npm/magic-string/registry.json84
-rw-r--r--tests/registry/npm/make-fetch-happen/registry.json109
-rw-r--r--tests/registry/npm/minimatch/registry.json124
-rw-r--r--tests/registry/npm/minipass-collect/registry.json75
-rw-r--r--tests/registry/npm/minipass-fetch/registry.json106
-rw-r--r--tests/registry/npm/minipass-flush/registry.json76
-rw-r--r--tests/registry/npm/minipass-pipeline/registry.json60
-rw-r--r--tests/registry/npm/minipass-sized/registry.json78
-rw-r--r--tests/registry/npm/minipass/registry.json278
-rw-r--r--tests/registry/npm/minizlib/registry.json73
-rw-r--r--tests/registry/npm/mkdirp/registry.json68
-rw-r--r--tests/registry/npm/ms/registry.json73
-rw-r--r--tests/registry/npm/nan/registry.json63
-rw-r--r--tests/registry/npm/nanoid/registry.json102
-rw-r--r--tests/registry/npm/negotiator/registry.json61
-rw-r--r--tests/registry/npm/node-gyp/registry.json89
-rw-r--r--tests/registry/npm/node-releases/registry.json24
-rw-r--r--tests/registry/npm/nopt/registry.json94
-rw-r--r--tests/registry/npm/normalize-range/registry.json33
-rw-r--r--tests/registry/npm/object-keys/registry.json100
-rw-r--r--tests/registry/npm/p-limit/registry.json75
-rw-r--r--tests/registry/npm/p-locate/registry.json73
-rw-r--r--tests/registry/npm/p-map/registry.json75
-rw-r--r--tests/registry/npm/p-try/registry.json67
-rw-r--r--tests/registry/npm/package-json-from-dist/registry.json110
-rw-r--r--tests/registry/npm/path-exists/registry.json67
-rw-r--r--tests/registry/npm/path-key/registry.json68
-rw-r--r--tests/registry/npm/path-scurry/registry.json131
-rw-r--r--tests/registry/npm/pathval/registry.json113
-rw-r--r--tests/registry/npm/picocolors/registry.json58
-rw-r--r--tests/registry/npm/postcss-value-parser/registry.json29
-rw-r--r--tests/registry/npm/postcss/registry.json116
-rw-r--r--tests/registry/npm/preact-render-to-string/registry.json184
-rw-r--r--tests/registry/npm/preact/registry.json311
-rw-r--r--tests/registry/npm/pretty-format/registry.json69
-rw-r--r--tests/registry/npm/proc-log/registry.json146
-rw-r--r--tests/registry/npm/promise-retry/registry.json72
-rw-r--r--tests/registry/npm/punycode/registry.json81
-rw-r--r--tests/registry/npm/react-dom/registry.json82
-rw-r--r--tests/registry/npm/react/registry.json69
-rw-r--r--tests/registry/npm/require-directory/registry.json67
-rw-r--r--tests/registry/npm/require-from-string/registry.json69
-rw-r--r--tests/registry/npm/require-main-filename/registry.json66
-rw-r--r--tests/registry/npm/retry/registry.json77
-rw-r--r--tests/registry/npm/safer-buffer/registry.json72
-rw-r--r--tests/registry/npm/scheduler/registry.json57
-rw-r--r--tests/registry/npm/semver/registry.json113
-rw-r--r--tests/registry/npm/set-blocking/registry.json71
-rw-r--r--tests/registry/npm/shebang-command/registry.json69
-rw-r--r--tests/registry/npm/shebang-regex/registry.json67
-rw-r--r--tests/registry/npm/signal-exit/registry.json142
-rw-r--r--tests/registry/npm/smart-buffer/registry.json105
-rw-r--r--tests/registry/npm/socks-proxy-agent/registry.json94
-rw-r--r--tests/registry/npm/socks/registry.json82
-rw-r--r--tests/registry/npm/source-map-js/registry.json72
-rw-r--r--tests/registry/npm/source-map/registry.json74
-rw-r--r--tests/registry/npm/sourcemap-codec/registry.json80
-rw-r--r--tests/registry/npm/sprintf-js/registry.json77
-rw-r--r--tests/registry/npm/ssh2/registry.json85
-rw-r--r--tests/registry/npm/ssri/registry.json94
-rw-r--r--tests/registry/npm/string-width/registry.json171
-rw-r--r--tests/registry/npm/strip-ansi/registry.json167
-rw-r--r--tests/registry/npm/strip-final-newline/registry.json66
-rw-r--r--tests/registry/npm/supports-color/registry.json71
-rw-r--r--tests/registry/npm/supports-esm/registry.json65
-rw-r--r--tests/registry/npm/tar/registry.json106
-rwxr-xr-xtests/registry/npm/trim_registry_files.js3
-rw-r--r--tests/registry/npm/tweetnacl/registry.json79
-rw-r--r--tests/registry/npm/type-detect/registry.json126
-rw-r--r--tests/registry/npm/type-fest/registry.json85
-rw-r--r--tests/registry/npm/unique-filename/registry.json83
-rw-r--r--tests/registry/npm/unique-slug/registry.json83
-rw-r--r--tests/registry/npm/universalify/registry.json67
-rw-r--r--tests/registry/npm/update-browserslist-db/registry.json41
-rw-r--r--tests/registry/npm/uri-js/registry.json83
-rw-r--r--tests/registry/npm/v8flags/registry.json85
-rw-r--r--tests/registry/npm/vue/registry.json99
-rw-r--r--tests/registry/npm/which-module/registry.json67
-rw-r--r--tests/registry/npm/which/registry.json159
-rw-r--r--tests/registry/npm/wrap-ansi/registry.json184
-rw-r--r--tests/registry/npm/y18n/registry.json73
-rw-r--r--tests/registry/npm/yallist/registry.json69
-rw-r--r--tests/registry/npm/yargs-parser/registry.json73
-rw-r--r--tests/registry/npm/yargs/registry.json105
186 files changed, 16185 insertions, 185 deletions
diff --git a/tests/registry/npm/@babel/parser/registry.json b/tests/registry/npm/@babel/parser/registry.json
index bc6118776..a7e2b8c60 100644
--- a/tests/registry/npm/@babel/parser/registry.json
+++ b/tests/registry/npm/@babel/parser/registry.json
@@ -1 +1,60 @@
-{"name":"@babel/parser","dist-tags":{"latest":"7.19.0"},"versions":{"7.19.0":{"name":"@babel/parser","version":"7.19.0","description":"A JavaScript parser","author":"The Babel Team (https://babel.dev/team)","bugs":"https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen","license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"https://github.com/babel/babel.git","directory":"packages/babel-parser"},"main":"./lib/index.js","types":"./typings/babel-parser.d.ts","engines":{"node":">=6.0.0"},"devDependencies":{"@babel/code-frame":"^7.18.6","@babel/helper-check-duplicate-nodes":"^7.18.6","@babel/helper-fixtures":"^7.18.6","@babel/helper-string-parser":"^7.18.10","@babel/helper-validator-identifier":"^7.18.6","charcodes":"^0.2.0"},"bin":"./bin/babel-parser.js","type":"commonjs","_id":"@babel/parser@7.19.0","dist":{"shasum":"497fcafb1d5b61376959c1c338745ef0577aa02c","integrity":"sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==","tarball":"http://localhost:4260/@babel/parser/parser-7.19.0.tgz","fileCount":9,"unpackedSize":1926947,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLyuxYEcwPpnDSd5zj2aROo6jy2I5H16rb6yp5bNvX6wIgIO6qzfHVZrGoqEI+b73UoltOUMNIGX5xfRipuXpJOvw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFke1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr75g//fJSB/F+s79C65oFQclZV5zUctAHp2uUZxhBecOQM6CiVDH0X\r\nrhKpS1pvKH/TwknXHNx8dQfqgYB/fHBmHixftlQ6vcPhrX4R2dxTAbgOj/kJ\r\nB9VDiVVK4rKhm9OuuTLA/xRpWtFE3H18Qlo3Zoxh8SIR8udGSXGj7fYXNUgk\r\nGuZEFZqp5FXDY+Cx34BH0nVfcZGe5HUcOfRjpVc9yn1DrRWVzHKTZEGgiBXo\r\nJmbSzA+eUqIUDjmuCTKz66TPfMNC9hFRPDqcg4usP7bwOOkZ+xx7PNEeO4SI\r\nP53pUPx54CgR5fOoW/ue5Y4aWSIUrrf/txRwgeEaf+tYzegDeSfliUKEgS2h\r\nH3+1BdwymdJKuv3cveInyj5DRdepcmhTCUS2WHH/d4NnXw/lsutspw6PPr5h\r\nFnfMucSyyoHchCTluV9dR9RzTjZjbtU8X6Ad/SbYR5YlETMs0JhHu54/eWpF\r\nv+A5EBeacpscE1EnDrZOIYYFpexRCPiwr/wy0dqHIuI1Z2CoZ5+0SPt472pI\r\nWH5DCEsSn4H/LzDW1lepdyDfaScCNRzurxk6t4GBI/kk/62UqW5UoJ/tOC7u\r\n4dHRQETuK/szceMTuvHL9epnmiKcILvCxPMbSH5yxENdB8P8RqxB5qv77e2j\r\nIVyBYqXWg2l54A734Z86VjtCavQuooWavVQ=\r\n=35HW\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"A JavaScript parser","homepage":"https://babel.dev/docs/en/next/babel-parser","repository":{"type":"git","url":"https://github.com/babel/babel.git","directory":"packages/babel-parser"},"author":"The Babel Team (https://babel.dev/team)","license":"MIT","readme":"","readmeFilename":"","bugs":"https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen"}
+{
+ "name": "@babel/parser",
+ "dist-tags": {
+ "latest": "7.19.0"
+ },
+ "versions": {
+ "7.19.0": {
+ "name": "@babel/parser",
+ "version": "7.19.0",
+ "description": "A JavaScript parser",
+ "author": "The Babel Team (https://babel.dev/team)",
+ "bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen",
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/babel/babel.git",
+ "directory": "packages/babel-parser"
+ },
+ "main": "./lib/index.js",
+ "types": "./typings/babel-parser.d.ts",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "devDependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/helper-check-duplicate-nodes": "^7.18.6",
+ "@babel/helper-fixtures": "^7.18.6",
+ "@babel/helper-string-parser": "^7.18.10",
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "charcodes": "^0.2.0"
+ },
+ "bin": "./bin/babel-parser.js",
+ "type": "commonjs",
+ "_id": "@babel/parser@7.19.0",
+ "dist": {
+ "shasum": "497fcafb1d5b61376959c1c338745ef0577aa02c",
+ "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==",
+ "tarball": "http://localhost:4260/@babel/parser/parser-7.19.0.tgz",
+ "fileCount": 9,
+ "unpackedSize": 1926947
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A JavaScript parser",
+ "homepage": "https://babel.dev/docs/en/next/babel-parser",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/babel/babel.git",
+ "directory": "packages/babel-parser"
+ },
+ "author": "The Babel Team (https://babel.dev/team)",
+ "license": "MIT",
+ "readmeFilename": "",
+ "bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen"
+}
diff --git a/tests/registry/npm/@isaacs/cliui/registry.json b/tests/registry/npm/@isaacs/cliui/registry.json
index e9a0282c6..9cef3f6e5 100644
--- a/tests/registry/npm/@isaacs/cliui/registry.json
+++ b/tests/registry/npm/@isaacs/cliui/registry.json
@@ -1 +1,117 @@
-{"name":"@isaacs/cliui","dist-tags":{"latest":"8.0.2"},"versions":{"8.0.2":{"name":"@isaacs/cliui","version":"8.0.2","description":"easily create complex multi-column command-line-interfaces","main":"build/index.cjs","exports":{".":[{"import":"./index.mjs","require":"./build/index.cjs"},"./build/index.cjs"]},"type":"module","module":"./index.mjs","scripts":{"check":"standardx '**/*.ts' && standardx '**/*.js' && standardx '**/*.cjs'","fix":"standardx --fix '**/*.ts' && standardx --fix '**/*.js' && standardx --fix '**/*.cjs'","pretest":"rimraf build && tsc -p tsconfig.test.json && cross-env NODE_ENV=test npm run build:cjs","test":"c8 mocha ./test/*.cjs","test:esm":"c8 mocha ./test/**/*.mjs","postest":"check","coverage":"c8 report --check-coverage","precompile":"rimraf build","compile":"tsc","postcompile":"npm run build:cjs","build:cjs":"rollup -c","prepare":"npm run compile"},"repository":{"type":"git","url":"git+https://github.com/yargs/cliui.git"},"standard":{"ignore":["**/example/**"],"globals":["it"]},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","dependencies":{"string-width":"^5.1.2","string-width-cjs":"npm:string-width@^4.2.0","strip-ansi":"^7.0.1","strip-ansi-cjs":"npm:strip-ansi@^6.0.1","wrap-ansi":"^8.1.0","wrap-ansi-cjs":"npm:wrap-ansi@^7.0.0"},"devDependencies":{"@types/node":"^14.0.27","@typescript-eslint/eslint-plugin":"^4.0.0","@typescript-eslint/parser":"^4.0.0","c8":"^7.3.0","chai":"^4.2.0","chalk":"^4.1.0","cross-env":"^7.0.2","eslint":"^7.6.0","eslint-plugin-import":"^2.22.0","eslint-plugin-node":"^11.1.0","gts":"^3.0.0","mocha":"^10.0.0","rimraf":"^3.0.2","rollup":"^2.23.1","rollup-plugin-ts":"^3.0.2","standardx":"^7.0.0","typescript":"^4.0.0"},"engines":{"node":">=12"},"gitHead":"aa397fedbd0550c9925af6b62f970de663285641","bugs":{"url":"https://github.com/yargs/cliui/issues"},"_id":"@isaacs/cliui@8.0.2","_nodeVersion":"18.16.0","_npmVersion":"9.6.5","dist":{"integrity":"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==","shasum":"b37667b7bc181c168782259bab42474fbf52b550","tarball":"http://localhost:4260/@isaacs/cliui/cliui-8.0.2.tgz","fileCount":7,"unpackedSize":27797,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCelNZKJbAgma4U+TKy/m8jcOFEB03QqxhuvMsoQQpI9AIgMX6M/cVX8QYc0s3/19XRfc/+14yhVC1V1t5pwSlM4YE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUIJsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkUQ/9HQ98oHBZHe6doxpZP74q0cHYRHcXj48JnBhVRF7irHTYfw48\r\nJA4Jbgkcg0ZtTd0J7OFjpPbjjLAcqTBwPxMRVYZ+ec7a8AmKyGwVF1nhxryX\r\npjqsBixCyXQfxVz3xw7yrN0j+Tvk2luLgku7Exm9jp99H+46FiGEuerisJ84\r\nyCp9WByM92ONza6MlGhFe2+4jxx4lPMm4G35DkLgM3hXklh34xPUDG9cgZ8Q\r\nmOoqRQ1IAYsGTqj/2jdmsO9pFMqzvE2GAphuNCpK07dAZx2VNoQUHLSNnVUp\r\nBw3hUCHPJSDwSVbmU4y7VxnYXBA6C4TVwc1G1qxBa5C51v95y2vk2OQReVk0\r\nkwHByA/JC0dYpglbH3uXG7CDk0D0CHrV5qoYTJpsvL4yzM2FR1JlbMdEr7mP\r\npMl1aoLfjDe/NSADR/nOA9diNKwVqXv6f7EhzshqmZrGS0PpVS2L8hV6cWbp\r\nLB6DclAOfOHgZndZE+gbsWkVlkkduPS/Lbfi15G0KG+pbEnJBk7/uTnGqr5f\r\ndYN3SCTdMh4KVLtSA8RJ6iJxcMuQbQoQuJt5jPl64Q2aCU9IB2H56F22yExR\r\nY6e8sxYnXVyI+VhDFpjANMQPpXrlirlpO+tQn2R3mOj0LUKJTlnjb5kBNb4E\r\n1Cnqd7sdwVXry1Y98a2qt+GY+HY4LHIm6Rc=\r\n=uzAW\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"easily create complex multi-column command-line-interfaces","homepage":"https://github.com/yargs/cliui#readme","repository":{"type":"git","url":"git+https://github.com/yargs/cliui.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"bugs":{"url":"https://github.com/yargs/cliui/issues"},"license":"ISC","readme":"# @isaacs/cliui\n\nTemporary fork of [cliui](http://npm.im/cliui).\n\n![ci](https://github.com/yargs/cliui/workflows/ci/badge.svg)\n[![NPM version](https://img.shields.io/npm/v/cliui.svg)](https://www.npmjs.com/package/cliui)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n![nycrc config on GitHub](https://img.shields.io/nycrc/yargs/cliui)\n\neasily create complex multi-column command-line-interfaces.\n\n## Example\n\n```js\nconst ui = require('cliui')()\n\nui.div('Usage: $0 [command] [options]')\n\nui.div({\n text: 'Options:',\n padding: [2, 0, 1, 0]\n})\n\nui.div(\n {\n text: \"-f, --file\",\n width: 20,\n padding: [0, 4, 0, 4]\n },\n {\n text: \"the file to load.\" +\n chalk.green(\"(if this description is long it wraps).\")\n ,\n width: 20\n },\n {\n text: chalk.red(\"[required]\"),\n align: 'right'\n }\n)\n\nconsole.log(ui.toString())\n```\n\n## Deno/ESM Support\n\nAs of `v7` `cliui` supports [Deno](https://github.com/denoland/deno) and\n[ESM](https://nodejs.org/api/esm.html#esm_ecmascript_modules):\n\n```typescript\nimport cliui from \"https://deno.land/x/cliui/deno.ts\";\n\nconst ui = cliui({})\n\nui.div('Usage: $0 [command] [options]')\n\nui.div({\n text: 'Options:',\n padding: [2, 0, 1, 0]\n})\n\nui.div({\n text: \"-f, --file\",\n width: 20,\n padding: [0, 4, 0, 4]\n})\n\nconsole.log(ui.toString())\n```\n\n<img width=\"500\" src=\"screenshot.png\">\n\n## Layout DSL\n\ncliui exposes a simple layout DSL:\n\nIf you create a single `ui.div`, passing a string rather than an\nobject:\n\n* `\\n`: characters will be interpreted as new rows.\n* `\\t`: characters will be interpreted as new columns.\n* `\\s`: characters will be interpreted as padding.\n\n**as an example...**\n\n```js\nvar ui = require('./')({\n width: 60\n})\n\nui.div(\n 'Usage: node ./bin/foo.js\\n' +\n ' <regex>\\t provide a regex\\n' +\n ' <glob>\\t provide a glob\\t [required]'\n)\n\nconsole.log(ui.toString())\n```\n\n**will output:**\n\n```shell\nUsage: node ./bin/foo.js\n <regex> provide a regex\n <glob> provide a glob [required]\n```\n\n## Methods\n\n```js\ncliui = require('cliui')\n```\n\n### cliui({width: integer})\n\nSpecify the maximum width of the UI being generated.\nIf no width is provided, cliui will try to get the current window's width and use it, and if that doesn't work, width will be set to `80`.\n\n### cliui({wrap: boolean})\n\nEnable or disable the wrapping of text in a column.\n\n### cliui.div(column, column, column)\n\nCreate a row with any number of columns, a column\ncan either be a string, or an object with the following\noptions:\n\n* **text:** some text to place in the column.\n* **width:** the width of a column.\n* **align:** alignment, `right` or `center`.\n* **padding:** `[top, right, bottom, left]`.\n* **border:** should a border be placed around the div?\n\n### cliui.span(column, column, column)\n\nSimilar to `div`, except the next row will be appended without\na new line being created.\n\n### cliui.resetOutput()\n\nResets the UI elements of the current cliui instance, maintaining the values\nset for `width` and `wrap`.\n","readmeFilename":"README.md"}
+{
+ "name": "@isaacs/cliui",
+ "dist-tags": {
+ "latest": "8.0.2"
+ },
+ "versions": {
+ "8.0.2": {
+ "name": "@isaacs/cliui",
+ "version": "8.0.2",
+ "description": "easily create complex multi-column command-line-interfaces",
+ "main": "build/index.cjs",
+ "exports": {
+ ".": [
+ {
+ "import": "./index.mjs",
+ "require": "./build/index.cjs"
+ },
+ "./build/index.cjs"
+ ]
+ },
+ "type": "module",
+ "module": "./index.mjs",
+ "scripts": {
+ "check": "standardx '**/*.ts' && standardx '**/*.js' && standardx '**/*.cjs'",
+ "fix": "standardx --fix '**/*.ts' && standardx --fix '**/*.js' && standardx --fix '**/*.cjs'",
+ "pretest": "rimraf build && tsc -p tsconfig.test.json && cross-env NODE_ENV=test npm run build:cjs",
+ "test": "c8 mocha ./test/*.cjs",
+ "test:esm": "c8 mocha ./test/**/*.mjs",
+ "postest": "check",
+ "coverage": "c8 report --check-coverage",
+ "precompile": "rimraf build",
+ "compile": "tsc",
+ "postcompile": "npm run build:cjs",
+ "build:cjs": "rollup -c",
+ "prepare": "npm run compile"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/cliui.git"
+ },
+ "standard": {
+ "ignore": [
+ "**/example/**"
+ ],
+ "globals": [
+ "it"
+ ]
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "^14.0.27",
+ "@typescript-eslint/eslint-plugin": "^4.0.0",
+ "@typescript-eslint/parser": "^4.0.0",
+ "c8": "^7.3.0",
+ "chai": "^4.2.0",
+ "chalk": "^4.1.0",
+ "cross-env": "^7.0.2",
+ "eslint": "^7.6.0",
+ "eslint-plugin-import": "^2.22.0",
+ "eslint-plugin-node": "^11.1.0",
+ "gts": "^3.0.0",
+ "mocha": "^10.0.0",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.23.1",
+ "rollup-plugin-ts": "^3.0.2",
+ "standardx": "^7.0.0",
+ "typescript": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "gitHead": "aa397fedbd0550c9925af6b62f970de663285641",
+ "bugs": {
+ "url": "https://github.com/yargs/cliui/issues"
+ },
+ "_id": "@isaacs/cliui@8.0.2",
+ "_nodeVersion": "18.16.0",
+ "_npmVersion": "9.6.5",
+ "dist": {
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "shasum": "b37667b7bc181c168782259bab42474fbf52b550",
+ "tarball": "http://localhost:4260/@isaacs/cliui/cliui-8.0.2.tgz",
+ "fileCount": 7,
+ "unpackedSize": 27797
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "easily create complex multi-column command-line-interfaces",
+ "homepage": "https://github.com/yargs/cliui#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/cliui.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/cliui/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@ljharb/has-package-exports-patterns/registry.json b/tests/registry/npm/@ljharb/has-package-exports-patterns/registry.json
index d9144c852..c4a6c51af 100644
--- a/tests/registry/npm/@ljharb/has-package-exports-patterns/registry.json
+++ b/tests/registry/npm/@ljharb/has-package-exports-patterns/registry.json
@@ -1 +1,61 @@
-{"name":"@ljharb/has-package-exports-patterns","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"@ljharb/has-package-exports-patterns","version":"0.0.2","main":"./no.js","exports":{".":"./no.js","./patterns/*":"./patterns/*ed.js","./pattern-trailers/*":"./pattern-trailers/*ed.js","./pattern-trailers/*.js":"./pattern-trailers/*ed.js"},"repository":{"type":"git","url":"git+https://github.com/inspect-js/has-package-exports.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/inspect-js/has-package-exports/issues"},"publishConfig":{"access":"public"},"gitHead":"f0f693d8e03b9be35d8559df09f9d29cc93f0810","_id":"@ljharb/has-package-exports-patterns@0.0.2","_nodeVersion":"17.8.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==","shasum":"c1718939b65efa1f45f53686c2fcfa992b9fb68f","tarball":"http://localhost:4260/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz","fileCount":4,"unpackedSize":770,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2kq741WzizIG98/ELM99UeZlbDuUFh6N2Frl5pBxRFAiEAmmsPZYZVwIobIPJFHu+DlkHedTV3FZngCFTVkAlstJ4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTnmjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmobhg/+M0JnGNgLGqhKeAP3rdF06hRZnZcwQ/aHufu6K5LKF42LQwNY\r\n0PZIpb4qyfCI+rvSbK+kat3cPuY0ZnV99slZe4ZxR85FpJm3WDm+WxHqkDi8\r\nm5G0rY6dmwTB+8o05g8pUDaxu5Pd+J5ouWXBoySzyrctNoNwslBCvXY5GZZL\r\nowcI3gOFW3uhaBUrZa955LFcB7fUEvZkD7cayMKT21lTBb2lcby3Thl7yVHE\r\nBGU/6a4spdnfOi/YsJx9R67oCqCjwt93gAAa+7rclvsOQZITiR9722toywAU\r\ny64tb8t/MSGsR4cjoBlcjrVfgMPinJSN2rIL34IijKX6pSBvGRFkWY0MqMcO\r\n/YvOH61l2ivdGEMQBxCNPsdfMXKGUKriwJ6NLUZiSMSue5cxGQASj6S5FtkA\r\nqQV7DaQTJut3mrSYL93fs5rvVubBdGw4mmIoKkuICFXAaYTCiROUCrHOnpST\r\nL1G7ZLXLkKyT1k/ISivh5vFQq17IacHCEZ/5Y56UwtSBVistNsBhuVMQSOxJ\r\nwzzi0i0+nAVrSV+OUc9y9rFgx8EMppewOMG+JlLHNMD6V6jmA2wZBgf7ek8O\r\nun9TanuxyINaWKKsqg5/fSZCXjRNDd+uGA+UlrMSoznUACz7zdG+feC1bO+k\r\nkzuAfVPdiRNcilaRUc3ihfQH9TevL0hobPA=\r\n=VOhM\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"homepage":"https://github.com/inspect-js/has-package-exports#readme","repository":{"type":"git","url":"git+https://github.com/inspect-js/has-package-exports.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"bugs":{"url":"https://github.com/inspect-js/has-package-exports/issues"},"license":"MIT","readme":"ERROR: No README data found!","readmeFilename":""}
+{
+ "name": "@ljharb/has-package-exports-patterns",
+ "dist-tags": {
+ "latest": "0.0.2"
+ },
+ "versions": {
+ "0.0.2": {
+ "name": "@ljharb/has-package-exports-patterns",
+ "version": "0.0.2",
+ "main": "./no.js",
+ "exports": {
+ ".": "./no.js",
+ "./patterns/*": "./patterns/*ed.js",
+ "./pattern-trailers/*": "./pattern-trailers/*ed.js",
+ "./pattern-trailers/*.js": "./pattern-trailers/*ed.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-package-exports.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-package-exports/issues"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "gitHead": "f0f693d8e03b9be35d8559df09f9d29cc93f0810",
+ "_id": "@ljharb/has-package-exports-patterns@0.0.2",
+ "_nodeVersion": "17.8.0",
+ "_npmVersion": "8.3.1",
+ "dist": {
+ "integrity": "sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==",
+ "shasum": "c1718939b65efa1f45f53686c2fcfa992b9fb68f",
+ "tarball": "http://localhost:4260/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz",
+ "fileCount": 4,
+ "unpackedSize": 770
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/inspect-js/has-package-exports#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-package-exports.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-package-exports/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/@npmcli/agent/registry.json b/tests/registry/npm/@npmcli/agent/registry.json
index 40237be0b..452ecb94a 100644
--- a/tests/registry/npm/@npmcli/agent/registry.json
+++ b/tests/registry/npm/@npmcli/agent/registry.json
@@ -1 +1,98 @@
-{"name":"@npmcli/agent","description":"the http/https agent used by the npm cli","dist-tags":{"latest":"2.2.2"},"versions":{"2.2.2":{"name":"@npmcli/agent","version":"2.2.2","author":{"name":"GitHub Inc."},"license":"ISC","_id":"@npmcli/agent@2.2.2","bugs":{"url":"https://github.com/npm/agent/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"967604918e62f620a648c7975461c9c9e74fc5d5","tarball":"http://localhost:4260/@npmcli/agent/agent-2.2.2.tgz","fileCount":8,"integrity":"sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==","signatures":[{"sig":"MEYCIQD8utuvBD/N8G0uYr0HEHH22zAe3c5tqP0Gj0z80N+saQIhAJu+Qf6LE+R2RmJtdZVBAIPYico2M8zk7QAOpDwjstzf","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/@npmcli%2fagent@2.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17739},"main":"lib/index.js","engines":{"node":"^16.14.0 || >=18.0.0"},"gitHead":"47b9043b041c5ab982810fe16ea1c16e9ad9024e","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","gencerts":"bash scripts/create-cert.sh","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/agent.git","type":"git"},"_npmVersion":"10.5.0","description":"the http/https agent used by the npm cli","directories":{},"templateOSS":{"publish":"true","version":"4.21.3","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"20.11.1","dependencies":{"lru-cache":"^10.0.1","agent-base":"^7.1.0","http-proxy-agent":"^7.0.0","https-proxy-agent":"^7.0.1","socks-proxy-agent":"^8.0.3"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","nock":"^13.2.7","semver":"^7.5.4","simple-socks":"^3.1.0","minipass-fetch":"^3.0.3","@npmcli/template-oss":"4.21.3","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/agent.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/agent#readme","bugs":{"url":"https://github.com/npm/agent/issues"},"readme":"## @npmcli/agent\n\nA pair of Agent implementations for nodejs that provide consistent keep-alives, granular timeouts, dns caching, and proxy support.\n\n### Usage\n\n```js\nconst { getAgent, HttpAgent } = require('@npmcli/agent')\nconst fetch = require('minipass-fetch')\n\nconst main = async () => {\n // if you know what agent you need, you can create one directly\n const agent = new HttpAgent(agentOptions)\n // or you can use the getAgent helper, it will determine and create an Agent\n // instance for you as well as reuse that agent for new requests as appropriate\n const agent = getAgent('https://registry.npmjs.org/npm', agentOptions)\n // minipass-fetch is just an example, this will work for any http client that\n // supports node's Agents\n const res = await fetch('https://registry.npmjs.org/npm', { agent })\n}\n\nmain()\n```\n\n### Options\n\nAll options supported by the node Agent implementations are supported here, see [the docs](https://nodejs.org/api/http.html#new-agentoptions) for those.\n\nOptions that have been added by this module include:\n\n- `family`: what tcp family to use, can be `4` for IPv4, `6` for IPv6 or `0` for both.\n- `proxy`: a URL to a supported proxy, currently supports `HTTP CONNECT` based http/https proxies as well as socks4 and 5.\n- `dns`: configuration for the built-in dns cache\n - `ttl`: how long (in milliseconds) to keep cached dns entries, defaults to `5 * 60 * 100 (5 minutes)`\n - `lookup`: optional function to override how dns lookups are performed, defaults to `require('dns').lookup`\n- `timeouts`: a set of granular timeouts, all default to `0`\n - `connection`: time between initiating connection and actually connecting\n - `idle`: time between data packets (if a top level `timeout` is provided, it will be copied here)\n - `response`: time between sending a request and receiving a response\n - `transfer`: time between starting to receive a request and consuming the response fully\n","readmeFilename":"README.md"}
+{
+ "name": "@npmcli/agent",
+ "description": "the http/https agent used by the npm cli",
+ "dist-tags": {
+ "latest": "2.2.2"
+ },
+ "versions": {
+ "2.2.2": {
+ "name": "@npmcli/agent",
+ "version": "2.2.2",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "@npmcli/agent@2.2.2",
+ "bugs": {
+ "url": "https://github.com/npm/agent/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "967604918e62f620a648c7975461c9c9e74fc5d5",
+ "tarball": "http://localhost:4260/@npmcli/agent/agent-2.2.2.tgz",
+ "fileCount": 8,
+ "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/@npmcli%2fagent@2.2.2",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 17739
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ },
+ "gitHead": "47b9043b041c5ab982810fe16ea1c16e9ad9024e",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "gencerts": "bash scripts/create-cert.sh",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/agent.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.5.0",
+ "description": "the http/https agent used by the npm cli",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.21.3",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "20.11.1",
+ "dependencies": {
+ "lru-cache": "^10.0.1",
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "nock": "^13.2.7",
+ "semver": "^7.5.4",
+ "simple-socks": "^3.1.0",
+ "minipass-fetch": "^3.0.3",
+ "@npmcli/template-oss": "4.21.3",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/agent.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/agent#readme",
+ "bugs": {
+ "url": "https://github.com/npm/agent/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@npmcli/fs/registry.json b/tests/registry/npm/@npmcli/fs/registry.json
index 85cb620cb..3864ebd67 100644
--- a/tests/registry/npm/@npmcli/fs/registry.json
+++ b/tests/registry/npm/@npmcli/fs/registry.json
@@ -1 +1,84 @@
-{"name":"@npmcli/fs","description":"filesystem utilities for the npm cli","dist-tags":{"latest":"3.1.1"},"versions":{"3.1.1":{"name":"@npmcli/fs","version":"3.1.1","author":{"name":"GitHub Inc."},"license":"ISC","_id":"@npmcli/fs@3.1.1","bugs":{"url":"https://github.com/npm/fs/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"59cdaa5adca95d135fc00f2bb53f5771575ce726","tarball":"http://localhost:4260/@npmcli/fs/fs-3.1.1.tgz","fileCount":13,"integrity":"sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==","signatures":[{"sig":"MEQCIGgGtUq4+uzs0XScvlFRq+OwngJ/rv7arf79l9nlbNG8AiBdjGr9Hq1zFtsBVRBKL45mZOkBR8qHofq5eZRE9wke5Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26547},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"6f51359dd52cd06bd4cb2c36202163f330c528c4","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","postsnap":"npm run lintfix --","posttest":"npm run lint","npmclilint":"npmcli-lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/fs.git","type":"git"},"_npmVersion":"10.7.0","description":"filesystem utilities for the npm cli","directories":{},"templateOSS":{"version":"4.22.0","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"20.7.0","dependencies":{"semver":"^7.3.5"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.1","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/fs.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/fs#readme","bugs":{"url":"https://github.com/npm/fs/issues"},"readme":"# @npmcli/fs\n\npolyfills, and extensions, of the core `fs` module.\n\n## Features\n\n- `fs.cp` polyfill for node < 16.7.0\n- `fs.withTempDir` added\n- `fs.readdirScoped` added\n- `fs.moveFile` added\n\n## `fs.withTempDir(root, fn, options) -> Promise`\n\n### Parameters\n\n- `root`: the directory in which to create the temporary directory\n- `fn`: a function that will be called with the path to the temporary directory\n- `options`\n - `tmpPrefix`: a prefix to be used in the generated directory name\n\n### Usage\n\nThe `withTempDir` function creates a temporary directory, runs the provided\nfunction (`fn`), then removes the temporary directory and resolves or rejects\nbased on the result of `fn`.\n\n```js\nconst fs = require('@npmcli/fs')\nconst os = require('os')\n\n// this function will be called with the full path to the temporary directory\n// it is called with `await` behind the scenes, so can be async if desired.\nconst myFunction = async (tempPath) => {\n return 'done!'\n}\n\nconst main = async () => {\n const result = await fs.withTempDir(os.tmpdir(), myFunction)\n // result === 'done!'\n}\n\nmain()\n```\n\n## `fs.readdirScoped(root) -> Promise`\n\n### Parameters\n\n- `root`: the directory to read\n\n### Usage\n\nLike `fs.readdir` but handling `@org/module` dirs as if they were\na single entry.\n\n```javascript\nconst { readdirScoped } = require('@npmcli/fs')\nconst entries = await readdirScoped('node_modules')\n// entries will be something like: ['a', '@org/foo', '@org/bar']\n```\n\n## `fs.moveFile(source, dest, options) -> Promise`\n\nA fork of [move-file](https://github.com/sindresorhus/move-file) with\nsupport for Common JS.\n\n### Highlights\n\n- Promise API.\n- Supports moving a file across partitions and devices.\n- Optionally prevent overwriting an existing file.\n- Creates non-existent destination directories for you.\n- Automatically recurses when source is a directory.\n\n### Parameters\n\n- `source`: File, or directory, you want to move.\n- `dest`: Where you want the file or directory moved.\n- `options`\n - `overwrite` (`boolean`, default: `true`): Overwrite existing destination file(s).\n\n### Usage\n\nThe built-in\n[`fs.rename()`](https://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback)\nis just a JavaScript wrapper for the C `rename(2)` function, which doesn't\nsupport moving files across partitions or devices. This module is what you\nwould have expected `fs.rename()` to be.\n\n```js\nconst { moveFile } = require('@npmcli/fs');\n\n(async () => {\n\tawait moveFile('source/unicorn.png', 'destination/unicorn.png');\n\tconsole.log('The file has been moved');\n})();\n```\n","readmeFilename":"README.md"}
+{
+ "name": "@npmcli/fs",
+ "description": "filesystem utilities for the npm cli",
+ "dist-tags": {
+ "latest": "3.1.1"
+ },
+ "versions": {
+ "3.1.1": {
+ "name": "@npmcli/fs",
+ "version": "3.1.1",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "@npmcli/fs@3.1.1",
+ "bugs": {
+ "url": "https://github.com/npm/fs/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "59cdaa5adca95d135fc00f2bb53f5771575ce726",
+ "tarball": "http://localhost:4260/@npmcli/fs/fs-3.1.1.tgz",
+ "fileCount": 13,
+ "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==",
+ "unpackedSize": 26547
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "6f51359dd52cd06bd4cb2c36202163f330c528c4",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "postsnap": "npm run lintfix --",
+ "posttest": "npm run lint",
+ "npmclilint": "npmcli-lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/fs.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "filesystem utilities for the npm cli",
+ "directories": {},
+ "templateOSS": {
+ "version": "4.22.0",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "20.7.0",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.1",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/fs.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/fs#readme",
+ "bugs": {
+ "url": "https://github.com/npm/fs/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@pkgjs/parseargs/registry.json b/tests/registry/npm/@pkgjs/parseargs/registry.json
index ca7c654f9..035d6890f 100644
--- a/tests/registry/npm/@pkgjs/parseargs/registry.json
+++ b/tests/registry/npm/@pkgjs/parseargs/registry.json
@@ -1 +1,66 @@
-{"name":"@pkgjs/parseargs","dist-tags":{"latest":"0.11.0"},"versions":{"0.11.0":{"name":"@pkgjs/parseargs","version":"0.11.0","description":"Polyfill of future proposal for `util.parseArgs()`","engines":{"node":">=14"},"main":"index.js","exports":{".":"./index.js","./package.json":"./package.json"},"scripts":{"coverage":"c8 --check-coverage tape 'test/*.js'","test":"c8 tape 'test/*.js'","posttest":"eslint .","fix":"npm run posttest -- --fix"},"repository":{"type":"git","url":"git+ssh://git@github.com/pkgjs/parseargs.git"},"author":"","license":"MIT","bugs":{"url":"https://github.com/pkgjs/parseargs/issues"},"devDependencies":{"c8":"^7.10.0","eslint":"^8.2.0","eslint-plugin-node-core":"github:iansu/eslint-plugin-node-core","tape":"^5.2.2"},"gitHead":"1e3a94a5f8fd42e7b56ac4a672adcb224ee3c9ff","_id":"@pkgjs/parseargs@0.11.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==","shasum":"a77ea742fab25775145434eb1d2328cf5013ac33","tarball":"http://localhost:4260/@pkgjs/parseargs/parseargs-0.11.0.tgz","fileCount":17,"unpackedSize":74173,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvG/+saUhufCRZDSAMyqIZHb0x4c7N/gUvaev0PjFqHQIhAP3fAOwBeiw8NWaXAwTHTxmCZ5hxLTuFeTKtFBuLZrUz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjRCnEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxPw//dpGdahKANuMATGuciM2D4V7hb2Xqh0j+fxQ6/f2YX9aVpciE\r\nthUd8xPNqjUY0XmJsVLT+6fyLMDuZQp5rujRujWSaYqP/wg8bf17iwKdPPEH\r\n9u8q3cBy8nZZ1/JGRoz5Tc4oH6BKIy35Grl7W2eyFBORHHfzGmqQ4xVXM67H\r\nA0kuU6fZmMzZ1wajInzTdRBFDtjFEzuFhd/86Izk1kXhPOosj6xPn2QgBkD0\r\n9q7+Hfw6sY4GJ4ZWAHBORZ4iMATPUWN5w0YcFUozkFFtSlBCDAUsjCHJMsII\r\naWSgySSTIsXLDxqTTeG27umBfJ22TxxC4zh8wNM0rbAXMFmJv7Sa3w0U27aY\r\nN6P+4B77iMeBYi9rpz4QdQiQrymC4DhH3nA1UQSmAXbxYlqVNLTs4vnLgq2l\r\nV9qCxnJoPfuE4KWgVlpnluoII3RtYdzwRLAtKdeGpyMMmCvi8TyrWxLbH2Xs\r\n3Sg96U0LEtriD6RBwat870K2nfmDj3jTtLqZQPmcuXq7DLv7K5UmLDimQXDq\r\nwLq86PmPPsiPevflOjTrXUGhZh0NwCB5VyXOHDuLsAtmz2lqm8psdhya/XKA\r\nBquEVg30l7bP/Y1+fTTQWXzmJDcCeSDH7Xnez2wGYaYxJWeaUGOMmzjz9CKE\r\n6e0EV7qjDa8wUCxk84OCu8C0zsqpHeSp+XY=\r\n=vsby\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"Polyfill of future proposal for `util.parseArgs()`","homepage":"https://github.com/pkgjs/parseargs#readme","repository":{"type":"git","url":"git+ssh://git@github.com/pkgjs/parseargs.git"},"bugs":{"url":"https://github.com/pkgjs/parseargs/issues"},"license":"MIT","readme":"<!-- omit in toc -->\n# parseArgs\n\n[![Coverage][coverage-image]][coverage-url]\n\nPolyfill of `util.parseArgs()`\n\n## `util.parseArgs([config])`\n\n<!-- YAML\nadded: v18.3.0\nchanges:\n - version: REPLACEME\n pr-url: https://github.com/nodejs/node/pull/43459\n description: add support for returning detailed parse information\n using `tokens` in input `config` and returned properties.\n-->\n\n> Stability: 1 - Experimental\n\n* `config` {Object} Used to provide arguments for parsing and to configure\n the parser. `config` supports the following properties:\n * `args` {string\\[]} array of argument strings. **Default:** `process.argv`\n with `execPath` and `filename` removed.\n * `options` {Object} Used to describe arguments known to the parser.\n Keys of `options` are the long names of options and values are an\n {Object} accepting the following properties:\n * `type` {string} Type of argument, which must be either `boolean` or `string`.\n * `multiple` {boolean} Whether this option can be provided multiple\n times. If `true`, all values will be collected in an array. If\n `false`, values for the option are last-wins. **Default:** `false`.\n * `short` {string} A single character alias for the option.\n * `default` {string | boolean | string\\[] | boolean\\[]} The default option\n value when it is not set by args. It must be of the same type as the\n the `type` property. When `multiple` is `true`, it must be an array.\n * `strict` {boolean} Should an error be thrown when unknown arguments\n are encountered, or when arguments are passed that do not match the\n `type` configured in `options`.\n **Default:** `true`.\n * `allowPositionals` {boolean} Whether this command accepts positional\n arguments.\n **Default:** `false` if `strict` is `true`, otherwise `true`.\n * `tokens` {boolean} Return the parsed tokens. This is useful for extending\n the built-in behavior, from adding additional checks through to reprocessing\n the tokens in different ways.\n **Default:** `false`.\n\n* Returns: {Object} The parsed command line arguments:\n * `values` {Object} A mapping of parsed option names with their {string}\n or {boolean} values.\n * `positionals` {string\\[]} Positional arguments.\n * `tokens` {Object\\[] | undefined} See [parseArgs tokens](#parseargs-tokens)\n section. Only returned if `config` includes `tokens: true`.\n\nProvides a higher level API for command-line argument parsing than interacting\nwith `process.argv` directly. Takes a specification for the expected arguments\nand returns a structured object with the parsed options and positionals.\n\n```mjs\nimport { parseArgs } from 'node:util';\nconst args = ['-f', '--bar', 'b'];\nconst options = {\n foo: {\n type: 'boolean',\n short: 'f'\n },\n bar: {\n type: 'string'\n }\n};\nconst {\n values,\n positionals\n} = parseArgs({ args, options });\nconsole.log(values, positionals);\n// Prints: [Object: null prototype] { foo: true, bar: 'b' } []\n```\n\n```cjs\nconst { parseArgs } = require('node:util');\nconst args = ['-f', '--bar', 'b'];\nconst options = {\n foo: {\n type: 'boolean',\n short: 'f'\n },\n bar: {\n type: 'string'\n }\n};\nconst {\n values,\n positionals\n} = parseArgs({ args, options });\nconsole.log(values, positionals);\n// Prints: [Object: null prototype] { foo: true, bar: 'b' } []\n```\n\n`util.parseArgs` is experimental and behavior may change. Join the\nconversation in [pkgjs/parseargs][] to contribute to the design.\n\n### `parseArgs` `tokens`\n\nDetailed parse information is available for adding custom behaviours by\nspecifying `tokens: true` in the configuration.\nThe returned tokens have properties describing:\n\n* all tokens\n * `kind` {string} One of 'option', 'positional', or 'option-terminator'.\n * `index` {number} Index of element in `args` containing token. So the\n source argument for a token is `args[token.index]`.\n* option tokens\n * `name` {string} Long name of option.\n * `rawName` {string} How option used in args, like `-f` of `--foo`.\n * `value` {string | undefined} Option value specified in args.\n Undefined for boolean options.\n * `inlineValue` {boolean | undefined} Whether option value specified inline,\n like `--foo=bar`.\n* positional tokens\n * `value` {string} The value of the positional argument in args (i.e. `args[index]`).\n* option-terminator token\n\nThe returned tokens are in the order encountered in the input args. Options\nthat appear more than once in args produce a token for each use. Short option\ngroups like `-xy` expand to a token for each option. So `-xxx` produces\nthree tokens.\n\nFor example to use the returned tokens to add support for a negated option\nlike `--no-color`, the tokens can be reprocessed to change the value stored\nfor the negated option.\n\n```mjs\nimport { parseArgs } from 'node:util';\n\nconst options = {\n 'color': { type: 'boolean' },\n 'no-color': { type: 'boolean' },\n 'logfile': { type: 'string' },\n 'no-logfile': { type: 'boolean' },\n};\nconst { values, tokens } = parseArgs({ options, tokens: true });\n\n// Reprocess the option tokens and overwrite the returned values.\ntokens\n .filter((token) => token.kind === 'option')\n .forEach((token) => {\n if (token.name.startsWith('no-')) {\n // Store foo:false for --no-foo\n const positiveName = token.name.slice(3);\n values[positiveName] = false;\n delete values[token.name];\n } else {\n // Resave value so last one wins if both --foo and --no-foo.\n values[token.name] = token.value ?? true;\n }\n });\n\nconst color = values.color;\nconst logfile = values.logfile ?? 'default.log';\n\nconsole.log({ logfile, color });\n```\n\n```cjs\nconst { parseArgs } = require('node:util');\n\nconst options = {\n 'color': { type: 'boolean' },\n 'no-color': { type: 'boolean' },\n 'logfile': { type: 'string' },\n 'no-logfile': { type: 'boolean' },\n};\nconst { values, tokens } = parseArgs({ options, tokens: true });\n\n// Reprocess the option tokens and overwrite the returned values.\ntokens\n .filter((token) => token.kind === 'option')\n .forEach((token) => {\n if (token.name.startsWith('no-')) {\n // Store foo:false for --no-foo\n const positiveName = token.name.slice(3);\n values[positiveName] = false;\n delete values[token.name];\n } else {\n // Resave value so last one wins if both --foo and --no-foo.\n values[token.name] = token.value ?? true;\n }\n });\n\nconst color = values.color;\nconst logfile = values.logfile ?? 'default.log';\n\nconsole.log({ logfile, color });\n```\n\nExample usage showing negated options, and when an option is used\nmultiple ways then last one wins.\n\n```console\n$ node negate.js\n{ logfile: 'default.log', color: undefined }\n$ node negate.js --no-logfile --no-color\n{ logfile: false, color: false }\n$ node negate.js --logfile=test.log --color\n{ logfile: 'test.log', color: true }\n$ node negate.js --no-logfile --logfile=test.log --color --no-color\n{ logfile: 'test.log', color: false }\n```\n\n-----\n\n<!-- omit in toc -->\n## Table of Contents\n- [`util.parseArgs([config])`](#utilparseargsconfig)\n- [Scope](#scope)\n- [Version Matchups](#version-matchups)\n- [🚀 Getting Started](#-getting-started)\n- [🙌 Contributing](#-contributing)\n- [💡 `process.mainArgs` Proposal](#-processmainargs-proposal)\n - [Implementation:](#implementation)\n- [📃 Examples](#-examples)\n- [F.A.Qs](#faqs)\n- [Links & Resources](#links--resources)\n\n-----\n\n## Scope\n\nIt is already possible to build great arg parsing modules on top of what Node.js provides; the prickly API is abstracted away by these modules. Thus, process.parseArgs() is not necessarily intended for library authors; it is intended for developers of simple CLI tools, ad-hoc scripts, deployed Node.js applications, and learning materials.\n\nIt is exceedingly difficult to provide an API which would both be friendly to these Node.js users while being extensible enough for libraries to build upon. We chose to prioritize these use cases because these are currently not well-served by Node.js' API.\n\n----\n\n## Version Matchups\n\n| Node.js | @pkgjs/parseArgs |\n| -- | -- |\n| [v18.3.0](https://nodejs.org/docs/latest-v18.x/api/util.html#utilparseargsconfig) | [v0.9.1](https://github.com/pkgjs/parseargs/tree/v0.9.1#utilparseargsconfig) |\n| [v16.17.0](https://nodejs.org/dist/latest-v16.x/docs/api/util.html#utilparseargsconfig), [v18.7.0](https://nodejs.org/docs/latest-v18.x/api/util.html#utilparseargsconfig) | [0.10.0](https://github.com/pkgjs/parseargs/tree/v0.10.0#utilparseargsconfig) |\n\n----\n\n## 🚀 Getting Started\n\n1. **Install dependencies.**\n\n ```bash\n npm install\n ```\n\n2. **Open the index.js file and start editing!**\n\n3. **Test your code by calling parseArgs through our test file**\n\n ```bash\n npm test\n ```\n\n----\n\n## 🙌 Contributing\n\nAny person who wants to contribute to the initiative is welcome! Please first read the [Contributing Guide](CONTRIBUTING.md)\n\nAdditionally, reading the [`Examples w/ Output`](#-examples-w-output) section of this document will be the best way to familiarize yourself with the target expected behavior for parseArgs() once it is fully implemented.\n\nThis package was implemented using [tape](https://www.npmjs.com/package/tape) as its test harness.\n\n----\n\n## 💡 `process.mainArgs` Proposal\n\n> Note: This can be moved forward independently of the `util.parseArgs()` proposal/work.\n\n### Implementation:\n\n```javascript\nprocess.mainArgs = process.argv.slice(process._exec ? 1 : 2)\n```\n\n----\n\n## 📃 Examples\n\n```js\nconst { parseArgs } = require('@pkgjs/parseargs');\n```\n\n```js\nconst { parseArgs } = require('@pkgjs/parseargs');\n// specify the options that may be used\nconst options = {\n foo: { type: 'string'},\n bar: { type: 'boolean' },\n};\nconst args = ['--foo=a', '--bar'];\nconst { values, positionals } = parseArgs({ args, options });\n// values = { foo: 'a', bar: true }\n// positionals = []\n```\n\n```js\nconst { parseArgs } = require('@pkgjs/parseargs');\n// type:string & multiple\nconst options = {\n foo: {\n type: 'string',\n multiple: true,\n },\n};\nconst args = ['--foo=a', '--foo', 'b'];\nconst { values, positionals } = parseArgs({ args, options });\n// values = { foo: [ 'a', 'b' ] }\n// positionals = []\n```\n\n```js\nconst { parseArgs } = require('@pkgjs/parseargs');\n// shorts\nconst options = {\n foo: {\n short: 'f',\n type: 'boolean'\n },\n};\nconst args = ['-f', 'b'];\nconst { values, positionals } = parseArgs({ args, options, allowPositionals: true });\n// values = { foo: true }\n// positionals = ['b']\n```\n\n```js\nconst { parseArgs } = require('@pkgjs/parseargs');\n// unconfigured\nconst options = {};\nconst args = ['-f', '--foo=a', '--bar', 'b'];\nconst { values, positionals } = parseArgs({ strict: false, args, options, allowPositionals: true });\n// values = { f: true, foo: 'a', bar: true }\n// positionals = ['b']\n```\n\n----\n\n## F.A.Qs\n\n- Is `cmd --foo=bar baz` the same as `cmd baz --foo=bar`?\n - yes\n- Does the parser execute a function?\n - no\n- Does the parser execute one of several functions, depending on input?\n - no\n- Can subcommands take options that are distinct from the main command?\n - no\n- Does it output generated help when no options match?\n - no\n- Does it generated short usage? Like: `usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]`\n - no (no usage/help at all)\n- Does the user provide the long usage text? For each option? For the whole command?\n - no\n- Do subcommands (if implemented) have their own usage output?\n - no\n- Does usage print if the user runs `cmd --help`?\n - no\n- Does it set `process.exitCode`?\n - no\n- Does usage print to stderr or stdout?\n - N/A\n- Does it check types? (Say, specify that an option is a boolean, number, etc.)\n - no\n- Can an option have more than one type? (string or false, for example)\n - no\n- Can the user define a type? (Say, `type: path` to call `path.resolve()` on the argument.)\n - no\n- Does a `--foo=0o22` mean 0, 22, 18, or \"0o22\"?\n - `\"0o22\"`\n- Does it coerce types?\n - no\n- Does `--no-foo` coerce to `--foo=false`? For all options? Only boolean options?\n - no, it sets `{values:{'no-foo': true}}`\n- Is `--foo` the same as `--foo=true`? Only for known booleans? Only at the end?\n - no, they are not the same. There is no special handling of `true` as a value so it is just another string.\n- Does it read environment variables? Ie, is `FOO=1 cmd` the same as `cmd --foo=1`?\n - no\n- Do unknown arguments raise an error? Are they parsed? Are they treated as positional arguments?\n - no, they are parsed, not treated as positionals\n- Does `--` signal the end of options?\n - yes\n- Is `--` included as a positional?\n - no\n- Is `program -- foo` the same as `program foo`?\n - yes, both store `{positionals:['foo']}`\n- Does the API specify whether a `--` was present/relevant?\n - no\n- Is `-bar` the same as `--bar`?\n - no, `-bar` is a short option or options, with expansion logic that follows the\n [Utility Syntax Guidelines in POSIX.1-2017](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). `-bar` expands to `-b`, `-a`, `-r`.\n- Is `---foo` the same as `--foo`?\n - no\n - the first is a long option named `'-foo'`\n - the second is a long option named `'foo'`\n- Is `-` a positional? ie, `bash some-test.sh | tap -`\n - yes\n\n## Links & Resources\n\n* [Initial Tooling Issue](https://github.com/nodejs/tooling/issues/19)\n* [Initial Proposal](https://github.com/nodejs/node/pull/35015)\n* [parseArgs Proposal](https://github.com/nodejs/node/pull/42675)\n\n[coverage-image]: https://img.shields.io/nycrc/pkgjs/parseargs\n[coverage-url]: https://github.com/pkgjs/parseargs/blob/main/.nycrc\n[pkgjs/parseargs]: https://github.com/pkgjs/parseargs\n","readmeFilename":"README.md"}
+{
+ "name": "@pkgjs/parseargs",
+ "dist-tags": {
+ "latest": "0.11.0"
+ },
+ "versions": {
+ "0.11.0": {
+ "name": "@pkgjs/parseargs",
+ "version": "0.11.0",
+ "description": "Polyfill of future proposal for `util.parseArgs()`",
+ "engines": {
+ "node": ">=14"
+ },
+ "main": "index.js",
+ "exports": {
+ ".": "./index.js",
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "coverage": "c8 --check-coverage tape 'test/*.js'",
+ "test": "c8 tape 'test/*.js'",
+ "posttest": "eslint .",
+ "fix": "npm run posttest -- --fix"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/pkgjs/parseargs.git"
+ },
+ "author": "",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/pkgjs/parseargs/issues"
+ },
+ "devDependencies": {
+ "c8": "^7.10.0",
+ "eslint": "^8.2.0",
+ "eslint-plugin-node-core": "github:iansu/eslint-plugin-node-core",
+ "tape": "^5.2.2"
+ },
+ "gitHead": "1e3a94a5f8fd42e7b56ac4a672adcb224ee3c9ff",
+ "_id": "@pkgjs/parseargs@0.11.0",
+ "_nodeVersion": "16.17.1",
+ "_npmVersion": "8.15.0",
+ "dist": {
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "shasum": "a77ea742fab25775145434eb1d2328cf5013ac33",
+ "tarball": "http://localhost:4260/@pkgjs/parseargs/parseargs-0.11.0.tgz",
+ "fileCount": 17,
+ "unpackedSize": 74173
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Polyfill of future proposal for `util.parseArgs()`",
+ "homepage": "https://github.com/pkgjs/parseargs#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/pkgjs/parseargs.git"
+ },
+ "bugs": {
+ "url": "https://github.com/pkgjs/parseargs/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@types/lz-string/registry.json b/tests/registry/npm/@types/lz-string/registry.json
index 3b9dc633b..261c43340 100644
--- a/tests/registry/npm/@types/lz-string/registry.json
+++ b/tests/registry/npm/@types/lz-string/registry.json
@@ -1 +1,59 @@
-{"name":"@types/lz-string","description":"Stub TypeScript definitions entry for lz-string, which provides its own types definitions","dist-tags":{"latest":"1.5.0"},"versions":{"1.3.33":{"name":"@types/lz-string","version":"1.3.33","description":"TypeScript definitions for lz-string","license":"MIT","main":"","types":"index","repository":{"type":"git","url":"https://github.com/DefinitelyTyped/DefinitelyTyped.git"},"scripts":{},"dependencies":{},"typesPublisherContentHash":"37e0f8cf2fb1fe08bdcc8e21278c91217d4a03d1cd6b32fc0eaec30757c6d4b1","typeScriptVersion":"2.0","_id":"@types/lz-string@1.3.33","dist":{"integrity":"sha512-yWj3OnlKlwNpq9+Jh/nJkVAD3ta8Abk2kIRpjWpVkDlAD43tn6Q6xk5hurp84ndcq54jBDBGCD/WcIR0pspG0A==","shasum":"de2d6105ea7bcaf67dd1d9451d580700d30473fc","tarball":"http://localhost:4260/@types/lz-string/lz-string-1.3.33.tgz","fileCount":4,"unpackedSize":5960,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcZIpFCRA9TVsSAnZWagAAYm8QAJCahktTDI8BUR8q+Qra\nzsvv7Vbb20Ti7uoh97yzJiEC8UEWCGnxpZouWr3xoy0FjByYIvGmHqslGohP\nksiikCXiy+5pfT0Yi3M4QeADPlQjqUVTweCoeMmpUaHWGBdqG2kE6tnioCQy\nAL9n/YnQc10b5SE/XYgKHuBN/HJ5tx1Ejcg/o7qJG/2cUe/1K1asIMFUockV\ncgwFXFl8OSMTcA3Bs0C84zIdcaC4njVqUIQOWqdgKbe1vs+O/Zf/OdiYQh9f\nZZMXffwJKVpLSfhOTeDHeD1WMNmiww+FVIikeUIihp7Xahk9YbrLtE5BUSgG\nl9/vNfzUDW+J5oJb6n8k9WojHjte00inzMa1O7QVT7cUC+e5Nup1df0VErNF\nVuaBMUy2o0LViCVcXOYUnDBQCoaKpQ8cIVhtl0VLFrOdyn+a0blcwaNNrvE1\nFKb+OgBqipIDwAx1QghV45MPtRzI/TLYeSZtHoOYVJ8zc11FzjaQ33NZj/5w\nVzMnRkmjpwF5j++JSOa3687iKJTgrJ6XHYliYpxRRpJY3Oa4Nl0/G+xMm1BS\n0ueZuqpM+h2ZMuG7TQOeDKtTll7tsuKwy2UlkkP2uJOVurqJkCvcK/ImG25W\nKENAcoJvsk956vlbvJCdqvIcV5OF5XhgQh10gaAfHl+pJiLbCBhHpeWd95+Y\n5/3T\r\n=MjUN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHlPUpoP+v+OWyats51tKkKMx97XrotlO8GzoVtS22/KAiEAxLb7ultFaZZIfGVCNeHE/X+J9I58zkNA6a8LKcm2Wns="}]},"directories":{},"_hasShrinkwrap":false},"1.5.0":{"name":"@types/lz-string","version":"1.5.0","description":"Stub TypeScript definitions entry for lz-string, which provides its own types definitions","main":"","scripts":{},"license":"MIT","dependencies":{"lz-string":"*"},"deprecated":"This is a stub types definition. lz-string provides its own type definitions, so you do not need this installed.","_id":"@types/lz-string@1.5.0","dist":{"integrity":"sha512-s84fKOrzqqNCAPljhVyC5TjAo6BH4jKHw9NRNFNiRUY5QSgZCmVm5XILlWbisiKl+0OcS7eWihmKGS5akc2iQw==","shasum":"2f15d2dd9dbfb344f3d31aee5a82cf350b037e5f","tarball":"http://localhost:4260/@types/lz-string/lz-string-1.5.0.tgz","fileCount":4,"unpackedSize":1754,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFwugI1BNDwbq90OnD5/morYlSnSQheJEnyTkclzw0SKAiAThdPB2+I/hjRlN5URdZcK4v0XXcVnh5xvMSf7SgQZ8A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkECMgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmopOQ//U+7G8WFrWQ3ecjTZrMAAqmwWNK1jgA3r0PonmwkiDjQlNAHj\r\nXAfJK8YSuFBrl8buIAkoJT9i+H6bpHIShj5fA4FKVtA1ihcwclAdvvoilwH2\r\nNCvoFeZZgrZB6y5e6AvGDHY67C2DzQ9XhfqYM0myyXS+of2gfznAPVqXwGCs\r\nWW39ee/WAbBEoN2Z1/hEAh+W51hV0HUjs39sbupo0vOHy9GdYuVJtTMeqesF\r\nmCfDDaM1FxbsMFccy8qRsihD26iwBMRa+W3+208gCc0i9xs8wRc+8GQcAGWd\r\nxSrTEgRd8hfBs6bxDKlSD3Qg7pTq3L+HvlUZGL2AHSbC6k/MCNduHhxEcrrj\r\nssFE4iuCievfQsd0CC4rI/8s5MDGwdQ+nldv0rYjsSphjLgHDly0LE1kAbNv\r\nxZWFXmFb7318wmbC38KYDn1I0b6YndHQFu1usVJ+Z107H/mxWRZeRg0THlD8\r\n3LuLEkCJqRddGmLkSQkJ6IZtX8H9EuuhU4ny6Xb3FYFhnXWmw7YSuvrrfSgs\r\nPlLlscCRsXgWYPzQ7h8mOyE4MoHfrjzcgFKIUgWPvW6EprDPAKu28vIXnn7j\r\nG0CiCYL+IWWTqa6pKkOJsE1ILkPYTZj/592zfGPzspl9Kfb/4+IaDMmApBVO\r\n51TMBjyXgYYDajmh6y8/U389X93/bIV/wjY=\r\n=935O\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"license":"MIT","readmeFilename":""}
+{
+ "name": "@types/lz-string",
+ "description": "Stub TypeScript definitions entry for lz-string, which provides its own types definitions",
+ "dist-tags": {
+ "latest": "1.5.0"
+ },
+ "versions": {
+ "1.3.33": {
+ "name": "@types/lz-string",
+ "version": "1.3.33",
+ "description": "TypeScript definitions for lz-string",
+ "license": "MIT",
+ "main": "",
+ "types": "index",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git"
+ },
+ "scripts": {},
+ "dependencies": {},
+ "typesPublisherContentHash": "37e0f8cf2fb1fe08bdcc8e21278c91217d4a03d1cd6b32fc0eaec30757c6d4b1",
+ "typeScriptVersion": "2.0",
+ "_id": "@types/lz-string@1.3.33",
+ "dist": {
+ "integrity": "sha512-yWj3OnlKlwNpq9+Jh/nJkVAD3ta8Abk2kIRpjWpVkDlAD43tn6Q6xk5hurp84ndcq54jBDBGCD/WcIR0pspG0A==",
+ "shasum": "de2d6105ea7bcaf67dd1d9451d580700d30473fc",
+ "tarball": "http://localhost:4260/@types/lz-string/lz-string-1.3.33.tgz",
+ "fileCount": 4,
+ "unpackedSize": 5960
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "1.5.0": {
+ "name": "@types/lz-string",
+ "version": "1.5.0",
+ "description": "Stub TypeScript definitions entry for lz-string, which provides its own types definitions",
+ "main": "",
+ "scripts": {},
+ "license": "MIT",
+ "dependencies": {
+ "lz-string": "*"
+ },
+ "deprecated": "This is a stub types definition. lz-string provides its own type definitions, so you do not need this installed.",
+ "_id": "@types/lz-string@1.5.0",
+ "dist": {
+ "integrity": "sha512-s84fKOrzqqNCAPljhVyC5TjAo6BH4jKHw9NRNFNiRUY5QSgZCmVm5XILlWbisiKl+0OcS7eWihmKGS5akc2iQw==",
+ "shasum": "2f15d2dd9dbfb344f3d31aee5a82cf350b037e5f",
+ "tarball": "http://localhost:4260/@types/lz-string/lz-string-1.5.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 1754
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/@types/node/registry.json b/tests/registry/npm/@types/node/registry.json
index 9c5140705..4bdcd9f52 100644
--- a/tests/registry/npm/@types/node/registry.json
+++ b/tests/registry/npm/@types/node/registry.json
@@ -1 +1,85 @@
-{"name":"@types/node","description":"TypeScript definitions for node","dist-tags":{"latest":"18.8.2"},"versions":{"18.8.2":{"name":"@types/node","version":"18.8.2","description":"TypeScript definitions for Node.js","license":"MIT","main":"","types":"index.d.ts","typesVersions":{"<4.9.0-0":{"*":["ts4.8/*"]}},"repository":{"type":"git","url":"https://github.com/DefinitelyTyped/DefinitelyTyped.git","directory":"types/node"},"scripts":{},"dependencies":{},"typesPublisherContentHash":"034172ea945b66afc6502e6be34d6fb957c596091e39cf43672e8aca563a8c66","typeScriptVersion":"4.1","_id":"@types/node@18.8.2","dist":{"integrity":"sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==","shasum":"17d42c6322d917764dd3d2d3a10d7884925de067","tarball":"http://localhost:4260/@types/node/node-18.8.2.tgz","fileCount":124,"unpackedSize":3524549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAqI3XibndhBD647C/13AFb58Fhmg4WmfCoGrIYrgtzwIhAIB0b0D58Tigwb3qKaOVsKnuYOOr0strAmprZSCi/+oq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPFItACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKAg/+IwaUWPgePlO4IxW7CVhFEEFiyhjEH3FHe0ogC3YmreoBFv/A\r\nPwQrwObdskbGWrBzsAOVFvhzYktzP3kc857HtU2ia9FXeaEYvsSQBqh6jZfA\r\njR1+h+jn+W5JnmbnwRGfNn2riCo/un4tYoZ4o/bKiMdNd9WrdIs0Oii1Dd4N\r\nnsBXPb05UPPP4Uu8cz68u1bj+QQ6aslr6keGNyNeILf8bJsEfcfVkEO3l4cu\r\njyTIrxiD+tM8jrUE9CDeodF8CZNuvLh3hqdMPJeH3U47qkDtPDKEOvZTbyYm\r\ngodto6mcnuBr8F9vmikAQfGiXV0U2cg2XRjWc1lI8HT4X0kESTIo+nzNuliD\r\niTpfjyZHdKBGGIuHP1Ou9dVvx4t5XZ1JsK9EK5WTilvAlu/qZrynxXxAV3Rc\r\nvL9UhIacISprMWB3Sohl9ZtfcmGnV/KMRpM+yPZOWp39gQQCKaKF/j2f/mir\r\n8YFbFUnySZkXKzxgsgjrSsh9QiK2dYAzcqHlazITeFN9jOYRzYUjAFj3qOFm\r\n7o1eJpW0qM5vgR+fPq30WxcdcQ4PaWgHSlb/ll8hiwQG1ZUihO/1RU7FtDoc\r\n1KwcfrGOAJPL6vBSLPReUkhDIUTSBwfmvfMxzqD1aDp6YV5WX7h03B0dWbPJ\r\nmPJmJZjjZje4Trk9jBJ5/ZLpB8/zkrDKvhE=\r\n=LPWa\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false},"18.16.19":{"name":"@types/node","version":"18.16.19","description":"TypeScript definitions for Node.js","license":"MIT","main":"","types":"index.d.ts","typesVersions":{"<=4.8":{"*":["ts4.8/*"]}},"repository":{"type":"git","url":"https://github.com/DefinitelyTyped/DefinitelyTyped.git","directory":"types/node"},"scripts":{},"dependencies":{},"typesPublisherContentHash":"e0763594b4075c74150a6024cd39f92797ea5c273540e3a5fe0a63a791ffa0c8","typeScriptVersion":"4.3","_id":"@types/node@18.16.19","dist":{"integrity":"sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==","shasum":"cb03fca8910fdeb7595b755126a8a78144714eea","tarball":"http://localhost:4260/@types/node/node-18.16.19.tgz","fileCount":125,"unpackedSize":3677153,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrmUK+J0P1ywi+U/RBUqMXSK7c0kDYxMEYunkXNSPf+wIhANTRnqmuKWdzIKhsGHCZB+js8qhLcce/P+XOR1JmSNIc"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"[object Object]","license":"MIT","readmeFilename":"","repository":{"type":"git","url":"https://github.com/DefinitelyTyped/DefinitelyTyped.git","directory":"types/node"},"homepage":"https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node"}
+{
+ "name": "@types/node",
+ "description": "TypeScript definitions for node",
+ "dist-tags": {
+ "latest": "18.8.2"
+ },
+ "versions": {
+ "18.8.2": {
+ "name": "@types/node",
+ "version": "18.8.2",
+ "description": "TypeScript definitions for Node.js",
+ "license": "MIT",
+ "main": "",
+ "types": "index.d.ts",
+ "typesVersions": {
+ "<4.9.0-0": {
+ "*": [
+ "ts4.8/*"
+ ]
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+ "directory": "types/node"
+ },
+ "scripts": {},
+ "dependencies": {},
+ "typesPublisherContentHash": "034172ea945b66afc6502e6be34d6fb957c596091e39cf43672e8aca563a8c66",
+ "typeScriptVersion": "4.1",
+ "_id": "@types/node@18.8.2",
+ "dist": {
+ "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==",
+ "shasum": "17d42c6322d917764dd3d2d3a10d7884925de067",
+ "tarball": "http://localhost:4260/@types/node/node-18.8.2.tgz",
+ "fileCount": 124,
+ "unpackedSize": 3524549
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "18.16.19": {
+ "name": "@types/node",
+ "version": "18.16.19",
+ "description": "TypeScript definitions for Node.js",
+ "license": "MIT",
+ "main": "",
+ "types": "index.d.ts",
+ "typesVersions": {
+ "<=4.8": {
+ "*": [
+ "ts4.8/*"
+ ]
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+ "directory": "types/node"
+ },
+ "scripts": {},
+ "dependencies": {},
+ "typesPublisherContentHash": "e0763594b4075c74150a6024cd39f92797ea5c273540e3a5fe0a63a791ffa0c8",
+ "typeScriptVersion": "4.3",
+ "_id": "@types/node@18.16.19",
+ "dist": {
+ "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==",
+ "shasum": "cb03fca8910fdeb7595b755126a8a78144714eea",
+ "tarball": "http://localhost:4260/@types/node/node-18.16.19.tgz",
+ "fileCount": 125,
+ "unpackedSize": 3677153
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "license": "MIT",
+ "readmeFilename": "",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+ "directory": "types/node"
+ },
+ "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node"
+}
diff --git a/tests/registry/npm/@vue/compiler-core/registry.json b/tests/registry/npm/@vue/compiler-core/registry.json
index 81c0c51e2..7ea5bd5b9 100644
--- a/tests/registry/npm/@vue/compiler-core/registry.json
+++ b/tests/registry/npm/@vue/compiler-core/registry.json
@@ -1 +1,71 @@
-{"name":"@vue/compiler-core","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/compiler-core","version":"3.2.38","description":"@vue/compiler-core","main":"index.js","module":"dist/compiler-core.esm-bundler.js","types":"dist/compiler-core.d.ts","buildOptions":{"name":"VueCompilerCore","compat":true,"formats":["esm-bundler","cjs"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-core"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@babel/parser":"^7.16.4","estree-walker":"^2.0.2","source-map":"^0.6.1"},"devDependencies":{"@babel/types":"^7.16.0"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/compiler-core@3.2.38","dist":{"shasum":"0a2a7bffd2280ac19a96baf5301838a2cf1964d7","integrity":"sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==","tarball":"http://localhost:4260/@vue/compiler-core/compiler-core-3.2.38.tgz","fileCount":10,"unpackedSize":715064,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsKPQqDaQJpXMwojakkgQ7ZTXf6tvF6VB4KgShDmnG/AIgbTYxfqFpVp/k1NCauhoOb6G7hsX86LoqEpPRt9o0mqQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcP6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrTCg//XS9cYJqJY63weci6LoEheFOtFdABVcbWsqg4sdlgTI0RT4qx\r\nJwdKqoRHbtiVVbPFmaCCfg14e4KFSUi4UL1OlhB7TnY7fdJ6L32y/P3+4Mi7\r\nm/SWcmqmZ/pGgrfs5PqPtTgVhgmIGd2qPkSiwbQIrzotvy/LAJXGwRgnU/zY\r\nZ7rl0FYPDh1MVp5gdxN8j0JurbW0GSlminPGEGo97bvgnYaoaLVcDfIp6lpD\r\nmKYP50Fne6QP1ofFmWE0k3DX7EikT9FGy9F+wgHzNCrh+HIJnKOB7RxrJSjH\r\n8a3FpmgB8IEVxqPfbUbgs1vtUCIH5pW8kNU0wEp93ad+4RQWySdcwfkM7QrK\r\nr9lbtgHcPhL5Zod4LVU9eVxz9/48fCyvEK+cMa7Bkjq8UxK4igGawiaz0Taf\r\nX8KWfo4q9bMawfuznXLwUl4k0uBJTuBJAcbXbkw1NS3IxriL1TlOPGzgxnoi\r\nWaZdZ17T23EF+HyFwMv7xL/fPPWi+0ZBI2WJ/qvq6o4lyi3cxKSeSIV0GssI\r\npWxc4pEN+dznoDTGQu4r2YaEq9R1IywlWOy35TOR9QRwLrNAUmUZ6NMA902w\r\nbug9lbp59hojNhjYKLzkbO0SXOUIPlfSWXiQTk8DqkUx/wyZwOp1raTvA0rm\r\nVucJyZfDCUcJniI9Eqgu7t9a1bfakhCQWMw=\r\n=a516\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/compiler-core","homepage":"https://github.com/vuejs/core/tree/main/packages/compiler-core#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-core"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/compiler-core\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/compiler-core",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/compiler-core",
+ "version": "3.2.38",
+ "description": "@vue/compiler-core",
+ "main": "index.js",
+ "module": "dist/compiler-core.esm-bundler.js",
+ "types": "dist/compiler-core.d.ts",
+ "buildOptions": {
+ "name": "VueCompilerCore",
+ "compat": true,
+ "formats": [
+ "esm-bundler",
+ "cjs"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-core"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@babel/parser": "^7.16.4",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ },
+ "devDependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/compiler-core@3.2.38",
+ "dist": {
+ "shasum": "0a2a7bffd2280ac19a96baf5301838a2cf1964d7",
+ "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==",
+ "tarball": "http://localhost:4260/@vue/compiler-core/compiler-core-3.2.38.tgz",
+ "fileCount": 10,
+ "unpackedSize": 715064
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/compiler-core",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-core"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/compiler-dom/registry.json b/tests/registry/npm/@vue/compiler-dom/registry.json
index 1c8f26e5a..84b40e805 100644
--- a/tests/registry/npm/@vue/compiler-dom/registry.json
+++ b/tests/registry/npm/@vue/compiler-dom/registry.json
@@ -1 +1,71 @@
-{"name":"@vue/compiler-dom","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/compiler-dom","version":"3.2.38","description":"@vue/compiler-dom","main":"index.js","module":"dist/compiler-dom.esm-bundler.js","types":"dist/compiler-dom.d.ts","unpkg":"dist/compiler-dom.global.js","jsdelivr":"dist/compiler-dom.global.js","sideEffects":false,"buildOptions":{"name":"VueCompilerDOM","compat":true,"formats":["esm-bundler","esm-browser","cjs","global"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-dom"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@vue/compiler-core":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/compiler-dom@3.2.38","dist":{"shasum":"53d04ed0c0c62d1ef259bf82f9b28100a880b6fd","integrity":"sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==","tarball":"http://localhost:4260/@vue/compiler-dom/compiler-dom-3.2.38.tgz","fileCount":14,"unpackedSize":759600,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2mAYyYXARZ7RbubvapagWysT3wXmdqTbrSWTqw9KA3QIgOWXOYUllQuZbkyrKbvJKZ6QMkRLzwkGQ5HcpU/4gFnM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcP8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoA7BAAiXwXIr6HoY3c70aUrlTuChXxy29bfSEY01vGMhnbirIX09m6\r\nL6KKHDiaGolS3z9f9jlT096Lc5KS30RwOyzxlMNpkhT0v7aFb9t55kFQoDt7\r\nvtXMgqitb6QnNEr82mSt0TZEmhwTIdAoKfxH4vlxgQ+mnyRzjkZll6laf0oY\r\n/QFeiM5e/eeM56Es3Hh7l/YzaBSxbQpzrgdtCYQOkQj3AW2jIqKkkDuzgYd6\r\ntc9Vj1Zon3ANrFEvHFexrLQIG3g6hTLU47XJTwhFh/REXBwo3cM8sSwSYxOD\r\nMtYGZP1flljae4MHsAKvc5AYpqMPPCD2sBPtXYYnrIeJT9sfP4UEPiiySLA0\r\n76r7Fo1LM+ztzHhO9qF650066xcfy5VgUpL4dW8FkLZZG+3b1LrUC5L6G3vJ\r\nTlSQ6JluSUmBSDZw2QhLuZ81RAj+ePZzid+A7mTdj+bv8P6BgnfdwhC7DStf\r\ntNw5pLK88cdeBkY2F4mx7ddV5fB5ro8r92JVL3kIxAjZm/h1tZhuqAterBk0\r\n3zEEzpmgFzsWEg6ZZZtSbMdA608wDwH3CqCDKZW0hMRhdOUajN/YnedVnL4r\r\npqU+xwJm3TtL8nXcJrMUEDBE6KE22JQB4l+fko7fFn3/x2kInSpAG9N89cLx\r\nDACI1LOmo/ZF11abCcX87xzC8xhTmkHOouI=\r\n=jj9S\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/compiler-dom","homepage":"https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-dom"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/compiler-dom","readmeFilename":"README.md"}
+{
+ "name": "@vue/compiler-dom",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/compiler-dom",
+ "version": "3.2.38",
+ "description": "@vue/compiler-dom",
+ "main": "index.js",
+ "module": "dist/compiler-dom.esm-bundler.js",
+ "types": "dist/compiler-dom.d.ts",
+ "unpkg": "dist/compiler-dom.global.js",
+ "jsdelivr": "dist/compiler-dom.global.js",
+ "sideEffects": false,
+ "buildOptions": {
+ "name": "VueCompilerDOM",
+ "compat": true,
+ "formats": [
+ "esm-bundler",
+ "esm-browser",
+ "cjs",
+ "global"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-dom"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/compiler-core": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/compiler-dom@3.2.38",
+ "dist": {
+ "shasum": "53d04ed0c0c62d1ef259bf82f9b28100a880b6fd",
+ "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==",
+ "tarball": "http://localhost:4260/@vue/compiler-dom/compiler-dom-3.2.38.tgz",
+ "fileCount": 14,
+ "unpackedSize": 759600
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/compiler-dom",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-dom"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/compiler-sfc/registry.json b/tests/registry/npm/@vue/compiler-sfc/registry.json
index 2f56e1229..3ac30a4a3 100644
--- a/tests/registry/npm/@vue/compiler-sfc/registry.json
+++ b/tests/registry/npm/@vue/compiler-sfc/registry.json
@@ -1 +1,88 @@
-{"name":"@vue/compiler-sfc","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/compiler-sfc","version":"3.2.38","description":"@vue/compiler-sfc","main":"dist/compiler-sfc.cjs.js","module":"dist/compiler-sfc.esm-browser.js","types":"dist/compiler-sfc.d.ts","buildOptions":{"name":"VueCompilerSFC","formats":["cjs","esm-browser"],"prod":false,"enableNonBrowserBranches":true},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-sfc"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@babel/parser":"^7.16.4","@vue/compiler-core":"3.2.38","@vue/compiler-dom":"3.2.38","@vue/compiler-ssr":"3.2.38","@vue/reactivity-transform":"3.2.38","@vue/shared":"3.2.38","estree-walker":"^2.0.2","magic-string":"^0.25.7","source-map":"^0.6.1","postcss":"^8.1.10"},"devDependencies":{"@types/estree":"^0.0.48","@babel/types":"^7.16.0","@types/lru-cache":"^5.1.0","pug":"^3.0.1","sass":"^1.26.9","@vue/consolidate":"^0.17.3","hash-sum":"^2.0.0","lru-cache":"^5.1.1","merge-source-map":"^1.1.0","postcss-modules":"^4.0.0","postcss-selector-parser":"^6.0.4"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/compiler-sfc@3.2.38","dist":{"shasum":"9e763019471a535eb1fceeaac9d4d18a83f0940f","integrity":"sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==","tarball":"http://localhost:4260/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz","fileCount":8,"unpackedSize":2080509,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDk5/k9sPiRsEXIxkcyK2qEeEBwvOLFL15UTD8bURAS5QIgT/WJ3KfBz3HA0VYwKRwkOtm3dYRO9H5pMcUA6LvJiNk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcP+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/uQ//am1jTR52w+C6oH9kLSHrZGjPlChTzIgSZ0fzMf/j5BJrgfyo\r\nvhA8zhdpbxxs2KREDUiRISUo+ZWKX6LUwT20z9J835YELR6sSwV0wxSmA2Hh\r\nFfVIm4s4XkAqMudfaiCFVdF9qPcBm578Kz1p/WmiCBORKTnVcSc8NlEWYIf4\r\nzfO9ilffFpVvQhTLoDtLG/yAA6s32+mShRFDyuona2fizdU+9kf5RSPP7aOd\r\nKqIBiRU4OmwK5q3CrIFzdOszhLoFqo2qhUhecOAOTzTaOuRAJoqKqWq7UzBb\r\nKnmqIVD77JccQXV41PEMeSJrLq2JsWmvhOfa7ExkotT0K0CAhhZj839NC/q2\r\nDGeKdEmaXyhInOrpSXgD5vktgf+6G/jDxUb9bJyUjPMw2D4yAD1hBzZBCG/j\r\nWZKEhOxlnCKiIGZ++t6uTi4o6GQiwLX2FnBXkJIEi9NJj3+0LstgDT1EZFK3\r\nFl/8gy6k3bDCCVefZzsUBCaPDaVBQHeHI/NwUNTT/YGnPl30gi7Bqi3ApWQl\r\nETIRb88BzcpH58Ml9DpnnOCsEkFe6CJ2B+ZYKhUXmhQDYaexSBS53TizuMAO\r\n+poMrYP1XV3eLVlIbWGYYmdGT/sPa9nKFiUgM1d5Lla6BeqZrlfuYori+KYz\r\nefaLCjXPNtbKcBTDxbq4Pv7hCQwb2UbK83o=\r\n=uME4\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/compiler-sfc","homepage":"https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-sfc"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/compiler-sfc\n\n> Lower level utilities for compiling Vue Single File Components\n\n**Note: as of 3.2.13+, this package is included as a dependency of the main `vue` package and can be accessed as `vue/compiler-sfc`. This means you no longer need to explicitly install this package and ensure its version match that of `vue`'s. Just use the main `vue/compiler-sfc` deep import instead.**\n\nThis package contains lower level utilities that you can use if you are writing a plugin / transform for a bundler or module system that compiles Vue Single File Components (SFCs) into JavaScript. It is used in [vue-loader](https://github.com/vuejs/vue-loader), [rollup-plugin-vue](https://github.com/vuejs/rollup-plugin-vue) and [vite](https://github.com/vitejs/vite).\n\n## API\n\nThe API is intentionally low-level due to the various considerations when integrating Vue SFCs in a build system:\n\n- Separate hot-module replacement (HMR) for script, template and styles\n\n - template updates should not reset component state\n - style updates should be performed without component re-render\n\n- Leveraging the tool's plugin system for pre-processor handling. e.g. `<style lang=\"scss\">` should be processed by the corresponding webpack loader.\n\n- In some cases, transformers of each block in an SFC do not share the same execution context. For example, when used with `thread-loader` or other parallelized configurations, the template sub-loader in `vue-loader` may not have access to the full SFC and its descriptor.\n\nThe general idea is to generate a facade module that imports the individual blocks of the component. The trick is the module imports itself with different query strings so that the build system can handle each request as \"virtual\" modules:\n\n```\n +--------------------+\n | |\n | script transform |\n +----->+ |\n | +--------------------+\n |\n+--------------------+ | +--------------------+\n| | | | |\n| facade transform +----------->+ template transform |\n| | | | |\n+--------------------+ | +--------------------+\n |\n | +--------------------+\n +----->+ |\n | style transform |\n | |\n +--------------------+\n```\n\nWhere the facade module looks like this:\n\n```js\n// main script\nimport script from '/project/foo.vue?vue&type=script'\n// template compiled to render function\nimport { render } from '/project/foo.vue?vue&type=template&id=xxxxxx'\n// css\nimport '/project/foo.vue?vue&type=style&index=0&id=xxxxxx'\n\n// attach render function to script\nscript.render = render\n\n// attach additional metadata\n// some of these should be dev only\nscript.__file = 'example.vue'\nscript.__scopeId = 'xxxxxx'\n\n// additional tooling-specific HMR handling code\n// using __VUE_HMR_API__ global\n\nexport default script\n```\n\n### High Level Workflow\n\n1. In facade transform, parse the source into descriptor with the `parse` API and generate the above facade module code based on the descriptor;\n\n2. In script transform, use `compileScript` to process the script. This handles features like `<script setup>` and CSS variable injection. Alternatively, this can be done directly in the facade module (with the code inlined instead of imported), but it will require rewriting `export default` to a temp variable (a `rewriteDefault` convenience API is provided for this purpose) so additional options can be attached to the exported object.\n\n3. In template transform, use `compileTemplate` to compile the raw template into render function code.\n\n4. In style transform, use `compileStyle` to compile raw CSS to handle `<style scoped>`, `<style module>` and CSS variable injection.\n\nOptions needed for these APIs can be passed via the query string.\n\nFor detailed API references and options, check out the source type definitions. For actual usage of these APIs, check out [rollup-plugin-vue](https://github.com/vuejs/rollup-plugin-vue/tree/next) or [vue-loader](https://github.com/vuejs/vue-loader/tree/next).\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/compiler-sfc",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/compiler-sfc",
+ "version": "3.2.38",
+ "description": "@vue/compiler-sfc",
+ "main": "dist/compiler-sfc.cjs.js",
+ "module": "dist/compiler-sfc.esm-browser.js",
+ "types": "dist/compiler-sfc.d.ts",
+ "buildOptions": {
+ "name": "VueCompilerSFC",
+ "formats": [
+ "cjs",
+ "esm-browser"
+ ],
+ "prod": false,
+ "enableNonBrowserBranches": true
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-sfc"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.38",
+ "@vue/compiler-dom": "3.2.38",
+ "@vue/compiler-ssr": "3.2.38",
+ "@vue/reactivity-transform": "3.2.38",
+ "@vue/shared": "3.2.38",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7",
+ "source-map": "^0.6.1",
+ "postcss": "^8.1.10"
+ },
+ "devDependencies": {
+ "@types/estree": "^0.0.48",
+ "@babel/types": "^7.16.0",
+ "@types/lru-cache": "^5.1.0",
+ "pug": "^3.0.1",
+ "sass": "^1.26.9",
+ "@vue/consolidate": "^0.17.3",
+ "hash-sum": "^2.0.0",
+ "lru-cache": "^5.1.1",
+ "merge-source-map": "^1.1.0",
+ "postcss-modules": "^4.0.0",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/compiler-sfc@3.2.38",
+ "dist": {
+ "shasum": "9e763019471a535eb1fceeaac9d4d18a83f0940f",
+ "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==",
+ "tarball": "http://localhost:4260/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz",
+ "fileCount": 8,
+ "unpackedSize": 2080509
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/compiler-sfc",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-sfc"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/compiler-ssr/registry.json b/tests/registry/npm/@vue/compiler-ssr/registry.json
index 99c7385c6..71e565821 100644
--- a/tests/registry/npm/@vue/compiler-ssr/registry.json
+++ b/tests/registry/npm/@vue/compiler-ssr/registry.json
@@ -1 +1,63 @@
-{"name":"@vue/compiler-ssr","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/compiler-ssr","version":"3.2.38","description":"@vue/compiler-ssr","main":"dist/compiler-ssr.cjs.js","types":"dist/compiler-ssr.d.ts","buildOptions":{"prod":false,"formats":["cjs"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-ssr"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@vue/compiler-dom":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/compiler-ssr@3.2.38","dist":{"shasum":"933b23bf99e667e5078eefc6ba94cb95fd765dfe","integrity":"sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==","tarball":"http://localhost:4260/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz","fileCount":7,"unpackedSize":59102,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqxg+GCJYYXhgjctNi0CqD7HyFF+ROUQkHCN1K7DyHYwIgcmZkY/RHCHh8T+KLbfKrj03YHJv1U2fDxlzD4dqjE1k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmreRxAAlJ2/Sf4PNqEqtRrceye4bfiW3i/IREEovJX2MLOo0BMaARGs\r\nlMkj0sZKBSuJCqYLtGTdgog+iSbsep2keBG65bxKBKjOn5vo6e0+sI15ca63\r\nQIuQGlFn4NAXRvmlkE1I2cPnE1iFog9H4oF2uHRQsj5B//WlJJgVxIXuNet5\r\n5v8ckJf5YP6YdBzQFkhRu7AgL72U/NmfXe+hT1sjBy0J93/lJqNaUrau+I43\r\nMB4DeaBA5Pa4ltVJjbE9x23OYf/Tk3a0tmUcpx1BZKv4NAC8GZ70EmcsTY7l\r\nqKZkMfzG+tr1aqTVmyqyNqiiNO6TkAPrfFAy6tlM0bfNfWyxK529mU5HthPU\r\nhFuHueU2MPE+WLVe4MPaZmDTfc443SPOW0dwUhScaV12hePSNmaTDLnATSNc\r\nD1iwvSiJPtzKmNBTRY6YoM3/b9KEQV5GablefZavLJLVJixmP8BTtK9r6g9A\r\nr41aN7BNx1yG3nZQM0e3S2rnV9mr9ZuIKb3N8PN/9Ycedxp9nuCXd3SeKa8j\r\nQKdb6jLNL9sge/Y8L+NgbgokdRxCHQdQ7jxSZw7e3Ej38aSzTj7HJizn2UgG\r\nhk77xwHfNlBxtHp97Hs7VvcTxCTauwFzICcFp7ODH9euq6ZFJuIWUvVso6c0\r\ntFHs5ClTMuIAbuLyJRyiqsyHm0fpkbcZ1HQ=\r\n=Acde\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/compiler-ssr","homepage":"https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/compiler-ssr"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/compiler-ssr","readmeFilename":"README.md"}
+{
+ "name": "@vue/compiler-ssr",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/compiler-ssr",
+ "version": "3.2.38",
+ "description": "@vue/compiler-ssr",
+ "main": "dist/compiler-ssr.cjs.js",
+ "types": "dist/compiler-ssr.d.ts",
+ "buildOptions": {
+ "prod": false,
+ "formats": [
+ "cjs"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-ssr"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/compiler-dom": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/compiler-ssr@3.2.38",
+ "dist": {
+ "shasum": "933b23bf99e667e5078eefc6ba94cb95fd765dfe",
+ "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==",
+ "tarball": "http://localhost:4260/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz",
+ "fileCount": 7,
+ "unpackedSize": 59102
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/compiler-ssr",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/compiler-ssr"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/reactivity-transform/registry.json b/tests/registry/npm/@vue/reactivity-transform/registry.json
index e1ead1c00..1d32e4120 100644
--- a/tests/registry/npm/@vue/reactivity-transform/registry.json
+++ b/tests/registry/npm/@vue/reactivity-transform/registry.json
@@ -1 +1,70 @@
-{"name":"@vue/reactivity-transform","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/reactivity-transform","version":"3.2.38","description":"@vue/reactivity-transform","main":"dist/reactivity-transform.cjs.js","buildOptions":{"formats":["cjs"],"prod":false},"types":"dist/reactivity-transform.d.ts","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/reactivity-transform"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@babel/parser":"^7.16.4","@vue/compiler-core":"3.2.38","@vue/shared":"3.2.38","estree-walker":"^2.0.2","magic-string":"^0.25.7"},"devDependencies":{"@babel/core":"^7.16.0","@babel/types":"^7.16.0"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/reactivity-transform@3.2.38","dist":{"shasum":"a856c217b2ead99eefb6fddb1d61119b2cb67984","integrity":"sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==","tarball":"http://localhost:4260/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz","fileCount":7,"unpackedSize":27932,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDakLqeNSGQjKBB/vOqgoXVtdzQeMvPlVfcvl7L4q/7FQIhAKIya/6uNljjlCXYXL1mYtD0IKgT0O5nz/CoJl9X+rv3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqOlQ//WzyJG05nw3a2R5FO0wwuaJr+QgPuXZ5C4cUcla7pXDq+lG2B\r\n54PLZIkBvvCOfC9RuH83LGxjWydcAZof8tbHF07Pqw5hI4JKVtw/oMjXBInG\r\nlsb50SfJqOtWTjfiWpMbHTklO5wijAmF4CnBN8/Z0t9kg3penW0a7XAZpZBp\r\nHqkhhd8kf2msXn7PzF9y+KNEQYwYlqhjSZo5wMv9agicJ+J9L1itoE/L2ql8\r\nmj+ea385lkn/KkZBud/Y9QoVantPCconf7cWwhskbkcjGoloWvp4OG+ppAkC\r\nKBJjSFBjWKDEaqzhPsdQ7o3XOElsNH1mhpqhfJ7gG/4DcZIW4JFQxl792H5N\r\nOT/julZPI2xp3h5cJ+CWVFo7OQDDF79h5nlPOqtjYgnSPdbkWE8PeQiSMEiT\r\nvvD1s+ozx1HvMUK2HzU/DRvTrRAGmbm8S7xpf5fulczUmx/BqkecdTn7NvRG\r\nX2wLzebFtukAjs7IbDiaPOo7bN8fxKcelRMR41dQWjUdFYFpZ6ceg4IyIrI1\r\nPlf+X/AQe6d7TzTx6/sh7qbfp38X1b6pLXaLevZTvzzrUkB9lJbxv1gpaLbH\r\nJFBr48TE/bx8kThEHR4Cr2u+b03ojqUrQ7GmkoDHQJSy6uT8u1YNC5NbUCy9\r\ncgs9aOgKIuN4kAT4GZhaoaDCnNzahdUy1QA=\r\n=Pp3l\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/reactivity-transform","homepage":"https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/reactivity-transform"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/reactivity-transform\n\n> ⚠️ This is experimental and currently only provided for testing and feedback. It may break during patches or even be removed. Use at your own risk!\n>\n> Follow https://github.com/vuejs/rfcs/discussions/369 for details and updates.\n\n## Basic Rules\n\n- Ref-creating APIs have `$`-prefixed versions that create reactive variables instead. They also do not need to be explicitly imported. These include:\n - `ref`\n - `computed`\n - `shallowRef`\n - `customRef`\n - `toRef`\n- `$()` can be used to destructure an object into reactive variables, or turn existing refs into reactive variables\n- `$$()` to \"escape\" the transform, which allows access to underlying refs\n\n```js\nimport { watchEffect } from 'vue'\n\n// bind ref as a variable\nlet count = $ref(0)\n\nwatchEffect(() => {\n // no need for .value\n console.log(count)\n})\n\n// assignments are reactive\ncount++\n\n// get the actual ref\nconsole.log($$(count)) // { value: 1 }\n```\n\nMacros can be optionally imported to make it more explicit:\n\n```js\n// not necessary, but also works\nimport { $, $ref } from 'vue/macros'\n\nlet count = $ref(0)\nconst { x, y } = $(useMouse())\n```\n\n### Global Types\n\nTo enable types for the macros globally, include the following in a `.d.ts` file:\n\n```ts\n/// <reference types=\"vue/macros-global\" />\n```\n\n## API\n\nThis package is the lower-level transform that can be used standalone. Higher-level tooling (e.g. `@vitejs/plugin-vue` and `vue-loader`) will provide integration via options.\n\n### `shouldTransform`\n\nCan be used to do a cheap check to determine whether full transform should be performed.\n\n```js\nimport { shouldTransform } from '@vue/reactivity-transform'\n\nshouldTransform(`let a = ref(0)`) // false\nshouldTransform(`let a = $ref(0)`) // true\n```\n\n### `transform`\n\n```js\nimport { transform } from '@vue/reactivity-transform'\n\nconst src = `let a = $ref(0); a++`\nconst {\n code, // import { ref as _ref } from 'vue'; let a = (ref(0)); a.value++\"\n map\n} = transform(src, {\n filename: 'foo.ts',\n sourceMap: true,\n\n // @babel/parser plugins to enable.\n // 'typescript' and 'jsx' will be auto-inferred from filename if provided,\n // so in most cases explicit parserPlugins are not necessary\n parserPlugins: [\n /* ... */\n ]\n})\n```\n\n**Options**\n\n```ts\ninterface RefTransformOptions {\n filename?: string\n sourceMap?: boolean // default: false\n parserPlugins?: ParserPlugin[]\n importHelpersFrom?: string // default: \"vue\"\n}\n```\n\n### `transformAST`\n\nTransform with an existing Babel AST + MagicString instance. This is used internally by `@vue/compiler-sfc` to avoid double parse/transform cost.\n\n```js\nimport { transformAST } from '@vue/reactivity-transform'\nimport { parse } from '@babel/parser'\nimport MagicString from 'magic-string'\n\nconst src = `let a = $ref(0); a++`\nconst ast = parse(src, { sourceType: 'module' })\nconst s = new MagicString(src)\n\nconst {\n rootRefs, // ['a']\n importedHelpers // ['ref']\n} = transformAST(ast, s)\n\nconsole.log(s.toString()) // let a = _ref(0); a.value++\n```\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/reactivity-transform",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/reactivity-transform",
+ "version": "3.2.38",
+ "description": "@vue/reactivity-transform",
+ "main": "dist/reactivity-transform.cjs.js",
+ "buildOptions": {
+ "formats": [
+ "cjs"
+ ],
+ "prod": false
+ },
+ "types": "dist/reactivity-transform.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/reactivity-transform"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.38",
+ "@vue/shared": "3.2.38",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/reactivity-transform@3.2.38",
+ "dist": {
+ "shasum": "a856c217b2ead99eefb6fddb1d61119b2cb67984",
+ "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==",
+ "tarball": "http://localhost:4260/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz",
+ "fileCount": 7,
+ "unpackedSize": 27932
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/reactivity-transform",
+ "homepage": "https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/reactivity-transform"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/reactivity/registry.json b/tests/registry/npm/@vue/reactivity/registry.json
index cfe5dacbc..36f79f9eb 100644
--- a/tests/registry/npm/@vue/reactivity/registry.json
+++ b/tests/registry/npm/@vue/reactivity/registry.json
@@ -1 +1,69 @@
-{"name":"@vue/reactivity","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/reactivity","version":"3.2.38","description":"@vue/reactivity","main":"index.js","module":"dist/reactivity.esm-bundler.js","types":"dist/reactivity.d.ts","unpkg":"dist/reactivity.global.js","jsdelivr":"dist/reactivity.global.js","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/reactivity"},"buildOptions":{"name":"VueReactivity","formats":["esm-bundler","esm-browser","cjs","global"]},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/reactivity@3.2.38","dist":{"shasum":"d576fdcea98eefb96a1f1ad456e289263e87292e","integrity":"sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==","tarball":"http://localhost:4260/@vue/reactivity/reactivity-3.2.38.tgz","fileCount":14,"unpackedSize":256441,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGjXKtbFw5GFEJUx7yauUNNEU+7trdHVUUCW5h8zp0zPAiBqVHk+h01y95B5GMrjLBA/JqU0zeT+//QDemC5Yje2+w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoupBAAhSMINO260uaJw8e4LbyQFimz+mZQUZJebuUXA7K5TjdUzSfV\r\nljck7t/TboLEa0xFqcTTlzWDq+f7P1hnIm8i/2w0s0xfQF50Lov/vOdbj+l0\r\nkUXEmXiwpP8LkzCDSQgw0qBEmitplGYMYdyfh8yC6cTgGgmqWZ6kMr/lkzY0\r\ngrhlUy6b+2YSGWs6pv+bwzaeEX7nMS7ya30uVDL5Ygbow5I+DOcosKNUmGho\r\nQzEL2qjr8KR8VzkJ9huKOXI11z8UDPNqzaTHtvqM2YnpGJ1GFHPJs9kpHXhe\r\nI9dfpcETG+zF4iHX4uTdTl+Qdz5VaXRV9Ho+yRuK6wdryy0zZuBlSi1MOq2E\r\nr19+R5pAn9D64+i2U3/pNeUtVHNAPcCai1nzUUWfyunggM1Qmjd0a/yP+FR+\r\nEotETP5WYAkrHrzy3m9wU4tNtWAP3GMl7YWvPxszPnqv+oixvQZRdLBN/YSi\r\n1eYO9Eb21mRZ9VC5aK6x0rAoIETNvvjYRbhVlHiDKmg9VEX6RVBAkSj7n3ze\r\nSOVEWswG2yoQPMUqo8tn6UY56oFs7/3nD2LeiaqxIt/JbnSO9jv3uYE0KSVp\r\naEaXrYrfmF/crijEDaDCnHpXG7TVFhyLPfxfWztCglLtpfuzRXz0PynCoPVq\r\nbc70K661tPiMkHaPUoB0/CQ2Sazwc9bWXqU=\r\n=UewE\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/reactivity","homepage":"https://github.com/vuejs/core/tree/main/packages/reactivity#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/reactivity"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/reactivity\n\n## Usage Note\n\nThis package is inlined into Global & Browser ESM builds of user-facing renderers (e.g. `@vue/runtime-dom`), but also published as a package that can be used standalone. The standalone build should not be used alongside a pre-bundled build of a user-facing renderer, as they will have different internal storage for reactivity connections. A user-facing renderer should re-export all APIs from this package.\n\nFor full exposed APIs, see `src/index.ts`. You can also run `yarn build reactivity --types` from repo root, which will generate an API report at `temp/reactivity.api.md`.\n\n## Credits\n\nThe implementation of this module is inspired by the following prior art in the JavaScript ecosystem:\n\n- [Meteor Tracker](https://docs.meteor.com/api/tracker.html)\n- [nx-js/observer-util](https://github.com/nx-js/observer-util)\n- [salesforce/observable-membrane](https://github.com/salesforce/observable-membrane)\n\n## Caveats\n\n- Built-in objects are not observed except for `Array`, `Map`, `WeakMap`, `Set` and `WeakSet`.\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/reactivity",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/reactivity",
+ "version": "3.2.38",
+ "description": "@vue/reactivity",
+ "main": "index.js",
+ "module": "dist/reactivity.esm-bundler.js",
+ "types": "dist/reactivity.d.ts",
+ "unpkg": "dist/reactivity.global.js",
+ "jsdelivr": "dist/reactivity.global.js",
+ "sideEffects": false,
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/reactivity"
+ },
+ "buildOptions": {
+ "name": "VueReactivity",
+ "formats": [
+ "esm-bundler",
+ "esm-browser",
+ "cjs",
+ "global"
+ ]
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/reactivity@3.2.38",
+ "dist": {
+ "shasum": "d576fdcea98eefb96a1f1ad456e289263e87292e",
+ "integrity": "sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==",
+ "tarball": "http://localhost:4260/@vue/reactivity/reactivity-3.2.38.tgz",
+ "fileCount": 14,
+ "unpackedSize": 256441
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/reactivity",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/reactivity#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/reactivity"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/runtime-core/registry.json b/tests/registry/npm/@vue/runtime-core/registry.json
index 9e0153aff..e5373e068 100644
--- a/tests/registry/npm/@vue/runtime-core/registry.json
+++ b/tests/registry/npm/@vue/runtime-core/registry.json
@@ -1 +1,66 @@
-{"name":"@vue/runtime-core","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/runtime-core","version":"3.2.38","description":"@vue/runtime-core","main":"index.js","module":"dist/runtime-core.esm-bundler.js","types":"dist/runtime-core.d.ts","buildOptions":{"name":"VueRuntimeCore","formats":["esm-bundler","cjs"]},"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/runtime-core"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@vue/reactivity":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/runtime-core@3.2.38","dist":{"shasum":"d19cf591c210713f80e6a94ffbfef307c27aea06","integrity":"sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==","tarball":"http://localhost:4260/@vue/runtime-core/runtime-core-3.2.38.tgz","fileCount":10,"unpackedSize":970208,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAsm2fdycDen1D3Wd8ZPtR67JJQJZfaSTcps7rJX78QpAiBJrJX1bieuvtPZ+aFOTS+yVOKCkQLIMt4ny7cmnVfA+Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmquLBAAki+4cRmnCjxu73uzrK0Ip3v/I+K+PJFdjvHvUiz5SbUNRu69\r\njWSr89Jkt0vlpLGbHVnR44eO9CCnu2UhbwZEWiX259fJhzfqpdCoNruc4bTx\r\nW46dxK29Zm29mayIljFyk4jwED8UpVBXRCHSuRVfNSxmaGCDl4fAa4XUdDvR\r\nW0tneO+QzQ39eyaK4aJepm8yw4Ce5UA9f7MzNkwbVwAQaPEgInEjfK9JUSdq\r\n82OfNR3PgCfRCdlmiwWEfHKxbnni1/hAgRlTQ+ZPGPzcWTwz6ms2Hi0U/6I3\r\nAHgedcHIVfJhqp0O/XPahRB8jHLBHxARJAyfTg3qaqpjA237hVfUrgf5x2e1\r\n8UvDQvmOUMN6izpnjXUF5YrYL97Cej6NMx2g7qKLMjBNjqsd19rVPRT4xYAd\r\nrIHkkxgPy+6FTcdT2/U9BNe/ho/4i/oZvUsQf6DlycbCwz7wSiwYOsMCO//m\r\nFDLXfCemZhzWAke20R9NPX2XSf32cS6X7L6VWJZTp3XM0f7P23AkMOJ8FITH\r\nFoNCjKc4USZAgGAXDW3Y1/SrMi5l5/0hh/iyL51JUxKtx6qOtfUNDB5U8gE7\r\n63422kdL4tIa2JxzOxi9v60Wq5ihsWL0OYG1OhU+RyxvyJ9RCc7cwsAIWUls\r\nGdPESmDYHRPIK1c1VthCoIlUL3Ocz/AsHP0=\r\n=r/jL\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/runtime-core","homepage":"https://github.com/vuejs/core/tree/main/packages/runtime-core#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/runtime-core"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/runtime-core\n\n> This package is published only for typing and building custom renderers. It is NOT meant to be used in applications.\n\nFor full exposed APIs, see `src/index.ts`. You can also run `yarn build runtime-core --types` from repo root, which will generate an API report at `temp/runtime-core.api.md`.\n\n## Building a Custom Renderer\n\n``` ts\nimport { createRenderer } from '@vue/runtime-core'\n\nconst { render, createApp } = createRenderer({\n patchProp,\n insert,\n remove,\n createElement,\n // ...\n})\n\n// `render` is the low-level API\n// `createApp` returns an app instance with configurable context shared\n// by the entire app tree.\nexport { render, createApp }\n\nexport * from '@vue/runtime-core'\n```\n\nSee `@vue/runtime-dom` for how a DOM-targeting renderer is implemented.\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/runtime-core",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/runtime-core",
+ "version": "3.2.38",
+ "description": "@vue/runtime-core",
+ "main": "index.js",
+ "module": "dist/runtime-core.esm-bundler.js",
+ "types": "dist/runtime-core.d.ts",
+ "buildOptions": {
+ "name": "VueRuntimeCore",
+ "formats": [
+ "esm-bundler",
+ "cjs"
+ ]
+ },
+ "sideEffects": false,
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/runtime-core"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/reactivity": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/runtime-core@3.2.38",
+ "dist": {
+ "shasum": "d19cf591c210713f80e6a94ffbfef307c27aea06",
+ "integrity": "sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==",
+ "tarball": "http://localhost:4260/@vue/runtime-core/runtime-core-3.2.38.tgz",
+ "fileCount": 10,
+ "unpackedSize": 970208
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/runtime-core",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-core#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/runtime-core"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/runtime-dom/registry.json b/tests/registry/npm/@vue/runtime-dom/registry.json
index b3e039112..cc58c4096 100644
--- a/tests/registry/npm/@vue/runtime-dom/registry.json
+++ b/tests/registry/npm/@vue/runtime-dom/registry.json
@@ -1 +1,70 @@
-{"name":"@vue/runtime-dom","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/runtime-dom","version":"3.2.38","description":"@vue/runtime-dom","main":"index.js","module":"dist/runtime-dom.esm-bundler.js","types":"dist/runtime-dom.d.ts","unpkg":"dist/runtime-dom.global.js","sideEffects":false,"buildOptions":{"name":"VueRuntimeDOM","formats":["esm-bundler","esm-browser","cjs","global"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/runtime-dom"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@vue/runtime-core":"3.2.38","csstype":"^2.6.8"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/runtime-dom@3.2.38","dist":{"shasum":"fec711f65c2485991289fd4798780aa506469b48","integrity":"sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==","tarball":"http://localhost:4260/@vue/runtime-dom/runtime-dom-3.2.38.tgz","fileCount":14,"unpackedSize":1250453,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1eMnhXeJ+afQc7VLgHuFpWdYRlvG2R094UfHpEzjXJAIgb+3BxS4+Lmf2VCwUzIw0XUKCgcnNR5mkJd7Ja5N4UmI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo1Mg//VkjTj1VV/xfXsi2PVOzFEj8UWdolObbEdNTIEiqOxruLiZyz\r\nKwq0A7OoYgwM2dXr8BlUI76gBbvXuzi9bY7cn+wkqlJcvU9BOFyEGEJCM8U1\r\nZcVsBy1w9IZ79V8GUehvdl63phIJnzoAw5aUIjv7rA24KiRFt/Yr8VES9IgO\r\nT3xYrXxGRx6cUzmmUpfStmTzx+sjf/tiRqC3kApr8jkRLdUSazMHBSYMGSm0\r\nKWuSStgiCcLZD9egMp/g6BM/cQYHq7rIrKjXagHgjKcnUqB1tYmrGHtLr3jZ\r\nUxIHQ+rItTzF2G6i/wsVibx3oF1aGRhq4ApdWsYzptpthXu2Wk+dbkl8r48x\r\nTWjq8RUUci2uhkDcqzT5QlwdhzpPRWMfd1KQaByZtQkHmA16HpQcARDA0x8J\r\nTk2djjN2WB0jcAoyAzaYCMAcfu7YbMT9CWOfrdZcbhqjBIWJ8VIAa6NaN4Qi\r\nGs2y/RxqhcEk00OZrFs/AytxVENQ9j9YIdx/UUyjyQLiMeLH99QVPmKukl7w\r\nCN7zjazngpV2nwFbOT7DGeN/lAG9Kfrocm7mA6N6GNpEIAF+0QBJaBD0tK7t\r\nHIpaoy+0T9RpIruRyVZ5CkSr6CuIaJ2dU+jeZBWlrLJtecZc9TzQTihvmmhU\r\nNum8JNKJ5put4EgjX0TKxDNC9gmuz9dxCGs=\r\n=HG4h\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/runtime-dom","homepage":"https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/runtime-dom"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/runtime-dom\n\n``` js\nimport { h, createApp } from '@vue/runtime-dom'\n\nconst RootComponent = {\n render() {\n return h('div', 'hello world')\n }\n}\n\ncreateApp(RootComponent).mount('#app')\n```\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/runtime-dom",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/runtime-dom",
+ "version": "3.2.38",
+ "description": "@vue/runtime-dom",
+ "main": "index.js",
+ "module": "dist/runtime-dom.esm-bundler.js",
+ "types": "dist/runtime-dom.d.ts",
+ "unpkg": "dist/runtime-dom.global.js",
+ "sideEffects": false,
+ "buildOptions": {
+ "name": "VueRuntimeDOM",
+ "formats": [
+ "esm-bundler",
+ "esm-browser",
+ "cjs",
+ "global"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/runtime-dom"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/runtime-core": "3.2.38",
+ "csstype": "^2.6.8"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/runtime-dom@3.2.38",
+ "dist": {
+ "shasum": "fec711f65c2485991289fd4798780aa506469b48",
+ "integrity": "sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==",
+ "tarball": "http://localhost:4260/@vue/runtime-dom/runtime-dom-3.2.38.tgz",
+ "fileCount": 14,
+ "unpackedSize": 1250453
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/runtime-dom",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/runtime-dom"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/server-renderer/registry.json b/tests/registry/npm/@vue/server-renderer/registry.json
index 9af8f0078..2949b7c41 100644
--- a/tests/registry/npm/@vue/server-renderer/registry.json
+++ b/tests/registry/npm/@vue/server-renderer/registry.json
@@ -1 +1,69 @@
-{"name":"@vue/server-renderer","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/server-renderer","version":"3.2.38","description":"@vue/server-renderer","main":"index.js","module":"dist/server-renderer.esm-bundler.js","types":"dist/server-renderer.d.ts","buildOptions":{"name":"VueServerRenderer","formats":["esm-bundler","esm-browser","cjs"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/server-renderer"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"peerDependencies":{"vue":"3.2.38"},"dependencies":{"@vue/shared":"3.2.38","@vue/compiler-ssr":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/server-renderer@3.2.38","dist":{"shasum":"01a4c0f218e90b8ad1815074208a1974ded109aa","integrity":"sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==","tarball":"http://localhost:4260/@vue/server-renderer/server-renderer-3.2.38.tgz","fileCount":12,"unpackedSize":474625,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF368bdzHuiL41rI7IkZWTqNUwNUYXy0W6vHkq1Vbc0dAiEAv7Ch3w/7I7kZqbBxtwLne/0VEaEoxk4aYPqCruGvw4Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVqg/9HnGhSNPuKtyRo6W9ZUn/iVPP7CN6AqwAJt1OX08iWfOJkEbu\r\nvB7kOt8TNJCW/PMTkvtIN8E02RYTw2I8WFNCol0Cibov7CbtzAlk96+ABZ/+\r\nPOaLwiFtDHZ4/x/IiFyqc4CCh3ztlEGUhRVF+8v5tuR2+I0a3jfhfP5fcqce\r\nupDMn9RITm5fZlEMYD/7zpiknHbAbLwaDMaB05V0ntKt8aVCspRNdcMHXxCu\r\nGmJnV5igbUUF9UTWHKGgjW4CLvyFd+VvSRjYHtGLSCG0SsEutCkB8FDzz+9m\r\nJRxqSlftB+44N7A3pJFMocsuSKTELt88k5XD0yfkUKpa7v70gpatcsYHYScu\r\nvG6+XXlX4XMEqS583UOV1apAfE3fLZAGUXp/xByP0f7WXYBzX7tcqOZgMRGR\r\nRxUcL1sabP0m/oAQNajjYI+ZirvaCewPpjWVBaIDqZutRuI178UkVxFQ13cF\r\nazq4J1I6qzZrazLY4WeSWnpr0OcktV/hh0BE9W1YCHg/BnmQJsTzNTtb24ij\r\nRLE/cs27R5ek4TtP6MBRk+fFBoDdOYFWbSMXuFySUsG26k/blg5bzUGJiPgG\r\n9jderxZOtLoy9uaBnVM0qHc/AShFqnv7soZL43dFnDS5pYj4JSbnFnrK6kqc\r\noy/+tGlDtyrZyJ+48AGTTM30Mp0qaHG5u2k=\r\n=Ii5d\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"@vue/server-renderer","homepage":"https://github.com/vuejs/core/tree/main/packages/server-renderer#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/server-renderer"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/server-renderer\n\n**Note: as of 3.2.13+, this package is included as a dependency of the main `vue` package and can be accessed as `vue/server-renderer`. This means you no longer need to explicitly install this package and ensure its version match that of `vue`'s. Just use the `vue/server-renderer` deep import instead.**\n\n## Basic API\n\n### `renderToString`\n\n**Signature**\n\n```ts\nfunction renderToString(\n input: App | VNode,\n context?: SSRContext\n): Promise<string>\n```\n\n**Usage**\n\n```js\nconst { createSSRApp } = require('vue')\nconst { renderToString } = require('@vue/server-renderer')\n\nconst app = createSSRApp({\n data: () => ({ msg: 'hello' }),\n template: `<div>{{ msg }}</div>`\n})\n\n;(async () => {\n const html = await renderToString(app)\n console.log(html)\n})()\n```\n\n### Handling Teleports\n\nIf the rendered app contains teleports, the teleported content will not be part of the rendered string. Instead, they are exposed under the `teleports` property of the ssr context object:\n\n```js\nconst ctx = {}\nconst html = await renderToString(app, ctx)\n\nconsole.log(ctx.teleports) // { '#teleported': 'teleported content' }\n```\n\n## Streaming API\n\n### `renderToNodeStream`\n\nRenders input as a [Node.js Readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable).\n\n**Signature**\n\n```ts\nfunction renderToNodeStream(input: App | VNode, context?: SSRContext): Readable\n```\n\n**Usage**\n\n```js\n// inside a Node.js http handler\nrenderToNodeStream(app).pipe(res)\n```\n\n**Note:** This method is not supported in the ESM build of `@vue/server-renderer`, which is decoupled from Node.js environments. Use `pipeToNodeWritable` instead.\n\n### `pipeToNodeWritable`\n\nRender and pipe to an existing [Node.js Writable stream](https://nodejs.org/api/stream.html#stream_writable_streams) instance.\n\n**Signature**\n\n```ts\nfunction pipeToNodeWritable(\n input: App | VNode,\n context: SSRContext = {},\n writable: Writable\n): void\n```\n\n**Usage**\n\n```js\n// inside a Node.js http handler\npipeToNodeWritable(app, {}, res)\n```\n\n### `renderToWebStream`\n\nRenders input as a [Web ReadableStream](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API).\n\n**Signature**\n\n```ts\nfunction renderToWebStream(\n input: App | VNode,\n context?: SSRContext\n): ReadableStream\n```\n\n**Usage**\n\n```js\n// inside an environment with ReadableStream support\nreturn new Response(renderToWebStream(app))\n```\n\n**Note:** in environments that do not expose `ReadableStream` constructor in the global scope, `pipeToWebWritable` should be used instead.\n\n### `pipeToWebWritable`\n\nRender and pipe to an existing [Web WritableStream](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream) instance.\n\n**Signature**\n\n```ts\nfunction pipeToWebWritable(\n input: App | VNode,\n context: SSRContext = {},\n writable: WritableStream\n): void\n```\n\n**Usage**\n\nThis is typically used in combination with [`TransformStream`](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream):\n\n```js\n// TransformStream is available in environments such as CloudFlare workers.\n// in Node.js, TransformStream needs to be explicitly imported from 'stream/web'\nconst { readable, writable } = new TransformStream()\npipeToWebWritable(app, {}, writable)\n\nreturn new Response(readable)\n```\n\n### `renderToSimpleStream`\n\nRenders input in streaming mode using a simple readable interface.\n\n**Signature**\n\n```ts\nfunction renderToSimpleStream(\n input: App | VNode,\n context: SSRContext,\n options: SimpleReadable\n): SimpleReadable\n\ninterface SimpleReadable {\n push(content: string | null): void\n destroy(err: any): void\n}\n```\n\n**Usage**\n\n```js\nlet res = ''\n\nrenderToSimpleStream(\n app,\n {},\n {\n push(chunk) {\n if (chunk === null) {\n // done\n console(`render complete: ${res}`)\n } else {\n res += chunk\n }\n },\n destroy(err) {\n // error encountered\n }\n }\n)\n```\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/server-renderer",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/server-renderer",
+ "version": "3.2.38",
+ "description": "@vue/server-renderer",
+ "main": "index.js",
+ "module": "dist/server-renderer.esm-bundler.js",
+ "types": "dist/server-renderer.d.ts",
+ "buildOptions": {
+ "name": "VueServerRenderer",
+ "formats": [
+ "esm-bundler",
+ "esm-browser",
+ "cjs"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/server-renderer"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "peerDependencies": {
+ "vue": "3.2.38"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/compiler-ssr": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/server-renderer@3.2.38",
+ "dist": {
+ "shasum": "01a4c0f218e90b8ad1815074208a1974ded109aa",
+ "integrity": "sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==",
+ "tarball": "http://localhost:4260/@vue/server-renderer/server-renderer-3.2.38.tgz",
+ "fileCount": 12,
+ "unpackedSize": 474625
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "@vue/server-renderer",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/server-renderer"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/@vue/shared/registry.json b/tests/registry/npm/@vue/shared/registry.json
index 64c3425e2..ad799d6e5 100644
--- a/tests/registry/npm/@vue/shared/registry.json
+++ b/tests/registry/npm/@vue/shared/registry.json
@@ -1 +1,61 @@
-{"name":"@vue/shared","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"@vue/shared","version":"3.2.38","description":"internal utils shared across @vue packages","main":"index.js","module":"dist/shared.esm-bundler.js","types":"dist/shared.d.ts","sideEffects":false,"buildOptions":{"formats":["esm-bundler","cjs"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/shared"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"@vue/shared@3.2.38","dist":{"shasum":"e823f0cb2e85b6bf43430c0d6811b1441c300f3c","integrity":"sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==","tarball":"http://localhost:4260/@vue/shared/shared-3.2.38.tgz","fileCount":10,"unpackedSize":90211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTqeo7rQjFteXx/g58jgrD+n0C45JjdajMtNo/8FmLQgIhAN3oEOYTBUbTTeIyNeVwWrkCPlYc7gXaCJADJdMq9QUb"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmouog//WGoWpl+kxaaxELjHU7FKu+OCj7XRkmw6ZbNUzl3ntHyhAAyA\r\nWoE4D2ZyVjh4V+EjebWoPNrFn2kNOhP2K1O1bWhxk2zRPUljRCFw5ysfEwu+\r\nZHyxd3RUJ0n/w3AIA6moCzujRigR+RygSR2NcO+B2m6W9Id41LQVr1cXeyo5\r\nRtiGwygvYRabm1lSn3PaNhARBlTisUzRe27x63Xa0sj4/i9B53mvYQjHelRH\r\nnmTdNoAkXooPTsP/8X7PSFpte5qA24rkyp/bNx3FLqaqa29TXJvbxeYIYuh9\r\nRTa/Vf7soF2B07Nj9eF/QDbXck75hLRK2ZrN9/CvqJILr7DETo+FDBPWVvwu\r\nBWvutnLK01iis4z82gg5n0YxTLYOVDKnndrVjhIbNNCLYGrRMeT5qJzAUqQi\r\nu3BBlj39kc1seU3B2gKF7NxSfTCLQR3xpyy3CcBjmH3COR53sQo7t/k16pH2\r\n7F5hIfLwhrlG2q5REfcnP5yADrcnPyqdFZHz9ytgfm9QuuKW+3M8lTfwLT54\r\nR28h0pGgjJMOo7OLk/4PogxH2mh/Ke1L74razqGbG+eOEWx8nfJHLyvH+1Bb\r\nfvh6bJC4Jcye9ZYx5P/H7Oq1ZvEfmwxQT99ltFHwzBr5iDkXBdpHPqvCDwJZ\r\nDZWPj2XxjRAtPAS1BFWeTnrQ4cRYQcEHTIg=\r\n=B1K2\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"internal utils shared across @vue packages","homepage":"https://github.com/vuejs/core/tree/main/packages/shared#readme","repository":{"type":"git","url":"git+https://github.com/vuejs/core.git","directory":"packages/shared"},"author":{"name":"Evan You"},"bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT","readme":"# @vue/shared\n\nInternal utility functions and constants shared across `@vue` packages.\n","readmeFilename":"README.md"}
+{
+ "name": "@vue/shared",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "@vue/shared",
+ "version": "3.2.38",
+ "description": "internal utils shared across @vue packages",
+ "main": "index.js",
+ "module": "dist/shared.esm-bundler.js",
+ "types": "dist/shared.d.ts",
+ "sideEffects": false,
+ "buildOptions": {
+ "formats": [
+ "esm-bundler",
+ "cjs"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/shared"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "@vue/shared@3.2.38",
+ "dist": {
+ "shasum": "e823f0cb2e85b6bf43430c0d6811b1441c300f3c",
+ "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
+ "tarball": "http://localhost:4260/@vue/shared/shared-3.2.38.tgz",
+ "fileCount": 10,
+ "unpackedSize": 90211
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "internal utils shared across @vue packages",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/shared#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git",
+ "directory": "packages/shared"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/abbrev/registry.json b/tests/registry/npm/abbrev/registry.json
index 591fe1404..812b0485c 100644
--- a/tests/registry/npm/abbrev/registry.json
+++ b/tests/registry/npm/abbrev/registry.json
@@ -1 +1,79 @@
-{"name":"abbrev","description":"Like ruby's abbrev module, but in js","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"abbrev","version":"2.0.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"abbrev@2.0.0","bugs":{"url":"https://github.com/npm/abbrev-js/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"cf59829b8b4f03f89dda2771cb7f3653828c89bf","tarball":"http://localhost:4260/abbrev/abbrev-2.0.0.tgz","fileCount":4,"integrity":"sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==","signatures":[{"sig":"MEQCIAqmMUR8ZhXSrjGlpIqySNBD9Pa236Qja5gsIWoqGhRaAiBss1eUkBZQkv4pCtZXOXp5D1pZDUNnz0y/bz7oDuH3uQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":4827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYUvRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqmHg//TaKWbk0RyOVd76RxaU48TKH2GwNGZqy4pxlrLKUFedm49eG6\r\nlmZm0XN3FmnCMBfj/aQ+vf4IF/NKaZpHpYbcq3wlfOdEeDisKauxheH0Hia+\r\n8KDwi7kPod8WVFt3GfrYzKscZybn4xTMkLMDe3CKRa6tzQeJUm8je8a8eRD2\r\nS8iTV7GjKPCePsS5mxakvZ7pigDFsjPAM2NzpUksiP1SS3dVVNnJoG+i4Lcg\r\nSjc7PdIszYpsk1L/SWG6Habsg7bembsTAS2a+Kl2pveU/Xp/UReEf2B+DKtp\r\nWs5O691i6xVeMICVNJFF525xPpq1kLYPknsx+SObk/b9tOhdByvUPi4ig5UZ\r\nXT3JZhv0S2pZgYXdW9KA086Jrln0X4yoHXHjfx44JLURNIjOT5wAw+Y/IRCg\r\ntg/vMwX187IfB8qG3LRrVNbxXxIl9FMCj/YBtW4TmNh/T0SDyItNSkresswh\r\nSTdNg2cE8jglnKk2/G2aKX/UnaJ5COzMOdUtF91oVjrOBZQ7HN7otS8ccdXe\r\nIGH14mamCJOx0OBS2D47gO+bpiyNJVhaOaQX1Q3QU9CHhY5DMb6PPzooMiGG\r\nGBgWlTSwzZSMJ4N1XK2thLTHmJMncQTdUWTEG9e9IGHG6Tcc40C/wjbWuocn\r\n5u2Lbqn50mw/xdtk0ZJUl0rsJoSOgu2RXVw=\r\n=u41A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"6eaa998b4291757a34d55d815290314c4776a30a","scripts":{"lint":"eslint \"**/*.js\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/abbrev-js.git","type":"git"},"_npmVersion":"9.0.1","description":"Like ruby's abbrev module, but in js","directories":{},"templateOSS":{"version":"4.8.0","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"18.12.0","_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","@npmcli/template-oss":"4.8.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/abbrev-js.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/abbrev-js#readme","bugs":{"url":"https://github.com/npm/abbrev-js/issues"},"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"}
+{
+ "name": "abbrev",
+ "description": "Like ruby's abbrev module, but in js",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "abbrev",
+ "version": "2.0.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "abbrev@2.0.0",
+ "bugs": {
+ "url": "https://github.com/npm/abbrev-js/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "cf59829b8b4f03f89dda2771cb7f3653828c89bf",
+ "tarball": "http://localhost:4260/abbrev/abbrev-2.0.0.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "unpackedSize": 4827
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "6eaa998b4291757a34d55d815290314c4776a30a",
+ "scripts": {
+ "lint": "eslint \"**/*.js\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/abbrev-js.git",
+ "type": "git"
+ },
+ "_npmVersion": "9.0.1",
+ "description": "Like ruby's abbrev module, but in js",
+ "directories": {},
+ "templateOSS": {
+ "version": "4.8.0",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "18.12.0",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "@npmcli/template-oss": "4.8.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/abbrev-js.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/abbrev-js#readme",
+ "bugs": {
+ "url": "https://github.com/npm/abbrev-js/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/agent-base/registry.json b/tests/registry/npm/agent-base/registry.json
index c1f058a96..fd71f3c81 100644
--- a/tests/registry/npm/agent-base/registry.json
+++ b/tests/registry/npm/agent-base/registry.json
@@ -1 +1,86 @@
-{"name":"agent-base","description":"Turn a function into an `http.Agent` instance","dist-tags":{"latest":"7.1.1"},"versions":{"7.1.1":{"name":"agent-base","version":"7.1.1","description":"Turn a function into an `http.Agent` instance","main":"./dist/index.js","types":"./dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/agent-base"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"license":"MIT","dependencies":{"debug":"^4.3.4"},"devDependencies":{"@types/debug":"^4.1.7","@types/jest":"^29.5.1","@types/node":"^14.18.45","@types/semver":"^7.3.13","@types/ws":"^6.0.4","async-listen":"^3.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.4","ws":"^3.3.3","tsconfig":"0.0.0"},"engines":{"node":">= 14"},"scripts":{"build":"tsc","test":"jest --env node --verbose --bail","lint":"eslint . --ext .ts","pack":"node ../../scripts/pack.mjs"},"bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"_id":"agent-base@7.1.1","_integrity":"sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==","_resolved":"/tmp/49926a570127159653e7b70d101bcbba/agent-base-7.1.1.tgz","_from":"file:agent-base-7.1.1.tgz","_nodeVersion":"20.11.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==","shasum":"bdbded7dfb096b751a2a087eeeb9664725b2e317","tarball":"http://localhost:4260/agent-base/agent-base-7.1.1.tgz","fileCount":12,"unpackedSize":31249,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICukUv7At8DBG9zvB3grqS9q18Bw9PPJwQIZpQq0tHZaAiBhiCvJ0ot1d9WsVT3+zqexp8BR4hufEl57A+jsa6gIsQ=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"agent-base\n==========\n### Turn a function into an [`http.Agent`][http.Agent] instance\n\nThis module is a thin wrapper around the base `http.Agent` class.\n\nIt provides an abstract class that must define a `connect()` function,\nwhich is responsible for creating the underlying socket that the HTTP\nclient requests will use.\n\nThe `connect()` function may return an arbitrary `Duplex` stream, or\nanother `http.Agent` instance to delegate the request to, and may be\nasynchronous (by defining an `async` function).\n\nInstances of this agent can be used with the `http` and `https`\nmodules. To differentiate, the options parameter in the `connect()`\nfunction includes a `secureEndpoint` property, which can be checked\nto determine what type of socket should be returned.\n\n#### Some subclasses:\n\nHere are some more interesting uses of `agent-base`.\nSend a pull request to list yours!\n\n * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints\n * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints\n * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS\n * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS\n\nExample\n-------\n\nHere's a minimal example that creates a new `net.Socket` or `tls.Socket`\nbased on the `secureEndpoint` property. This agent can be used with both\nthe `http` and `https` modules.\n\n```ts\nimport * as net from 'net';\nimport * as tls from 'tls';\nimport * as http from 'http';\nimport { Agent } from 'agent-base';\n\nclass MyAgent extends Agent {\n connect(req, opts) {\n // `secureEndpoint` is true when using the \"https\" module\n if (opts.secureEndpoint) {\n return tls.connect(opts);\n } else {\n return net.connect(opts);\n }\n }\n});\n\n// Keep alive enabled means that `connect()` will only be\n// invoked when a new connection needs to be created\nconst agent = new MyAgent({ keepAlive: true });\n\n// Pass the `agent` option when creating the HTTP request\nhttp.get('http://nodejs.org/api/', { agent }, (res) => {\n console.log('\"response\" event!', res.headers);\n res.pipe(process.stdout);\n});\n```\n\n[http-proxy-agent]: ../http-proxy-agent\n[https-proxy-agent]: ../https-proxy-agent\n[pac-proxy-agent]: ../pac-proxy-agent\n[socks-proxy-agent]: ../socks-proxy-agent\n[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent\n","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/agent-base"},"homepage":"https://github.com/TooTallNate/proxy-agents#readme","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "agent-base",
+ "description": "Turn a function into an `http.Agent` instance",
+ "dist-tags": {
+ "latest": "7.1.1"
+ },
+ "versions": {
+ "7.1.1": {
+ "name": "agent-base",
+ "version": "7.1.1",
+ "description": "Turn a function into an `http.Agent` instance",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/agent-base"
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "devDependencies": {
+ "@types/debug": "^4.1.7",
+ "@types/jest": "^29.5.1",
+ "@types/node": "^14.18.45",
+ "@types/semver": "^7.3.13",
+ "@types/ws": "^6.0.4",
+ "async-listen": "^3.0.0",
+ "jest": "^29.5.0",
+ "ts-jest": "^29.1.0",
+ "typescript": "^5.0.4",
+ "ws": "^3.3.3",
+ "tsconfig": "0.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "scripts": {
+ "build": "tsc",
+ "test": "jest --env node --verbose --bail",
+ "lint": "eslint . --ext .ts",
+ "pack": "node ../../scripts/pack.mjs"
+ },
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "_id": "agent-base@7.1.1",
+ "_integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "_resolved": "/tmp/49926a570127159653e7b70d101bcbba/agent-base-7.1.1.tgz",
+ "_from": "file:agent-base-7.1.1.tgz",
+ "_nodeVersion": "20.11.1",
+ "_npmVersion": "10.2.4",
+ "dist": {
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "shasum": "bdbded7dfb096b751a2a087eeeb9664725b2e317",
+ "tarball": "http://localhost:4260/agent-base/agent-base-7.1.1.tgz",
+ "fileCount": 12,
+ "unpackedSize": 31249
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/agent-base"
+ },
+ "homepage": "https://github.com/TooTallNate/proxy-agents#readme",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/aggregate-error/registry.json b/tests/registry/npm/aggregate-error/registry.json
index f7be9c09f..b9f626d40 100644
--- a/tests/registry/npm/aggregate-error/registry.json
+++ b/tests/registry/npm/aggregate-error/registry.json
@@ -1 +1,70 @@
-{"name":"aggregate-error","description":"Create an error from multiple errors","dist-tags":{"latest":"3.1.0"},"versions":{"3.1.0":{"name":"aggregate-error","version":"3.1.0","description":"Create an error from multiple errors","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/aggregate-error.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"clean-stack":"^2.0.0","indent-string":"^4.0.0"},"devDependencies":{"ava":"^2.4.0","tsd":"^0.7.1","xo":"^0.25.3"},"gitHead":"d5bb4ac02a43f005ec7ad45f6e62919d7ebed0e5","bugs":{"url":"https://github.com/sindresorhus/aggregate-error/issues"},"_id":"aggregate-error@3.1.0","_nodeVersion":"12.18.2","_npmVersion":"6.14.7","dist":{"integrity":"sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==","shasum":"92670ff50f5359bdb7a3e0d40d0ec30c5737687a","tarball":"http://localhost:4260/aggregate-error/aggregate-error-3.1.0.tgz","fileCount":5,"unpackedSize":6690,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQErcCRA9TVsSAnZWagAAf/YP/ibX9IXEI1C1OlqoT4fY\n4eq/6W0Mt2mIq8D2nAZShWHaYdM3llNZNKFVunhNfBsZ1lYGizwCV95QnjcA\nOV6+wKW/dIk9qJUo7+EfOtorC1lrdJshIqVETuwirk+a+HkBh9zMJFxgXiYs\ndxCWGiqQes7FV3qytLo2jmjh9+2DBmnod/5/8CaSSu8zPBKMRGfaF9/NUH1j\nxyPHitx1yPFmjdTcuESAmC7QEiFrIx1m1H7gzPWDUrHajlmKwhkVHAhayZDj\nMmZRPfbxfavxqc5ba6jEGcEXdJf/npjOkSrrnfFHri4582BQ/si9PE522hnM\nMId1JH21sWcn5LTuJcVhO6KNfUJ08HBbyfbjICKRsgCgEovBV8D2/CWWs87U\nM2CDQ8zXMLoYlr4dYqB4Eo7pbgxTKLpNmhoAZYcbDogYLB9/p38MxXU9S46D\nw6/StKVss6wwno/TIxvka31K9I9IbH4Nof3KH4ek7Bcqc55h+IIfIE6BGRcm\ngOLrVUkKSP2EQOjWf9MtjyX4/HLBtWSpZLu3yr7SzpVq4G68CwzQ3KPtQHTJ\nVwi+vStNeZtEaedJp+Y22CC2zhWZ3tZHptLsJKAB5xlWlDU2W3FrP9XR2L0U\nvM9P1CmOCKAQge+O8inRFtxAE0gHNuA4Fy/0JxCFhgpBDqaZQgkb/6x0ERT7\n7AVh\r\n=Sxhl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGiETVzB7JNhlldMQtr8MMh6EEIAvmfBTpDJoCD/z/CtAiEA/8XMjd3BoEUvnRxgWCg7otZ51MaAXQtlgm47KsBAglQ="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# aggregate-error\n\n> Create an error from multiple errors\n\n*Note: With [Node.js 15](https://medium.com/@nodejs/node-js-v15-0-0-is-here-deb00750f278), there's now a built-in [`AggregateError`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError) type.*\n\n## Install\n\n```sh\nnpm install aggregate-error\n```\n\n## Usage\n\n```js\nimport AggregateError from 'aggregate-error';\n\nconst error = new AggregateError([new Error('foo'), 'bar', {message: 'baz'}]);\n\nthrow error;\n/*\nAggregateError:\n Error: foo\n at Object.<anonymous> (/Users/sindresorhus/dev/aggregate-error/example.js:3:33)\n Error: bar\n at Object.<anonymous> (/Users/sindresorhus/dev/aggregate-error/example.js:3:13)\n Error: baz\n at Object.<anonymous> (/Users/sindresorhus/dev/aggregate-error/example.js:3:13)\n at AggregateError (/Users/sindresorhus/dev/aggregate-error/index.js:19:3)\n at Object.<anonymous> (/Users/sindresorhus/dev/aggregate-error/example.js:3:13)\n at Module._compile (module.js:556:32)\n at Object.Module._extensions..js (module.js:565:10)\n at Module.load (module.js:473:32)\n at tryModuleLoad (module.js:432:12)\n at Function.Module._load (module.js:424:3)\n at Module.runMain (module.js:590:10)\n at run (bootstrap_node.js:394:7)\n at startup (bootstrap_node.js:149:9)\n*/\n\nfor (const individualError of error.errors) {\n\tconsole.log(individualError);\n}\n//=> [Error: foo]\n//=> [Error: bar]\n//=> [Error: baz]\n```\n\n## API\n\n### AggregateError(errors)\n\nReturns an `Error`.\n\n#### errors\n\nType: `Array<Error|object|string>`\n\nIf a string, a new `Error` is created with the string as the error message.\\\nIf a non-Error object, a new `Error` is created with all properties from the object copied over.\n","homepage":"https://github.com/sindresorhus/aggregate-error#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/aggregate-error.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/aggregate-error/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "aggregate-error",
+ "description": "Create an error from multiple errors",
+ "dist-tags": {
+ "latest": "3.1.0"
+ },
+ "versions": {
+ "3.1.0": {
+ "name": "aggregate-error",
+ "version": "3.1.0",
+ "description": "Create an error from multiple errors",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/aggregate-error.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "tsd": "^0.7.1",
+ "xo": "^0.25.3"
+ },
+ "gitHead": "d5bb4ac02a43f005ec7ad45f6e62919d7ebed0e5",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/aggregate-error/issues"
+ },
+ "_id": "aggregate-error@3.1.0",
+ "_nodeVersion": "12.18.2",
+ "_npmVersion": "6.14.7",
+ "dist": {
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "shasum": "92670ff50f5359bdb7a3e0d40d0ec30c5737687a",
+ "tarball": "http://localhost:4260/aggregate-error/aggregate-error-3.1.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 6690
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/aggregate-error#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/aggregate-error.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/aggregate-error/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/ajv-formats/registry.json b/tests/registry/npm/ajv-formats/registry.json
index 7b75c07d8..c2ce2560d 100644
--- a/tests/registry/npm/ajv-formats/registry.json
+++ b/tests/registry/npm/ajv-formats/registry.json
@@ -1 +1,100 @@
-{"name":"ajv-formats","dist-tags":{"latest":"2.1.1"},"versions":{"2.1.1":{"name":"ajv-formats","version":"2.1.1","description":"Format validation for Ajv v7+","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","prettier:write":"prettier --write \"./**/*.{md,json,yaml,js,ts}\"","prettier:check":"prettier --list-different \"./**/*.{md,json,yaml,js,ts}\"","eslint":"eslint --ext .ts ./src/**/*","test-spec":"jest","test-cov":"jest --coverage","test":"npm run prettier:check && npm run build && npm run eslint && npm run test-cov","ci-test":"npm run test"},"repository":{"type":"git","url":"git+https://github.com/ajv-validator/ajv-formats.git"},"author":{"name":"Evgeny Poberezkin"},"license":"MIT","bugs":{"url":"https://github.com/ajv-validator/ajv-formats/issues"},"dependencies":{"ajv":"^8.0.0"},"peerDependencies":{"ajv":"^8.0.0"},"peerDependenciesMeta":{"ajv":{"optional":true}},"devDependencies":{"@ajv-validator/config":"^0.3.0","@types/jest":"^26.0.5","@types/node":"^14.10.1","@typescript-eslint/eslint-plugin":"^3.7.0","@typescript-eslint/parser":"^3.7.0","ajv":"^8.0.0","eslint":"^7.5.0","eslint-config-prettier":"^6.11.0","husky":"^4.2.5","jest":"^26.1.0","json-schema-test":"^2.0.0","lint-staged":"^10.2.11","prettier":"^2.3.2","ts-jest":"^26.1.3","typescript":"^4.0.0"},"prettier":"@ajv-validator/config/prettierrc.json","husky":{"hooks":{"pre-commit":"lint-staged && npm test"}},"lint-staged":{"*.{md,json,yaml,js,ts}":"prettier --write"},"gitHead":"c1cb46cad79f984020a9a0ef569e9c091ce24400","_id":"ajv-formats@2.1.1","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==","shasum":"6e669400659eb74973bbf2e33327180a0996b520","tarball":"http://localhost:4260/ajv-formats/ajv-formats-2.1.1.tgz","fileCount":15,"unpackedSize":52227,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh2jKWCRA9TVsSAnZWagAAyu4P/AxuqlnEShCyP+ukQBKX\nL0cHq5/18T4izpHsZHE/vu2sf3JdeZzeFLfoL5JjZmlyumJsbXgwdepTH7HX\nNGHfRsUwHr+D48BiXd/Y6wZlC2kTpa/+UJfPZullkRVtGop/WlMkPc3dnRU3\novZ4qAz7w04mHdUSqkYwGT3ajLNHndUjivZ9ZAh8mCh+vjQFuA7zAvpFDz0K\nZLAKumx/nvf2SpoDNdofzjvL7pjdpaJC+yQDvggY/TII/XkrpDWNqfh6I8Xd\nx4v6ho/dnn4ihlI1SNRbT6dZMK3wgyrWbR19z+Qj2ruP3Vvck4usSdUgMIzb\nKPA6T61x9tgP5vxNfStRlUm24xjZhkfOpe/OaioN/XEnv1DpAyuU28gk2mPt\nHMD7T3p31JLTMZg1BN+TToau4vYsfjWW6UXk7IstQf5attcLp2VL6ZAUwYC7\nWSFWCpavok2mO3cOvkSyNJKGripNquL8N9W1BcQ/aXr3mK9OA0Vc8MrFtdbs\nq7tr7UCOZobDu8tt5KGBPVHiDdjpb/X6r7GTIirdaikktx5DW/dfMvzGqqVq\nZPm4Pe69QdsR7kq62/h1OnmKFqBC3AKXhix6QTCqbmv0iI42DE0BSsjqs6L9\nuTx3tNo4BrMsimcBekRx1Vm+0YP7Jx7RzHPK0JYBYuANdvwUOSzNOUFqKS2N\nNm8/\r\n=nmgl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAiQ+wpxq7SGVGoZOo0Nq8utdTDArin0rYRIkc5QOzfGAiBwW/bjoF2mAg1rps4zt9jh3F66eaMSaMP62JTw0OOZqg=="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Format validation for Ajv v7+","homepage":"https://github.com/ajv-validator/ajv-formats#readme","repository":{"type":"git","url":"git+https://github.com/ajv-validator/ajv-formats.git"},"author":{"name":"Evgeny Poberezkin"},"bugs":{"url":"https://github.com/ajv-validator/ajv-formats/issues"},"license":"MIT","readme":"","readmeFilename":""}
+{
+ "name": "ajv-formats",
+ "dist-tags": {
+ "latest": "2.1.1"
+ },
+ "versions": {
+ "2.1.1": {
+ "name": "ajv-formats",
+ "version": "2.1.1",
+ "description": "Format validation for Ajv v7+",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "scripts": {
+ "build": "tsc",
+ "prettier:write": "prettier --write \"./**/*.{md,json,yaml,js,ts}\"",
+ "prettier:check": "prettier --list-different \"./**/*.{md,json,yaml,js,ts}\"",
+ "eslint": "eslint --ext .ts ./src/**/*",
+ "test-spec": "jest",
+ "test-cov": "jest --coverage",
+ "test": "npm run prettier:check && npm run build && npm run eslint && npm run test-cov",
+ "ci-test": "npm run test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ajv-validator/ajv-formats.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ajv-validator/ajv-formats/issues"
+ },
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ },
+ "devDependencies": {
+ "@ajv-validator/config": "^0.3.0",
+ "@types/jest": "^26.0.5",
+ "@types/node": "^14.10.1",
+ "@typescript-eslint/eslint-plugin": "^3.7.0",
+ "@typescript-eslint/parser": "^3.7.0",
+ "ajv": "^8.0.0",
+ "eslint": "^7.5.0",
+ "eslint-config-prettier": "^6.11.0",
+ "husky": "^4.2.5",
+ "jest": "^26.1.0",
+ "json-schema-test": "^2.0.0",
+ "lint-staged": "^10.2.11",
+ "prettier": "^2.3.2",
+ "ts-jest": "^26.1.3",
+ "typescript": "^4.0.0"
+ },
+ "prettier": "@ajv-validator/config/prettierrc.json",
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged && npm test"
+ }
+ },
+ "lint-staged": {
+ "*.{md,json,yaml,js,ts}": "prettier --write"
+ },
+ "gitHead": "c1cb46cad79f984020a9a0ef569e9c091ce24400",
+ "_id": "ajv-formats@2.1.1",
+ "_nodeVersion": "14.17.4",
+ "_npmVersion": "6.14.14",
+ "dist": {
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "shasum": "6e669400659eb74973bbf2e33327180a0996b520",
+ "tarball": "http://localhost:4260/ajv-formats/ajv-formats-2.1.1.tgz",
+ "fileCount": 15,
+ "unpackedSize": 52227
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Format validation for Ajv v7+",
+ "homepage": "https://github.com/ajv-validator/ajv-formats#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ajv-validator/ajv-formats.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "bugs": {
+ "url": "https://github.com/ajv-validator/ajv-formats/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/ajv/registry.json b/tests/registry/npm/ajv/registry.json
index 1c1ddb329..fb50ef891 100644
--- a/tests/registry/npm/ajv/registry.json
+++ b/tests/registry/npm/ajv/registry.json
@@ -1 +1,152 @@
-{"name":"ajv","description":"Another JSON Schema Validator","dist-tags":{"latest":"8.11.0"},"versions":{"8.11.0":{"name":"ajv","version":"8.11.0","description":"Another JSON Schema Validator","main":"dist/ajv.js","types":"dist/ajv.d.ts","scripts":{"eslint":"eslint \"lib/**/*.ts\" \"spec/**/*.*s\" --ignore-pattern spec/JSON-Schema-Test-Suite","prettier:write":"prettier --write \"./**/*.{json,yaml,js,ts}\"","prettier:check":"prettier --list-different \"./**/*.{json,yaml,js,ts}\"","test-spec":"cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register \"spec/**/*.spec.{ts,js}\" -R dot","test-codegen":"nyc cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register 'spec/codegen.spec.ts' -R spec","test-debug":"npm run test-spec -- --inspect-brk","test-cov":"nyc npm run test-spec","rollup":"rm -rf bundle && rollup -c","bundle":"rm -rf bundle && node ./scripts/bundle.js ajv ajv7 ajv7 && node ./scripts/bundle.js 2019 ajv2019 ajv2019 && node ./scripts/bundle.js 2020 ajv2020 ajv2020 && node ./scripts/bundle.js jtd ajvJTD ajvJTD","build":"rm -rf dist && tsc && cp -r lib/refs dist && rm dist/refs/json-schema-2019-09/index.ts && rm dist/refs/json-schema-2020-12/index.ts && rm dist/refs/jtd-schema.ts","json-tests":"rm -rf spec/_json/*.js && node scripts/jsontests","test-karma":"karma start","test-browser":"rm -rf .browser && npm run bundle && scripts/prepare-tests && karma start","test-all":"npm run test-cov && if-node-version 12 npm run test-browser","test":"npm run json-tests && npm run prettier:check && npm run eslint && npm link && npm link --legacy-peer-deps ajv && npm run test-cov","test-ci":"AJV_FULL_TEST=true npm test","prepublish":"npm run build","benchmark":"npm i && npm run build && npm link && cd ./benchmark && npm link --legacy-peer-deps ajv && npm i && node ./jtd","docs:dev":"./scripts/prepare-site && vuepress dev docs","docs:build":"./scripts/prepare-site && vuepress build docs"},"nyc":{"exclude":["**/spec/**","node_modules"],"reporter":["lcov","text-summary"]},"repository":{"type":"git","url":"git+https://github.com/ajv-validator/ajv.git"},"author":{"name":"Evgeny Poberezkin"},"license":"MIT","bugs":{"url":"https://github.com/ajv-validator/ajv/issues"},"runkitExampleFilename":".runkit_example.js","dependencies":{"fast-deep-equal":"^3.1.1","json-schema-traverse":"^1.0.0","require-from-string":"^2.0.2","uri-js":"^4.2.2"},"devDependencies":{"@ajv-validator/config":"^0.3.0","@rollup/plugin-commonjs":"^21.0.0","@rollup/plugin-json":"^4.1.0","@rollup/plugin-node-resolve":"^13.0.0","@rollup/plugin-typescript":"^8.2.1","@types/chai":"^4.2.12","@types/mocha":"^9.0.0","@types/node":"^17.0.0","@types/require-from-string":"^1.2.0","@typescript-eslint/eslint-plugin":"^3.8.0","@typescript-eslint/parser":"^3.8.0","ajv-formats":"^3.0.0-rc.0","browserify":"^17.0.0","chai":"^4.0.1","cross-env":"^7.0.2","dayjs":"^1.10.4","dayjs-plugin-utc":"^0.1.2","eslint":"^7.8.1","eslint-config-prettier":"^7.0.0","fast-uri":"^1.0.0","glob":"^7.0.0","husky":"^7.0.1","if-node-version":"^1.0.0","jimp":"^0.16.1","js-beautify":"^1.7.3","json-schema-test":"^2.0.0","karma":"^6.0.0","karma-chrome-launcher":"^3.0.0","karma-mocha":"^2.0.0","lint-staged":"^12.1.1","mocha":"^9.0.2","module-from-string":"^3.1.3","node-fetch":"^3.0.0","nyc":"^15.0.0","prettier":"^2.3.1","re2":"^1.16.0","rollup":"^2.44.0","rollup-plugin-terser":"^7.0.2","ts-node":"^10.0.0","tsify":"^5.0.2","typescript":"^4.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/ajv"},"funding":{"type":"github","url":"https://github.com/sponsors/epoberezkin"},"prettier":"@ajv-validator/config/prettierrc.json","husky":{"hooks":{"pre-commit":"lint-staged && npm test"}},"lint-staged":{"*.{json,yaml,js,ts}":"prettier --write"},"gitHead":"c067d6d9c3285054ea4c0a2d2adbbc8b5d631935","_id":"ajv@8.11.0","_nodeVersion":"14.19.0","_npmVersion":"6.14.16","dist":{"integrity":"sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==","shasum":"977e91dd96ca669f54a11e23e378e33b884a565f","tarball":"http://localhost:4260/ajv/ajv-8.11.0.tgz","fileCount":466,"unpackedSize":1016907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiOktjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJaxAAlaVvTQ2Odj3CLA5v+enMW0jEAGeGlyYxD0Ts+DiQAB4WfJNX\r\nVe0RbcTH/zgnFoDlDEOfcx1/1fEDGn92EfMNH4B+ltJE5qyOPaAVYZeE4+A3\r\nl7P3z01LhKtp911KBXT4DaZ1VXAwvr9rc5tubleEy5iv51Pr9Y2ytB8jNXtC\r\nUpTlwJbKlgP8xvyBs/rZLG7igxdWsA1UWSWU3o90eKBB1Bg6fL8is8ZPMabR\r\nPSINIR4L7T2dSSUlsdzs7RijmZQbu9rzc/Wzz+JR9rc7eufoMUkj0nXkMg84\r\nFP7A3zVGuRZyw0/2dOL3yqMn58DHQaVayFiHQhPDWfG2OJwpTIvDKAuMP2kE\r\nIT3215DU3aUdQvPLNCsSz2B1LnjVPJKOIwAOCRCx5AG+S6jQf2cZWs4QHBzH\r\n6LczlMxWyktXuZvW7a5EvuQGPfaWXGC/uhzXoFUQdukvyez6kR8Ud5tm2yDZ\r\n1KVRxuvq9y+7ZrtHgn4EquzXanJRny6glk5qwlNcxVY5mKPWnxoFgX2W5f4+\r\navGLINZXtGr9prKOyobeQ0kmRP6BPs7QG2NR8eCGrZXVNDD5PU0qM8qPpCoq\r\nnns6qwr7wk3reYcMXewd7ZDP1FaXED/VOmZFCLkK5DlWO12BHCcddpOfZiS5\r\n+l0dQlmSC3TBRvuzsAv2BzTSw19SeHFebto=\r\n=GDNg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBvHJRPXJkPRNoscrSJ8kMjkbE/LlkpAlxhMcZma8ljPAiEAoT5UriPgOHdP72VlfTAzIq6qQyMFATTzsNuwOhTbU1U="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<img align=\"right\" alt=\"Ajv logo\" width=\"160\" src=\"https://ajv.js.org/img/ajv.svg\">\n\n&nbsp;\n\n# Ajv JSON schema validator\n\nThe fastest JSON validator for Node.js and browser.\n\nSupports JSON Schema draft-04/06/07/2019-09/2020-12 ([draft-04 support](https://ajv.js.org/json-schema.html#draft-04) requires ajv-draft-04 package) and JSON Type Definition [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n\n[![build](https://github.com/ajv-validator/ajv/workflows/build/badge.svg)](https://github.com/ajv-validator/ajv/actions?query=workflow%3Abuild)\n[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv)\n[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv)\n[![Coverage Status](https://coveralls.io/repos/github/ajv-validator/ajv/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv?branch=master)\n[![SimpleX](https://img.shields.io/badge/chat-on%20SimpleX-%2307b4b9)](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2Fap4lMFzfXF8Hzmh-Vz0WNxp_1jKiOa-h%23MCowBQYDK2VuAyEAcdefddRvDfI8iAuBpztm_J3qFucj8MDZoVs_2EcMTzU%3D)\n[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv)\n[![GitHub Sponsors](https://img.shields.io/badge/$-sponsors-brightgreen)](https://github.com/sponsors/epoberezkin)\n\n## Ajv sponsors\n\n[<img src=\"https://ajv.js.org/img/mozilla.svg\" width=\"45%\" alt=\"Mozilla\">](https://www.mozilla.org)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"9%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"45%\">](https://opencollective.com/ajv)\n\n[<img src=\"https://ajv.js.org/img/microsoft.png\" width=\"31%\" alt=\"Microsoft\">](https://opensource.microsoft.com)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"31%\">](https://opencollective.com/ajv)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"31%\">](https://opencollective.com/ajv)\n\n[<img src=\"https://ajv.js.org/img/retool.svg\" width=\"22.5%\" alt=\"Retool\">](https://retool.com/?utm_source=sponsor&utm_campaign=ajv)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/tidelift.svg\" width=\"22.5%\" alt=\"Tidelift\">](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=enterprise)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/simplex.svg\" width=\"22.5%\" alt=\"SimpleX\">](https://github.com/simplex-chat/simplex-chat)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"22.5%\">](https://opencollective.com/ajv)\n\n## Contributing\n\nMore than 100 people contributed to Ajv, and we would love to have you join the development. We welcome implementing new features that will benefit many users and ideas to improve our documentation.\n\nPlease review [Contributing guidelines](./CONTRIBUTING.md) and [Code components](https://ajv.js.org/components.html).\n\n## Documentation\n\nAll documentation is available on the [Ajv website](https://ajv.js.org).\n\nSome useful site links:\n- [Getting started](https://ajv.js.org/guide/getting-started.html)\n- [JSON Schema vs JSON Type Definition](https://ajv.js.org/guide/schema-language.html)\n- [API reference](https://ajv.js.org/api.html)\n- [Strict mode](https://ajv.js.org/strict-mode.html)\n- [Standalone validation code](https://ajv.js.org/standalone.html)\n- [Security considerations](https://ajv.js.org/security.html)\n- [Command line interface](https://ajv.js.org/packages/ajv-cli.html)\n- [Frequently Asked Questions](https://ajv.js.org/faq.html)\n\n## <a name=\"sponsors\"></a>Please [sponsor Ajv development](https://github.com/sponsors/epoberezkin)\n\nSince I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant!\n\nYour continuing support is very important - the funds will be used to develop and maintain Ajv once the next major version is released.\n\nPlease sponsor Ajv via:\n\n- [GitHub sponsors page](https://github.com/sponsors/epoberezkin) (GitHub will match it)\n- [Ajv Open Collective️](https://opencollective.com/ajv)\n\nThank you.\n\n#### Open Collective sponsors\n\n<a href=\"https://opencollective.com/ajv\"><img src=\"https://opencollective.com/ajv/individuals.svg?width=890\"></a>\n\n<a href=\"https://opencollective.com/ajv/organization/0/website\"><img src=\"https://opencollective.com/ajv/organization/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/1/website\"><img src=\"https://opencollective.com/ajv/organization/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/2/website\"><img src=\"https://opencollective.com/ajv/organization/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/3/website\"><img src=\"https://opencollective.com/ajv/organization/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/4/website\"><img src=\"https://opencollective.com/ajv/organization/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/5/website\"><img src=\"https://opencollective.com/ajv/organization/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/6/website\"><img src=\"https://opencollective.com/ajv/organization/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/7/website\"><img src=\"https://opencollective.com/ajv/organization/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/8/website\"><img src=\"https://opencollective.com/ajv/organization/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/9/website\"><img src=\"https://opencollective.com/ajv/organization/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/10/website\"><img src=\"https://opencollective.com/ajv/organization/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/11/website\"><img src=\"https://opencollective.com/ajv/organization/11/avatar.svg\"></a>\n\n## Performance\n\nAjv generates code to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization.\n\nCurrently Ajv is the fastest and the most standard compliant validator according to these benchmarks:\n\n- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place\n- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster\n- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)\n- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)\n\nPerformance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark):\n\n[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=62,4,1&chs=600x416&chxl=-1:|ajv|@exodus&#x2F;schemasafe|is-my-json-valid|djv|@cfworker&#x2F;json-schema|jsonschema&chd=t:100,69.2,51.5,13.1,5.1,1.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance)\n\n## Features\n\n- Ajv implements JSON Schema [draft-06/07/2019-09/2020-12](http://json-schema.org/) standards (draft-04 is supported in v6):\n - all validation keywords (see [JSON Schema validation keywords](https://ajv.js.org/json-schema.html))\n - [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md) extensions:\n - NEW: keyword [discriminator](https://ajv.js.org/json-schema.html#discriminator).\n - keyword [nullable](https://ajv.js.org/json-schema.html#nullable).\n - full support of remote references (remote schemas have to be added with `addSchema` or compiled to be available)\n - support of recursive references between schemas\n - correct string lengths for strings with unicode pairs\n - JSON Schema [formats](https://ajv.js.org/guide/formats.html) (with [ajv-formats](https://github.com/ajv-validator/ajv-formats) plugin).\n - [validates schemas against meta-schema](https://ajv.js.org/api.html#api-validateschema)\n- NEW: supports [JSON Type Definition](https://datatracker.ietf.org/doc/rfc8927/):\n - all keywords (see [JSON Type Definition schema forms](https://ajv.js.org/json-type-definition.html))\n - meta-schema for JTD schemas\n - \"union\" keyword and user-defined keywords (can be used inside \"metadata\" member of the schema)\n- supports [browsers](https://ajv.js.org/guide/environments.html#browsers) and Node.js 10.x - current\n- [asynchronous loading](https://ajv.js.org/guide/managing-schemas.html#asynchronous-schema-loading) of referenced schemas during compilation\n- \"All errors\" validation mode with [option allErrors](https://ajv.js.org/options.html#allerrors)\n- [error messages with parameters](https://ajv.js.org/api.html#validation-errors) describing error reasons to allow error message generation\n- i18n error messages support with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package\n- [removing-additional-properties](https://ajv.js.org/guide/modifying-data.html#removing-additional-properties)\n- [assigning defaults](https://ajv.js.org/guide/modifying-data.html#assigning-defaults) to missing properties and items\n- [coercing data](https://ajv.js.org/guide/modifying-data.html#coercing-data-types) to the types specified in `type` keywords\n- [user-defined keywords](https://ajv.js.org/guide/user-keywords.html)\n- additional extension keywords with [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package\n- [\\$data reference](https://ajv.js.org/guide/combining-schemas.html#data-reference) to use values from the validated data as values for the schema keywords\n- [asynchronous validation](https://ajv.js.org/guide/async-validation.html) of user-defined formats and keywords\n\n## Install\n\nTo install version 8:\n\n```\nnpm install ajv\n```\n\n## <a name=\"usage\"></a>Getting started\n\nTry it in the Node.js REPL: https://runkit.com/npm/ajv\n\nIn JavaScript:\n\n```javascript\n// or ESM/TypeScript import\nimport Ajv from \"ajv\"\n// Node.js require:\nconst Ajv = require(\"ajv\")\n\nconst ajv = new Ajv() // options can be passed, e.g. {allErrors: true}\n\nconst schema = {\n type: \"object\",\n properties: {\n foo: {type: \"integer\"},\n bar: {type: \"string\"}\n },\n required: [\"foo\"],\n additionalProperties: false,\n}\n\nconst data = {\n foo: 1,\n bar: \"abc\"\n}\n\nconst validate = ajv.compile(schema)\nconst valid = validate(data)\nif (!valid) console.log(validate.errors)\n```\n\nLearn how to use Ajv and see more examples in the [Guide: getting started](https://ajv.js.org/guide/getting-started.html)\n\n## Changes history\n\nSee [https://github.com/ajv-validator/ajv/releases](https://github.com/ajv-validator/ajv/releases)\n\n**Please note**: [Changes in version 8.0.0](https://github.com/ajv-validator/ajv/releases/tag/v8.0.0)\n\n[Version 7.0.0](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0)\n\n[Version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0).\n\n## Code of conduct\n\nPlease review and follow the [Code of conduct](./CODE_OF_CONDUCT.md).\n\nPlease report any unacceptable behaviour to ajv.validator@gmail.com - it will be reviewed by the project team.\n\n## Security contact\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues.\n\n## Open-source software support\n\nAjv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers.\n\n## License\n\n[MIT](./LICENSE)\n","homepage":"https://ajv.js.org","repository":{"type":"git","url":"git+https://github.com/ajv-validator/ajv.git"},"author":{"name":"Evgeny Poberezkin"},"bugs":{"url":"https://github.com/ajv-validator/ajv/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "ajv",
+ "description": "Another JSON Schema Validator",
+ "dist-tags": {
+ "latest": "8.11.0"
+ },
+ "versions": {
+ "8.11.0": {
+ "name": "ajv",
+ "version": "8.11.0",
+ "description": "Another JSON Schema Validator",
+ "main": "dist/ajv.js",
+ "types": "dist/ajv.d.ts",
+ "scripts": {
+ "eslint": "eslint \"lib/**/*.ts\" \"spec/**/*.*s\" --ignore-pattern spec/JSON-Schema-Test-Suite",
+ "prettier:write": "prettier --write \"./**/*.{json,yaml,js,ts}\"",
+ "prettier:check": "prettier --list-different \"./**/*.{json,yaml,js,ts}\"",
+ "test-spec": "cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register \"spec/**/*.spec.{ts,js}\" -R dot",
+ "test-codegen": "nyc cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register 'spec/codegen.spec.ts' -R spec",
+ "test-debug": "npm run test-spec -- --inspect-brk",
+ "test-cov": "nyc npm run test-spec",
+ "rollup": "rm -rf bundle && rollup -c",
+ "bundle": "rm -rf bundle && node ./scripts/bundle.js ajv ajv7 ajv7 && node ./scripts/bundle.js 2019 ajv2019 ajv2019 && node ./scripts/bundle.js 2020 ajv2020 ajv2020 && node ./scripts/bundle.js jtd ajvJTD ajvJTD",
+ "build": "rm -rf dist && tsc && cp -r lib/refs dist && rm dist/refs/json-schema-2019-09/index.ts && rm dist/refs/json-schema-2020-12/index.ts && rm dist/refs/jtd-schema.ts",
+ "json-tests": "rm -rf spec/_json/*.js && node scripts/jsontests",
+ "test-karma": "karma start",
+ "test-browser": "rm -rf .browser && npm run bundle && scripts/prepare-tests && karma start",
+ "test-all": "npm run test-cov && if-node-version 12 npm run test-browser",
+ "test": "npm run json-tests && npm run prettier:check && npm run eslint && npm link && npm link --legacy-peer-deps ajv && npm run test-cov",
+ "test-ci": "AJV_FULL_TEST=true npm test",
+ "prepublish": "npm run build",
+ "benchmark": "npm i && npm run build && npm link && cd ./benchmark && npm link --legacy-peer-deps ajv && npm i && node ./jtd",
+ "docs:dev": "./scripts/prepare-site && vuepress dev docs",
+ "docs:build": "./scripts/prepare-site && vuepress build docs"
+ },
+ "nyc": {
+ "exclude": [
+ "**/spec/**",
+ "node_modules"
+ ],
+ "reporter": [
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ajv-validator/ajv.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ajv-validator/ajv/issues"
+ },
+ "runkitExampleFilename": ".runkit_example.js",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "devDependencies": {
+ "@ajv-validator/config": "^0.3.0",
+ "@rollup/plugin-commonjs": "^21.0.0",
+ "@rollup/plugin-json": "^4.1.0",
+ "@rollup/plugin-node-resolve": "^13.0.0",
+ "@rollup/plugin-typescript": "^8.2.1",
+ "@types/chai": "^4.2.12",
+ "@types/mocha": "^9.0.0",
+ "@types/node": "^17.0.0",
+ "@types/require-from-string": "^1.2.0",
+ "@typescript-eslint/eslint-plugin": "^3.8.0",
+ "@typescript-eslint/parser": "^3.8.0",
+ "ajv-formats": "^3.0.0-rc.0",
+ "browserify": "^17.0.0",
+ "chai": "^4.0.1",
+ "cross-env": "^7.0.2",
+ "dayjs": "^1.10.4",
+ "dayjs-plugin-utc": "^0.1.2",
+ "eslint": "^7.8.1",
+ "eslint-config-prettier": "^7.0.0",
+ "fast-uri": "^1.0.0",
+ "glob": "^7.0.0",
+ "husky": "^7.0.1",
+ "if-node-version": "^1.0.0",
+ "jimp": "^0.16.1",
+ "js-beautify": "^1.7.3",
+ "json-schema-test": "^2.0.0",
+ "karma": "^6.0.0",
+ "karma-chrome-launcher": "^3.0.0",
+ "karma-mocha": "^2.0.0",
+ "lint-staged": "^12.1.1",
+ "mocha": "^9.0.2",
+ "module-from-string": "^3.1.3",
+ "node-fetch": "^3.0.0",
+ "nyc": "^15.0.0",
+ "prettier": "^2.3.1",
+ "re2": "^1.16.0",
+ "rollup": "^2.44.0",
+ "rollup-plugin-terser": "^7.0.2",
+ "ts-node": "^10.0.0",
+ "tsify": "^5.0.2",
+ "typescript": "^4.2.0"
+ },
+ "collective": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ajv"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ },
+ "prettier": "@ajv-validator/config/prettierrc.json",
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged && npm test"
+ }
+ },
+ "lint-staged": {
+ "*.{json,yaml,js,ts}": "prettier --write"
+ },
+ "gitHead": "c067d6d9c3285054ea4c0a2d2adbbc8b5d631935",
+ "_id": "ajv@8.11.0",
+ "_nodeVersion": "14.19.0",
+ "_npmVersion": "6.14.16",
+ "dist": {
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+ "shasum": "977e91dd96ca669f54a11e23e378e33b884a565f",
+ "tarball": "http://localhost:4260/ajv/ajv-8.11.0.tgz",
+ "fileCount": 466,
+ "unpackedSize": 1016907
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://ajv.js.org",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ajv-validator/ajv.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "bugs": {
+ "url": "https://github.com/ajv-validator/ajv/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/ansi-regex/registry.json b/tests/registry/npm/ansi-regex/registry.json
index 218a29e02..e60f9a769 100644
--- a/tests/registry/npm/ansi-regex/registry.json
+++ b/tests/registry/npm/ansi-regex/registry.json
@@ -1 +1,161 @@
-{"name":"ansi-regex","description":"Regular expression for matching ANSI escape codes","dist-tags":{"latest":"6.0.1"},"versions":{"6.0.1":{"name":"ansi-regex","version":"6.0.1","description":"Regular expression for matching ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-regex.git"},"funding":"https://github.com/chalk/ansi-regex?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","engines":{"node":">=12"},"scripts":{"test":"xo && ava && tsd","view-supported":"node fixtures/view-codes.js"},"devDependencies":{"ava":"^3.15.0","tsd":"^0.14.0","xo":"^0.38.2"},"types":"./index.d.ts","gitHead":"d908492e0070f26552fad1b25e339aff9011ae8b","bugs":{"url":"https://github.com/chalk/ansi-regex/issues"},"_id":"ansi-regex@6.0.1","_nodeVersion":"16.0.0","_npmVersion":"7.23.0","dist":{"integrity":"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==","shasum":"3183e38fae9a65d7cb5e53945cd5897d0260a06a","tarball":"http://localhost:4260/ansi-regex/ansi-regex-6.0.1.tgz","fileCount":5,"unpackedSize":5667,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhO78hCRA9TVsSAnZWagAA+F4P/0Xt4D0GoXduv+o147iO\nj3b1oPSNypnmThhmCAUInwB1Xd9SXFEjzuNDNGX/8xeWUQrJssJ+SBEzb5te\nr34P6wPHUeuTa2p1j3ABN9ABP/NPCPkaEDgjx86ImkT++3VI8yNEuSSOsghI\n5Ssvhm6bLJBWzCt/cweIG7x4ZJQPeUbyoWIJmBobCDyNuVgabmk9B2B1RyO0\nf2aounmh5w1fBWsx65MjTi7fu4e/GOP+xscf9Rn1AdRP6rcxJakPjaGTF3HE\naz6UNP9UZCuZ4rb6xOFEfLmiqfNbK31NKNLPrABDXF6NkbJepsUhNmju32cg\nUuo4lSkxfFaVyFXFB1h62RmDdemxZWl9j24fVt+99K4BH6xOiwPmOHHHPJnL\nXNuZ6eCwdcLjPe8Af/0GEsFqdDu591Hwi2Nl8UNAD5hCzcDTITOTL95Dopaw\nGzySTClnDsh17Ud73FWM51FQzVDORa2vOmVzQts3aHlF93ufk9RHtlN9YxAV\nUvM3IxMHx2O8Rc2gSc6t/pJAdFACBLkLDGtcQVhxaFcTpGXrKUr+KN2gFC4D\nXZA/MvK0YXBmrwec20k2wTAdmi7XO5k8HciCPT7MZDJONTBlt9cC/LL41JNc\nvxj0A0loP9R44eVoAJOSbxhpnteeIjw4rwkOySZOqqEsUw5MDFp/peiojlcv\nCOQk\r\n=VRgZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCWW/ZEXmQGK500jBFw7uRYczrrcLTzOEnm3uDiNPs6rAIgcKX8SLAOUpBu/tWg+7vPsMA4l7siraEVYPpTETOVqX0="}]},"directories":{},"_hasShrinkwrap":false},"5.0.1":{"name":"ansi-regex","version":"5.0.1","description":"Regular expression for matching ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-regex.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd","view-supported":"node fixtures/view-codes.js"},"devDependencies":{"ava":"^2.4.0","tsd":"^0.9.0","xo":"^0.25.3"},"types":"./index.d.ts","readme":"# ansi-regex\n\n> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install ansi-regex\n```\n\n\n## Usage\n\n```js\nconst ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001B[4mcake\\u001B[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex());\n//=> ['\\u001B[4m', '\\u001B[0m']\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex({onlyFirst: true}));\n//=> ['\\u001B[4m']\n\n'\\u001B]8;;https://github.com\\u0007click\\u001B]8;;\\u0007'.match(ansiRegex());\n//=> ['\\u001B]8;;https://github.com\\u0007', '\\u001B]8;;\\u0007']\n```\n\n\n## API\n\n### ansiRegex(options?)\n\nReturns a regex for matching ANSI escape codes.\n\n#### options\n\nType: `object`\n\n##### onlyFirst\n\nType: `boolean`<br>\nDefault: `false` *(Matches any ANSI escape codes in a string)*\n\nMatch only the first ANSI escape.\n\n\n## FAQ\n\n### Why do you test for codes not in the ECMA 48 standard?\n\nSome of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.\n\nOn the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of \"interrupts\" that can mean different things on certain brands of processors, most of which have been phased out.\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-ansi-regex?utm_source=npm-ansi-regex&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","readmeFilename":"readme.md","gitHead":"a9babce885cf19c363cf1d1c645f834592c3f7a4","bugs":{"url":"https://github.com/chalk/ansi-regex/issues"},"_id":"ansi-regex@5.0.1","_nodeVersion":"16.0.0","_npmVersion":"7.23.0","dist":{"integrity":"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==","shasum":"082cb2c89c9fe8659a311a53bd6a4dc5301db304","tarball":"http://localhost:4260/ansi-regex/ansi-regex-5.0.1.tgz","fileCount":5,"unpackedSize":5609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQMXnCRA9TVsSAnZWagAADYYP/iz1/gbU0N9EjGpKc+Gm\nnX7qe5zf8TvcOpxBMDSFiCD5ntg/EH4YguqeUhRgW7X/nx58basGjNU2Payd\n6gIBVMEriQUWhS6MllSbiIbxY3ALKRcNhIphqER4kneujLwTqgAMOSjjnOk+\nvhPheetSO9ydRVZvb1UHC45D/4Bl0BJjPuAgF6YJlAae+bon50yImBeBUus4\nSmcbaBKSoCKT+ml4pfNidfUIJn+Zo8u0u8WI/6hfJ5oD9/eerQaSK/Fjt1hZ\nj67NmXWMsMugedkgpKbK3lZX+LucgTrb7L9QJC++LQj6FSRDQBguiODgJ912\nVxqjJN0SSqcpNRVk0dTHhI2IoOn4Mu3HVZolsrVFGXsQDMlNHWxehHUtzZ/h\ne592hb0tqcyIeMFLUMcRhcnaQZrNKTYv7XSMpfPWh73slOk5AaZFOyY/yZ2k\nIqfm7sKVsijHzRgyveZ+n1QyV6CWFMzQbxnj34t7NpnX429VY/F/ZL/E1Yfu\noJhSbp/K0+k8Gp9g9YNDANE7s5jM8pJzlSOo3XUWyaFaujRHMsAtxgtYikZB\n3uzZaYQxryjCkvuvZJFwUBMeLWJP2JKt7bpK3mv7DHvEWTxicBHSPaePhA01\nOfiQ7YzPY3pNI/Fki/jloyJgSazLpvlWv7XWAF/OhvB5G3KQbfDe/hbQg0Yq\nsUn3\r\n=I35d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCS7XsMq0d29jMXjedcRcP044S7ZelyMVBxKjkUpCShHAIgGyiTNkLoCCh/rpMnXAisLtOsV3SGe2ftVRwhvZTAPyw="}]},"directories":{},"_hasShrinkwrap":false},"3.0.1":{"name":"ansi-regex","version":"3.0.1","description":"Regular expression for matching ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-regex.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=4"},"scripts":{"test":"xo && ava","view-supported":"node fixtures/view-codes.js"},"devDependencies":{"ava":"*","xo":"*"},"readme":"# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install ansi-regex\n```\n\n\n## Usage\n\n```js\nconst ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001B[4mcake\\u001B[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex());\n//=> ['\\u001B[4m', '\\u001B[0m']\n```\n\n\n## FAQ\n\n### Why do you test for codes not in the ECMA 48 standard?\n\nSome of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.\n\nOn the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of \"interrupts\" that can mean different things on certain brands of processors, most of which have been phased out.\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n\n## License\n\nMIT\n","readmeFilename":"readme.md","gitHead":"f545bdb80048f527889eddb9ac1a851c6f2a2241","bugs":{"url":"https://github.com/chalk/ansi-regex/issues"},"_id":"ansi-regex@3.0.1","_nodeVersion":"17.3.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==","shasum":"123d6479e92ad45ad897d4054e3c7ca7db4944e1","tarball":"http://localhost:4260/ansi-regex/ansi-regex-3.0.1.tgz","fileCount":4,"unpackedSize":4054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQGbIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqy/Q//Vh9oKpgDxgXcW+UYZ9DZKYScVldnKzuT5VNYLrGT8mMMPxAC\r\nws4wVRyeWo8WX4jwQqpZaDxr5WlH+X2tbxM+PmwncwkOYTtbTGutmr+cwc16\r\nXaKNwQZt4F5fA32N39Jxyu05sLqje517n3rRFvN6HqzOw21DYIL6N7UpUXeD\r\nFiwNMFOi2S3RMUJgf6EDVNB59MNX7X6W85cvJrjRK8xfUJB50ODx1WfUNG1X\r\nc96t6swskGBdq0riRxtmUTyJgxkgaL4eHnYMpLSad1Xx5rVyHckL9CFajYPo\r\np64kmi2+UHAswdfzDYuQTuIt2vKzpKCGGP74FSZ5trTsQNuljvjhemFePlAw\r\nXOoq2sf/yTGiNu9W+ved2NPpR/nSQO9UnBp7P/pKcfY92rPOwRc3ypBx4JDC\r\nQHANx8/fM7TtRrVUyVJoyEYzMnDxDQnzeGRrYfSneg1oI7oci62HXmgrfxvh\r\n8TPDgsKALJixmkDc6FQgENjmMrblrmU7ZuK2H1meidi+62MJEoTj5lwXKp9d\r\nhay1RKGB4qKHEO5PVIBrYdvkoZIaUyIrN4KgcqHHjrOKWhcWAZDu3A9wwyLD\r\nAOMLQbPqJccQj2FrSMOGrc1ego70swRFGX21xLW0xqr8p65PTLGBKp0+OgC9\r\nlcz8F/xfg1PkqVRZw4TGuEcBE3EHcDFSrr0=\r\n=xF18\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGxf4gJU3Ry4fyipshNrDGCYFK/glbif7vsA/O9sywmCAiEAgFdMiI1ykrpU2QunGRKSzrIksQtwFrDpgjgh2uUQKh8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"","homepage":"https://github.com/chalk/ansi-regex#readme","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-regex.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/chalk/ansi-regex/issues"},"license":"MIT","readmeFilename":""}
+{
+ "name": "ansi-regex",
+ "description": "Regular expression for matching ANSI escape codes",
+ "dist-tags": {
+ "latest": "6.0.1"
+ },
+ "versions": {
+ "6.0.1": {
+ "name": "ansi-regex",
+ "version": "6.0.1",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-regex.git"
+ },
+ "funding": "https://github.com/chalk/ansi-regex?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "type": "module",
+ "exports": "./index.js",
+ "engines": {
+ "node": ">=12"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd",
+ "view-supported": "node fixtures/view-codes.js"
+ },
+ "devDependencies": {
+ "ava": "^3.15.0",
+ "tsd": "^0.14.0",
+ "xo": "^0.38.2"
+ },
+ "types": "./index.d.ts",
+ "gitHead": "d908492e0070f26552fad1b25e339aff9011ae8b",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-regex/issues"
+ },
+ "_id": "ansi-regex@6.0.1",
+ "_nodeVersion": "16.0.0",
+ "_npmVersion": "7.23.0",
+ "dist": {
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "shasum": "3183e38fae9a65d7cb5e53945cd5897d0260a06a",
+ "tarball": "http://localhost:4260/ansi-regex/ansi-regex-6.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 5667
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "5.0.1": {
+ "name": "ansi-regex",
+ "version": "5.0.1",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-regex.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd",
+ "view-supported": "node fixtures/view-codes.js"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "tsd": "^0.9.0",
+ "xo": "^0.25.3"
+ },
+ "types": "./index.d.ts",
+ "readme": "# ansi-regex\n\n> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install ansi-regex\n```\n\n\n## Usage\n\n```js\nconst ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001B[4mcake\\u001B[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex());\n//=> ['\\u001B[4m', '\\u001B[0m']\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex({onlyFirst: true}));\n//=> ['\\u001B[4m']\n\n'\\u001B]8;;https://github.com\\u0007click\\u001B]8;;\\u0007'.match(ansiRegex());\n//=> ['\\u001B]8;;https://github.com\\u0007', '\\u001B]8;;\\u0007']\n```\n\n\n## API\n\n### ansiRegex(options?)\n\nReturns a regex for matching ANSI escape codes.\n\n#### options\n\nType: `object`\n\n##### onlyFirst\n\nType: `boolean`<br>\nDefault: `false` *(Matches any ANSI escape codes in a string)*\n\nMatch only the first ANSI escape.\n\n\n## FAQ\n\n### Why do you test for codes not in the ECMA 48 standard?\n\nSome of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.\n\nOn the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of \"interrupts\" that can mean different things on certain brands of processors, most of which have been phased out.\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-ansi-regex?utm_source=npm-ansi-regex&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n",
+ "readmeFilename": "readme.md",
+ "gitHead": "a9babce885cf19c363cf1d1c645f834592c3f7a4",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-regex/issues"
+ },
+ "_id": "ansi-regex@5.0.1",
+ "_nodeVersion": "16.0.0",
+ "_npmVersion": "7.23.0",
+ "dist": {
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "shasum": "082cb2c89c9fe8659a311a53bd6a4dc5301db304",
+ "tarball": "http://localhost:4260/ansi-regex/ansi-regex-5.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 5609
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "3.0.1": {
+ "name": "ansi-regex",
+ "version": "3.0.1",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-regex.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava",
+ "view-supported": "node fixtures/view-codes.js"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "readme": "# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install ansi-regex\n```\n\n\n## Usage\n\n```js\nconst ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001B[4mcake\\u001B[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001B[4mcake\\u001B[0m'.match(ansiRegex());\n//=> ['\\u001B[4m', '\\u001B[0m']\n```\n\n\n## FAQ\n\n### Why do you test for codes not in the ECMA 48 standard?\n\nSome of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.\n\nOn the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of \"interrupts\" that can mean different things on certain brands of processors, most of which have been phased out.\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n\n## License\n\nMIT\n",
+ "readmeFilename": "readme.md",
+ "gitHead": "f545bdb80048f527889eddb9ac1a851c6f2a2241",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-regex/issues"
+ },
+ "_id": "ansi-regex@3.0.1",
+ "_nodeVersion": "17.3.1",
+ "_npmVersion": "8.3.0",
+ "dist": {
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "shasum": "123d6479e92ad45ad897d4054e3c7ca7db4944e1",
+ "tarball": "http://localhost:4260/ansi-regex/ansi-regex-3.0.1.tgz",
+ "fileCount": 4,
+ "unpackedSize": 4054
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/chalk/ansi-regex#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-regex.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-regex/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/ansi-styles/registry.json b/tests/registry/npm/ansi-styles/registry.json
index 618ec6de0..702510b50 100644
--- a/tests/registry/npm/ansi-styles/registry.json
+++ b/tests/registry/npm/ansi-styles/registry.json
@@ -1 +1,120 @@
-{"name":"ansi-styles","description":"ANSI escape codes for styling strings in the terminal","dist-tags":{"latest":"6.1.0"},"versions":{"4.3.0":{"name":"ansi-styles","version":"4.3.0","description":"ANSI escape codes for styling strings in the terminal","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-styles.git"},"funding":"https://github.com/chalk/ansi-styles?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd","screenshot":"svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"},"dependencies":{"color-convert":"^2.0.1"},"devDependencies":{"@types/color-convert":"^1.9.0","ava":"^2.3.0","svg-term-cli":"^2.1.1","tsd":"^0.11.0","xo":"^0.25.3"},"gitHead":"2d02d5bd070f733179007f0904eb5fb41090395a","bugs":{"url":"https://github.com/chalk/ansi-styles/issues"},"_id":"ansi-styles@4.3.0","_nodeVersion":"14.11.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==","shasum":"edd803628ae71c04c85ae7a0906edad34b648937","tarball":"http://localhost:4260/ansi-styles/ansi-styles-4.3.0.tgz","fileCount":5,"unpackedSize":16978,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeiACCRA9TVsSAnZWagAA5ccP/0DWoQsxVaTeYJuAyJlY\nPaf8cCbWwUQ6ZqFPreR4yYM+mpnSLnSlo8zqctIMofG63LIic4Co358CXP8v\nv9kvZYChYKZHcW7mxzIBUklWHRlrfDfVJSHhFiyAFHAu2X0hw70CZaZEXSGK\n0BiutHMjskT2GCSkheHBtj9g1OICvGFAP3wx1RasvYH7qhXBVFFCC/3Ci/c3\ne58izr3ivXcnOwqyC1ZlFNmL0rsgt91JtMY/7dcm/TouDpwrlO2BVGgJbD0L\nAu+jvjQnBjbjQlxskuS8mu69VvovP3lauf6YP0oeRdX2/UqY8J65/eDc1MN3\nBBcD8S98VglpGM/RGJmpUlCaoWfoz7yN9YyJk6mV/+wOSS2KRhmaiPXws9xY\nXAVdgFrK2cp1qR9RhOhmNng02WCZ3i7oh/1Pvp1DWCgDtASz5YOlT6ikvyHG\nCvqs3m7vkkhrnaEK68soPmbG2Q3O92wwINk7tX4WjH8TyqBaDbu8Z6t9NOwU\noW/v+A1gxWlrtl5eqOaMxo7XYxiF9YZzWWfzk1t6bl1rPICtYVRx2fn/3qqR\n0VRmR3DulMxsyx7ZwW1C210MbuuiRrDMIJZsg/kvuaLWOmh1US+rHa1YrD6g\n8pmirVpcxxBp1Pj44ZjM7W4X6MaboTHHNiE6dtJdJdZrO66hQnB4Bu25w9uX\n10be\r\n=uXWi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCiWmk7MXmf0ZVnUHbCbR2mb9eLfmcN5XoDJMyjv/VX/QIgKOsdyMm5gXdutN1mR1lRxBc/muUtoCWbdoL3I/e7TB4="}]},"directories":{},"_hasShrinkwrap":false},"6.1.0":{"name":"ansi-styles","version":"6.1.0","description":"ANSI escape codes for styling strings in the terminal","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/ansi-styles.git"},"funding":"https://github.com/chalk/ansi-styles?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","engines":{"node":">=12"},"scripts":{"test":"xo && ava && tsd","screenshot":"svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"},"devDependencies":{"ava":"^3.15.0","svg-term-cli":"^2.1.1","tsd":"^0.14.0","xo":"^0.38.2"},"gitHead":"cd0b0cb59337bfd7d3669b2d0fcde7ff661a83a6","bugs":{"url":"https://github.com/chalk/ansi-styles/issues"},"_id":"ansi-styles@6.1.0","_nodeVersion":"12.22.1","_npmVersion":"6.14.10","dist":{"integrity":"sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==","shasum":"87313c102b8118abd57371afab34618bf7350ed3","tarball":"http://localhost:4260/ansi-styles/ansi-styles-6.1.0.tgz","fileCount":5,"unpackedSize":15535,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgf+daCRA9TVsSAnZWagAAQOIP/Anx6U+vOfkg1KDr5iZJ\nmkSxedAzNH3576oI9roh7wbQSQ/fQGN/jaY0npudzvsa/NLfWuCQCt00dtQ/\nAyKY5NLtfb5VejLgIF8AF1CtJOHA88TY+aRoA+hL+eUA1PkOY9Y+1lV9U1QO\nJaUVlLQr/FIzY21pSYo6+V0lLmPGgMIs/ULdjpr2X5dZ+7Ff2DzrsQtQV2k9\nAc0G2XQRyp/NTDHCHnfOSnK9zKuFhjY2sjbNn0Gp9r3T7hTcopKqPz6FhIKY\nAUo9rqswIvAYXDEAXCoGWzJoiRsDldxTkf+mb9RV9e2jAUsGAfvJLXntizp3\n7tvMEYINoHPzs4CvRqcYonYeY7FREhTWaaNTxQzy/Ae1mARAmlIl0vXuZifP\nfglSd6wrqcz4euaOc3YRkW9eT+9q4cK7JCjyssc4vdHBMn2Yd5+A4hTn51AB\n5I9QJ8Xc0nWy712korCpcR9cPXrwve50pD2AxEinp+hyQzpPzzKyfDQHwjpe\nVbTu8/aAhDK1s19qFmUY4VtUqS1Uu8NjXpaWOlpdD4BI+dh43tsmSz61RWfJ\nhDIC39htWlyhlak1mCBQIFlGTZPr7GkEeNbZLW8MCpnfgXp7Lcv3Konzm/C+\nrsQw6XBGf4O9Tp25Q0EFyl8uaNb3wOXgSCpUydBe2DFtJWpTHGIX8L9nuVUQ\n5e9Z\r\n=m2Tr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCA/tHV/Ykpiby73wpS1NtBNs2fJbTeFyJQgDAmuDFbsQIgHtpoqyHPZTFeQ4S3cP52dKS24bMMNntxC5FqTsPsP1c="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# ansi-styles\n\n> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal\n\nYou probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.\n\n<img src=\"screenshot.svg\" width=\"900\">\n\n## Install\n\n```\n$ npm install ansi-styles\n```\n\n## Usage\n\n```js\nimport styles from 'ansi-styles';\n\nconsole.log(`${styles.green.open}Hello world!${styles.green.close}`);\n\n\n// Color conversion between 256/truecolor\n// NOTE: When converting from truecolor to 256 colors, the original color\n// may be degraded to fit the new color palette. This means terminals\n// that do not support 16 million colors will best-match the\n// original color.\nconsole.log(`${styles.color.ansi(styles.rgbToAnsi(199, 20, 250))}Hello World${styles.color.close}`)\nconsole.log(`${styles.color.ansi256(styles.rgbToAnsi256(199, 20, 250))}Hello World${styles.color.close}`)\nconsole.log(`${styles.color.ansi16m(...styles.hexToRgb('#abcdef'))}Hello World${styles.color.close}`)\n```\n\n## API\n\nEach style has an `open` and `close` property.\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(Not widely supported)*\n- `underline`\n- `overline` *Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash.*\n- `inverse`\n- `hidden`\n- `strikethrough` *(Not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `blackBright` (alias: `gray`, `grey`)\n- `redBright`\n- `greenBright`\n- `yellowBright`\n- `blueBright`\n- `magentaBright`\n- `cyanBright`\n- `whiteBright`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n- `bgBlackBright` (alias: `bgGray`, `bgGrey`)\n- `bgRedBright`\n- `bgGreenBright`\n- `bgYellowBright`\n- `bgBlueBright`\n- `bgMagentaBright`\n- `bgCyanBright`\n- `bgWhiteBright`\n\n## Advanced usage\n\nBy default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.\n\n- `styles.modifier`\n- `styles.color`\n- `styles.bgColor`\n\n###### Example\n\n```js\nimport styles from 'ansi-styles';\n\nconsole.log(styles.color.green.open);\n```\n\nRaw escape codes (i.e. without the CSI escape prefix `\\u001B[` and render mode postfix `m`) are available under `styles.codes`, which returns a `Map` with the open codes as keys and close codes as values.\n\n###### Example\n\n```js\nimport styles from 'ansi-styles';\n\nconsole.log(styles.codes.get(36));\n//=> 39\n```\n\n## 16 / 256 / 16 million (TrueColor) support\n\n`ansi-styles` allows converting between various color formats and ANSI escapes, with support for 16, 256 and [16 million colors](https://gist.github.com/XVilka/8346728).\n\nThe following color spaces are supported:\n\n- `rgb`\n- `hex`\n- `ansi256`\n- `ansi`\n\nTo use these, call the associated conversion function with the intended output, for example:\n\n```js\nimport styles from 'ansi-styles';\n\nstyles.color.ansi(styles.rgbToAnsi(100, 200, 15)); // RGB to 16 color ansi foreground code\nstyles.bgColor.ansi(styles.hexToAnsi('#C0FFEE')); // HEX to 16 color ansi foreground code\n\nstyles.color.ansi256(styles.rgbToAnsi256(100, 200, 15)); // RGB to 256 color ansi foreground code\nstyles.bgColor.ansi256(styles.hexToAnsi256('#C0FFEE')); // HEX to 256 color ansi foreground code\n\nstyles.color.ansi16m(100, 200, 15); // RGB to 16 million color foreground code\nstyles.bgColor.ansi16m(...styles.hexToRgb('#C0FFEE')); // Hex (RGB) to 16 million color foreground code\n```\n\n## Related\n\n- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n## For enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"repository":{"type":"git","url":"git+https://github.com/chalk/ansi-styles.git"},"homepage":"https://github.com/chalk/ansi-styles#readme","bugs":{"url":"https://github.com/chalk/ansi-styles/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "ansi-styles",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "dist-tags": {
+ "latest": "6.1.0"
+ },
+ "versions": {
+ "4.3.0": {
+ "name": "ansi-styles",
+ "version": "4.3.0",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-styles.git"
+ },
+ "funding": "https://github.com/chalk/ansi-styles?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd",
+ "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
+ },
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "devDependencies": {
+ "@types/color-convert": "^1.9.0",
+ "ava": "^2.3.0",
+ "svg-term-cli": "^2.1.1",
+ "tsd": "^0.11.0",
+ "xo": "^0.25.3"
+ },
+ "gitHead": "2d02d5bd070f733179007f0904eb5fb41090395a",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-styles/issues"
+ },
+ "_id": "ansi-styles@4.3.0",
+ "_nodeVersion": "14.11.0",
+ "_npmVersion": "6.14.8",
+ "dist": {
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "shasum": "edd803628ae71c04c85ae7a0906edad34b648937",
+ "tarball": "http://localhost:4260/ansi-styles/ansi-styles-4.3.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 16978
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "6.1.0": {
+ "name": "ansi-styles",
+ "version": "6.1.0",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-styles.git"
+ },
+ "funding": "https://github.com/chalk/ansi-styles?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "type": "module",
+ "exports": "./index.js",
+ "engines": {
+ "node": ">=12"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd",
+ "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
+ },
+ "devDependencies": {
+ "ava": "^3.15.0",
+ "svg-term-cli": "^2.1.1",
+ "tsd": "^0.14.0",
+ "xo": "^0.38.2"
+ },
+ "gitHead": "cd0b0cb59337bfd7d3669b2d0fcde7ff661a83a6",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-styles/issues"
+ },
+ "_id": "ansi-styles@6.1.0",
+ "_nodeVersion": "12.22.1",
+ "_npmVersion": "6.14.10",
+ "dist": {
+ "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==",
+ "shasum": "87313c102b8118abd57371afab34618bf7350ed3",
+ "tarball": "http://localhost:4260/ansi-styles/ansi-styles-6.1.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 15535
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-styles.git"
+ },
+ "homepage": "https://github.com/chalk/ansi-styles#readme",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-styles/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/asn1/registry.json b/tests/registry/npm/asn1/registry.json
index 0270dfdf6..3ebe65524 100644
--- a/tests/registry/npm/asn1/registry.json
+++ b/tests/registry/npm/asn1/registry.json
@@ -1 +1,67 @@
-{"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","dist-tags":{"latest":"0.2.6"},"versions":{"0.2.6":{"author":{"name":"Joyent","url":"joyent.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.2.6","repository":{"type":"git","url":"git+https://github.com/joyent/node-asn1.git"},"main":"lib/index.js","dependencies":{"safer-buffer":"~2.1.0"},"devDependencies":{"istanbul":"^0.3.6","faucet":"0.0.1","tape":"^3.5.0","eslint":"2.13.1","eslint-plugin-joyent":"~1.3.0"},"scripts":{"test":"tape ./test/ber/*.test.js"},"license":"MIT","gitHead":"c80ab61a3ba35d77deb0a44b9c2bb7abc246dc09","bugs":{"url":"https://github.com/joyent/node-asn1/issues"},"_id":"asn1@0.2.6","_nodeVersion":"12.22.7","_npmVersion":"6.14.13","dist":{"integrity":"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==","shasum":"0d3a7bb6e64e02a90c0303b31f292868ea09a08d","tarball":"http://localhost:4260/asn1/asn1-0.2.6.tgz","fileCount":10,"unpackedSize":19757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh2j12CRA9TVsSAnZWagAAAMsP/0OlnHNAA18YRr7ioggR\n0/2/6wNWwbA6EpcIUZiWmdaWoWfQBVWKkXRjNT0zLiW0ck1rYrrg9P+DCgXK\nsxW6zBlYirwR8Og2uuxH+Ja2n3CZdZfLo/qifjfViDH2ibbrdF5j2WwKfkeE\nW6SvhktnocxEV1d+9+0fDn+8uC44H/A547c58Ed4HXYCrLKEXwbCb15oppSt\n7qbqGo/Cpht/pBK3P/8RMTNaGifiNp129YL5CfGo5CDUXRF1z6ofZUpFLKt1\n6X0hd7Iok4o+s8JBHDIUhpeMX7Komdz4jX/i+wwzuHldsmg2BeDo5n7VLkl8\nEsnMCQsnrn6ZTWO+QsCxWO+80Fr7+ADtfTm8XDAUR2I+LMtTjC53CcIDaikx\nicieoULaI/Bnq0Bwndtwi2yyog4pAyCZIISNA//WDbbDgzmFEoCUb6L8WTAH\nDD63RiXCDq1gXa3AVaIgn/1PCVNO3ox69lEx5HKPdPHXzX4hObRPOt2+x9QA\nPR1/r4wYO8+awxWCxvbvto8lpmU+9O/QrECqqzqEs/GDUGfBHYHeC5tHb+is\nI/KiqTsgi274xy7jSIjFzL8o4x0xeE5GuHAi7g4gAw/YzxmA5wgOohQ/aqva\ncrjx0nnNVWsQvgf/5Tmf6FK2J3xxaY2n56Gwb4ClQ4G2PzyUDpLskjQMtZk0\n1zf9\r\n=FhY3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDh8rHXgZYfiyydIhYCAvX5qKC8LudijMiGGIeoviWu6gIgHcEVesBYAyn1gYDWhR8vKfZd4gil1GtyOlz0Bsp4bm4="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Joyent","url":"joyent.com"},"repository":{"type":"git","url":"git+https://github.com/joyent/node-asn1.git"},"readme":"node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.\nCurrently BER encoding is supported; at some point I'll likely have to do DER.\n\n## Usage\n\nMostly, if you're *actually* needing to read and write ASN.1, you probably don't\nneed this readme to explain what and why. If you have no idea what ASN.1 is,\nsee this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nThe source is pretty much self-explanatory, and has read/write methods for the\ncommon types out there.\n\n### Decoding\n\nThe following reads an ASN.1 sequence with a boolean.\n\n var Ber = require('asn1').Ber;\n\n var reader = new Ber.Reader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff]));\n\n reader.readSequence();\n console.log('Sequence len: ' + reader.length);\n if (reader.peek() === Ber.Boolean)\n console.log(reader.readBoolean());\n\n### Encoding\n\nThe following generates the same payload as above.\n\n var Ber = require('asn1').Ber;\n\n var writer = new Ber.Writer();\n\n writer.startSequence();\n writer.writeBoolean(true);\n writer.endSequence();\n\n console.log(writer.buffer);\n\n## Installation\n\n npm install asn1\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/joyent/node-asn1/issues>.\n","readmeFilename":"README.md","homepage":"https://github.com/joyent/node-asn1#readme","bugs":{"url":"https://github.com/joyent/node-asn1/issues"},"license":"MIT"}
+{
+ "name": "asn1",
+ "description": "Contains parsers and serializers for ASN.1 (currently BER only)",
+ "dist-tags": {
+ "latest": "0.2.6"
+ },
+ "versions": {
+ "0.2.6": {
+ "author": {
+ "name": "Joyent",
+ "url": "joyent.com"
+ },
+ "name": "asn1",
+ "description": "Contains parsers and serializers for ASN.1 (currently BER only)",
+ "version": "0.2.6",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/joyent/node-asn1.git"
+ },
+ "main": "lib/index.js",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ },
+ "devDependencies": {
+ "istanbul": "^0.3.6",
+ "faucet": "0.0.1",
+ "tape": "^3.5.0",
+ "eslint": "2.13.1",
+ "eslint-plugin-joyent": "~1.3.0"
+ },
+ "scripts": {
+ "test": "tape ./test/ber/*.test.js"
+ },
+ "license": "MIT",
+ "gitHead": "c80ab61a3ba35d77deb0a44b9c2bb7abc246dc09",
+ "bugs": {
+ "url": "https://github.com/joyent/node-asn1/issues"
+ },
+ "_id": "asn1@0.2.6",
+ "_nodeVersion": "12.22.7",
+ "_npmVersion": "6.14.13",
+ "dist": {
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "shasum": "0d3a7bb6e64e02a90c0303b31f292868ea09a08d",
+ "tarball": "http://localhost:4260/asn1/asn1-0.2.6.tgz",
+ "fileCount": 10,
+ "unpackedSize": 19757
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Joyent",
+ "url": "joyent.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/joyent/node-asn1.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/joyent/node-asn1#readme",
+ "bugs": {
+ "url": "https://github.com/joyent/node-asn1/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/assertion-error/registry.json b/tests/registry/npm/assertion-error/registry.json
index 546f41faa..438e46c86 100644
--- a/tests/registry/npm/assertion-error/registry.json
+++ b/tests/registry/npm/assertion-error/registry.json
@@ -1 +1,65 @@
-{"name":"assertion-error","description":"Error constructor for test and validation frameworks that implements standardized AssertionError specification.","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"name":"assertion-error","version":"1.1.0","description":"Error constructor for test and validation frameworks that implements standardized AssertionError specification.","author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"license":"MIT","types":"./index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/assertion-error.git"},"engines":{"node":"*"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"component":"*","typescript":"^2.6.1"},"gitHead":"faa3f8cbbdba74d2760f9d2e95c008ba9ce4812e","bugs":{"url":"https://github.com/chaijs/assertion-error/issues"},"_id":"assertion-error@1.1.0","_npmVersion":"5.6.0","_nodeVersion":"8.8.0","dist":{"integrity":"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==","shasum":"e60b6b0e8f301bd97e5375215bda406c85118c0b","tarball":"http://localhost:4260/assertion-error/assertion-error-1.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBLKjetp37+0lhhi9deyZvXmBZcF/3rW0uJJtY/162bGAiA/3giMIaJv7sRAruur386mr5e9OzyX7FBDJo6ugT1cxQ=="}]},"directories":{}}},"readme":"<p align=center>\n AssertionError and AssertionResult classes.\n</p>\n\n<p align=center>\n <a href=\"https://github.com/chaijs/assertion-error/actions\">\n <img\n alt=\"build:?\"\n src=\"https://github.com/chaijs/assertion-error/actions/workflows/nodejs.yml/badge.svg\"\n />\n </a><a href=\"https://www.npmjs.com/package/assertion-error\">\n <img\n alt=\"downloads:?\"\n src=\"https://img.shields.io/npm/dm/assertion-error.svg\"\n />\n </a><a href=\"\">\n <img\n alt=\"devDependencies:none\"\n src=\"https://img.shields.io/badge/dependencies-none-brightgreen\"\n />\n </a>\n</p>\n\n## What is AssertionError?\n\nAssertion Error is a module that contains two classes: `AssertionError`, which\nis an instance of an `Error`, and `AssertionResult` which is not an instance of\nError.\n\nThese can be useful for returning from a function - if the function \"succeeds\"\nreturn an `AssertionResult` and if the function fails return (or throw) an\n`AssertionError`.\n\nBoth `AssertionError` and `AssertionResult` implement the `Result` interface:\n\n```typescript\ninterface Result {\n name: 'AssertionError' | 'AssertionResult'\n ok: boolean\n toJSON(...args: unknown[]): Record<string, unknown>\n}\n```\n\nSo if a function returns `AssertionResult | AssertionError` it is easy to check\n_which_ one is returned by checking either `.name` or `.ok`, or check `instanceof Error`.\n\n## Installation\n\n### Node.js\n\n`assertion-error` is available on [npm](http://npmjs.org).\n\n```\n$ npm install --save assertion-error\n```\n\n### Deno\n\n`assertion_error` is available on [Deno.land](https://deno.land/x/assertion_error)\n\n```typescript\nimport {AssertionError, AssertionResult} from 'https://deno.land/x/assertion_error@2.0.0/mod.ts'\n```\n","author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/assertion-error.git"},"homepage":"https://github.com/chaijs/assertion-error#readme","bugs":{"url":"https://github.com/chaijs/assertion-error/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "assertion-error",
+ "description": "Error constructor for test and validation frameworks that implements standardized AssertionError specification.",
+ "dist-tags": {
+ "latest": "1.1.0"
+ },
+ "versions": {
+ "1.1.0": {
+ "name": "assertion-error",
+ "version": "1.1.0",
+ "description": "Error constructor for test and validation frameworks that implements standardized AssertionError specification.",
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@qualiancy.com",
+ "url": "http://qualiancy.com"
+ },
+ "license": "MIT",
+ "types": "./index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/assertion-error.git"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "main": "./index",
+ "scripts": {
+ "test": "make test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "component": "*",
+ "typescript": "^2.6.1"
+ },
+ "gitHead": "faa3f8cbbdba74d2760f9d2e95c008ba9ce4812e",
+ "bugs": {
+ "url": "https://github.com/chaijs/assertion-error/issues"
+ },
+ "_id": "assertion-error@1.1.0",
+ "_npmVersion": "5.6.0",
+ "_nodeVersion": "8.8.0",
+ "dist": {
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "shasum": "e60b6b0e8f301bd97e5375215bda406c85118c0b",
+ "tarball": "http://localhost:4260/assertion-error/assertion-error-1.1.0.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@qualiancy.com",
+ "url": "http://qualiancy.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/assertion-error.git"
+ },
+ "homepage": "https://github.com/chaijs/assertion-error#readme",
+ "bugs": {
+ "url": "https://github.com/chaijs/assertion-error/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/autoprefixer/registry.json b/tests/registry/npm/autoprefixer/registry.json
index 22013e2fc..3cccb2168 100644
--- a/tests/registry/npm/autoprefixer/registry.json
+++ b/tests/registry/npm/autoprefixer/registry.json
@@ -1 +1,47 @@
-{"name":"autoprefixer","dist-tags":{"latest":"10.4.14"},"versions":{"10.4.14":{"name":"autoprefixer","version":"10.4.14","dependencies":{"browserslist":"^4.21.5","caniuse-lite":"^1.0.30001464","fraction.js":"^4.2.0","normalize-range":"^0.1.2","picocolors":"^1.0.0","postcss-value-parser":"^4.2.0"},"peerDependencies":{"postcss":"^8.1.0"},"bin":{"autoprefixer":"bin/autoprefixer"},"dist":{"integrity":"sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==","shasum":"e28d49902f8e759dd25b153264e862df2705f79d","tarball":"http://localhost:4260/autoprefixer/autoprefixer-10.4.14.tgz","fileCount":83,"unpackedSize":198756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbaPVpk/hRBScv7vP4h58dCbdZctLzVGOSM40BEdLIZgIhANmKh9JUosI3TCNjA0Rgf65I78+qL4Ik60ZfP7Nz4HY8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkClKvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPCQ//UACWicbRKEnz0WMamKne+Py6jGL3SxUzymlmPvlsxKcI/4B6\r\nPvU57CyH4E1jlk/NMXcDKX9TMMkL8wgrTw1kFW8/X/kEV3eb/ioBo9dVDfs1\r\nF9nE3UH6wj9x7XoJ7HiXAb8wgAXlNh/UXIRYz0NOcWbol+MSFTIUvWuEapYa\r\ndFg9T1WKI5/GzMoJUw+3D+f2MHwTQjLqHJSUYsVa82OeHD3ZINSsj4qBhgLD\r\nG3j+TQIU8N3nPO/7sCHErgXY3thR519q+Lfw+/5oW//kf7H9hp4e5PUYICWS\r\nJS0PXSwXmHHgpfK6//naPfqAM05tsXL6ioR3qlTusw7vMXaSC4l1EqzaNj1n\r\nfh5Ku34vwp3/blMGZIIHCkfiCWzrJFqg5NywXagJdvo0A1OzzucW9DI5Jmvy\r\nCPyJ0pOvuILGEOhm2t/yQ6fPGbg7TI4V5C7nefS/401IQPR2ee8SRr4foaV7\r\nxqtAD8Tikq0PTuAK39uEWSpywOVTZ4lvVm7Le/uNiNaP+28FC6vB8IuCQ85q\r\nh3HD5XQDPyf3xz26SbbOfZImysSsSEbxVfnhF6UKsPBkQrWkhx2zQrjB6pz+\r\nln6T6ZQjQcZiF5Vf8cW81hEFB61d2/+mUJHUpkYI0n6wMTr0ih4DgsmCa62G\r\nSSKml+YGOLmnouBtf56v+/+5cw3ljXmJT7I=\r\n=wMzp\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10 || ^12 || >=14"},"funding":[{"type":"opencollective","url":"https://opencollective.com/postcss/"},{"type":"tidelift","url":"https://tidelift.com/funding/github/npm/autoprefixer"}]}},"modified":"2023-03-09T21:42:07.794Z"}
+{
+ "name": "autoprefixer",
+ "dist-tags": {
+ "latest": "10.4.14"
+ },
+ "versions": {
+ "10.4.14": {
+ "name": "autoprefixer",
+ "version": "10.4.14",
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "dist": {
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "shasum": "e28d49902f8e759dd25b153264e862df2705f79d",
+ "tarball": "http://localhost:4260/autoprefixer/autoprefixer-10.4.14.tgz",
+ "fileCount": 83,
+ "unpackedSize": 198756
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ]
+ }
+ },
+ "modified": "2023-03-09T21:42:07.794Z"
+}
diff --git a/tests/registry/npm/balanced-match/registry.json b/tests/registry/npm/balanced-match/registry.json
index 2be5c28c9..1dc1cf15c 100644
--- a/tests/registry/npm/balanced-match/registry.json
+++ b/tests/registry/npm/balanced-match/registry.json
@@ -1 +1,80 @@
-{"name":"balanced-match","description":"Match balanced character pairs, like \"{\" and \"}\"","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.2":{"name":"balanced-match","description":"Match balanced character pairs, like \"{\" and \"}\"","version":"1.0.2","repository":{"type":"git","url":"git://github.com/juliangruber/balanced-match.git"},"main":"index.js","scripts":{"test":"tape test/test.js","bench":"matcha test/bench.js"},"devDependencies":{"matcha":"^0.7.0","tape":"^4.6.0"},"author":{"name":"Julian Gruber","email":"mail@juliangruber.com","url":"http://juliangruber.com"},"license":"MIT","testling":{"files":"test/*.js","browsers":["ie/8..latest","firefox/20..latest","firefox/nightly","chrome/25..latest","chrome/canary","opera/12..latest","opera/next","safari/5.1..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2..latest"]},"gitHead":"c7412e09b95d6ad97fd1e2996f6adca7626a9ae8","bugs":{"url":"https://github.com/juliangruber/balanced-match/issues"},"_id":"balanced-match@1.0.2","_nodeVersion":"15.9.0","_npmVersion":"7.7.6","dist":{"integrity":"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==","shasum":"e83e3a7e3f300b34cb9d87f615fa0cbf357690ee","tarball":"http://localhost:4260/balanced-match/balanced-match-1.0.2.tgz","fileCount":5,"unpackedSize":6939,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgbFk9CRA9TVsSAnZWagAAZCkP/2oCPlLyH1O+2fxJepxC\nP64dIPH4FmdtcuRV6m9JSSnNayjLyl7KZSkzngJveJAVMwBH2oSO40HVruAc\njNGdawU0sm41Tvkxm0K9AhiT5pfqBHv6KBj/sR5+2iF56zAM7pxrc8eTsgj9\nHBAYq5ZoePKf+Kki77ilWwK1Z7VXekk3KNgPd4jsbZ58JGL2dLVmqJcOPAfx\nTRECI9NV5oyHl+EsOGnMnAB8Z7GvNH+/sVo5lWZkldStJDjlj3mZq9fxMo5I\nw/2pmVPI8dvYYA6r3mp55YYDyvWA49CoRgTHXqEy4tpHmmdTAdB2Je+3j/n0\nvbJm74Ab6CnZnwa9Oaowz+VcKkcczXICTxPj0D+ddvVksD+6VpnAz79Jyia5\nqApDNXnYv+8bdnMwhnA2tQ0vz10HANuZ1xfpXE9Yy4Py/1LsTvExovYsie1G\n9RQ1GkIpGwwyOuzbDqHtrRjduAy35VNtIw2nQTCRLz87w/7DV+RbTvaT1Fp7\nb4WQN9z6BoX0Bl/Qi8PXTDN5J8M83MsRThoYm20M0nAVeGbxrfHTMJoXvxF9\ntlHuV3E7W7x3lvG0za7wLn9p76uOzxDX8Osr5POJ/GpEVciz0PWcbHQHFHUm\nxB+x3O0C9eAdKW/9/7/YA9zMqdqcMuwg6f26neIYIk10oZQyRriBoV6OZtIy\ntw1n\r\n=eH8s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHRQpAKwqTgs0SDP5KcV7MzsuTPMEkHeNqJFBOy5hYMwAiB/QgzhE/4zo/h6mn5Sl6u4YP0UZKqPYCZe5GhyLntdKA=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# balanced-match\n\nMatch balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!\n\n[![CI](https://github.com/juliangruber/balanced-match/actions/workflows/ci.yml/badge.svg)](https://github.com/juliangruber/balanced-match/actions/workflows/ci.yml)\n[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)\n\n## Example\n\nGet the first matching pair of braces:\n\n```js\nimport balanced from 'balanced-match'\n\nconsole.log(balanced('{', '}', 'pre{in{nested}}post'))\nconsole.log(balanced('{', '}', 'pre{first}between{second}post'))\nconsole.log(balanced(/\\s+\\{\\s+/, /\\s+\\}\\s+/, 'pre { in{nest} } post'))\n```\n\nThe matches are:\n\n```bash\n$ node example.js\n{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }\n{ start: 3,\n end: 9,\n pre: 'pre',\n body: 'first',\n post: 'between{second}post' }\n{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }\n```\n\n## API\n\n### const m = balanced(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\nobject with those keys:\n\n- **start** the index of the first match of `a`\n- **end** the index of the matching `b`\n- **pre** the preamble, `a` and `b` not included\n- **body** the match, `a` and `b` not included\n- **post** the postscript, `a` and `b` not included\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.\n\n### const r = balanced.range(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\narray with indexes: `[ <a index>, <b index> ]`.\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install balanced-match\n```\n\n## Security contact information\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure.\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","author":{"name":"Julian Gruber","email":"mail@juliangruber.com","url":"http://juliangruber.com"},"repository":{"type":"git","url":"git://github.com/juliangruber/balanced-match.git"},"homepage":"https://github.com/juliangruber/balanced-match","bugs":{"url":"https://github.com/juliangruber/balanced-match/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "balanced-match",
+ "description": "Match balanced character pairs, like \"{\" and \"}\"",
+ "dist-tags": {
+ "latest": "1.0.2"
+ },
+ "versions": {
+ "1.0.2": {
+ "name": "balanced-match",
+ "description": "Match balanced character pairs, like \"{\" and \"}\"",
+ "version": "1.0.2",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/balanced-match.git"
+ },
+ "main": "index.js",
+ "scripts": {
+ "test": "tape test/test.js",
+ "bench": "matcha test/bench.js"
+ },
+ "devDependencies": {
+ "matcha": "^0.7.0",
+ "tape": "^4.6.0"
+ },
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "license": "MIT",
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/20..latest",
+ "firefox/nightly",
+ "chrome/25..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "gitHead": "c7412e09b95d6ad97fd1e2996f6adca7626a9ae8",
+ "bugs": {
+ "url": "https://github.com/juliangruber/balanced-match/issues"
+ },
+ "_id": "balanced-match@1.0.2",
+ "_nodeVersion": "15.9.0",
+ "_npmVersion": "7.7.6",
+ "dist": {
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "shasum": "e83e3a7e3f300b34cb9d87f615fa0cbf357690ee",
+ "tarball": "http://localhost:4260/balanced-match/balanced-match-1.0.2.tgz",
+ "fileCount": 5,
+ "unpackedSize": 6939
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/balanced-match.git"
+ },
+ "homepage": "https://github.com/juliangruber/balanced-match",
+ "bugs": {
+ "url": "https://github.com/juliangruber/balanced-match/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/bcrypt-pbkdf/registry.json b/tests/registry/npm/bcrypt-pbkdf/registry.json
index c4d2e5800..1c610cfb5 100644
--- a/tests/registry/npm/bcrypt-pbkdf/registry.json
+++ b/tests/registry/npm/bcrypt-pbkdf/registry.json
@@ -1 +1,53 @@
-{"name":"bcrypt-pbkdf","description":"Port of the OpenBSD bcrypt_pbkdf function to pure JS","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.2":{"name":"bcrypt-pbkdf","version":"1.0.2","description":"Port of the OpenBSD bcrypt_pbkdf function to pure JS","repository":{"type":"git","url":"git://github.com/joyent/node-bcrypt-pbkdf.git"},"main":"index.js","dependencies":{"tweetnacl":"^0.14.3"},"devDependencies":{},"license":"BSD-3-Clause","gitHead":"15fa7399a1090ba70d855764f7ace23003bf45f3","bugs":{"url":"https://github.com/joyent/node-bcrypt-pbkdf/issues"},"_id":"bcrypt-pbkdf@1.0.2","scripts":{},"_shasum":"a4301d389b6a43f9b67ff3ca11a3f6637e360e9e","_from":".","_npmVersion":"2.15.11","_nodeVersion":"0.12.18","dist":{"shasum":"a4301d389b6a43f9b67ff3ca11a3f6637e360e9e","tarball":"http://localhost:4260/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz","fileCount":5,"unpackedSize":28994,"integrity":"sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChYywQjt5fZLC9Rra6lu+zL8cvuTL5dMd2eOEhxappzwIhALDhzEgD/8ch3dt4FJFJIkUGloGoubSOB8uag2TfDxIC"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"Port of the OpenBSD `bcrypt_pbkdf` function to pure Javascript. `npm`-ified\nversion of [Devi Mandiri's port](https://github.com/devi/tmp/blob/master/js/bcrypt_pbkdf.js),\nwith some minor performance improvements. The code is copied verbatim (and\nun-styled) from Devi's work.\n\nThis product includes software developed by Niels Provos.\n\n## API\n\n### `bcrypt_pbkdf.pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds)`\n\nDerive a cryptographic key of arbitrary length from a given password and salt,\nusing the OpenBSD `bcrypt_pbkdf` function. This is a combination of Blowfish and\nSHA-512.\n\nSee [this article](http://www.tedunangst.com/flak/post/bcrypt-pbkdf) for\nfurther information.\n\nParameters:\n\n * `pass`, a Uint8Array of length `passlen`\n * `passlen`, an integer Number\n * `salt`, a Uint8Array of length `saltlen`\n * `saltlen`, an integer Number\n * `key`, a Uint8Array of length `keylen`, will be filled with output\n * `keylen`, an integer Number\n * `rounds`, an integer Number, number of rounds of the PBKDF to run\n\n### `bcrypt_pbkdf.hash(sha2pass, sha2salt, out)`\n\nCalculate a Blowfish hash, given SHA2-512 output of a password and salt. Used as\npart of the inner round function in the PBKDF.\n\nParameters:\n\n * `sha2pass`, a Uint8Array of length 64\n * `sha2salt`, a Uint8Array of length 64\n * `out`, a Uint8Array of length 32, will be filled with output\n\n## License\n\nThis source form is a 1:1 port from the OpenBSD `blowfish.c` and `bcrypt_pbkdf.c`.\nAs a result, it retains the original copyright and license. The two files are\nunder slightly different (but compatible) licenses, and are here combined in\none file. For each of the full license texts see `LICENSE`.\n","license":"BSD-3-Clause","readmeFilename":"README.md","homepage":"https://github.com/joyent/node-bcrypt-pbkdf#readme","repository":{"type":"git","url":"git://github.com/joyent/node-bcrypt-pbkdf.git"},"bugs":{"url":"https://github.com/joyent/node-bcrypt-pbkdf/issues"}}
+{
+ "name": "bcrypt-pbkdf",
+ "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS",
+ "dist-tags": {
+ "latest": "1.0.2"
+ },
+ "versions": {
+ "1.0.2": {
+ "name": "bcrypt-pbkdf",
+ "version": "1.0.2",
+ "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/joyent/node-bcrypt-pbkdf.git"
+ },
+ "main": "index.js",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ },
+ "devDependencies": {},
+ "license": "BSD-3-Clause",
+ "gitHead": "15fa7399a1090ba70d855764f7ace23003bf45f3",
+ "bugs": {
+ "url": "https://github.com/joyent/node-bcrypt-pbkdf/issues"
+ },
+ "_id": "bcrypt-pbkdf@1.0.2",
+ "scripts": {},
+ "_shasum": "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e",
+ "_from": ".",
+ "_npmVersion": "2.15.11",
+ "_nodeVersion": "0.12.18",
+ "dist": {
+ "shasum": "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e",
+ "tarball": "http://localhost:4260/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz",
+ "fileCount": 5,
+ "unpackedSize": 28994,
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "license": "BSD-3-Clause",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/joyent/node-bcrypt-pbkdf#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/joyent/node-bcrypt-pbkdf.git"
+ },
+ "bugs": {
+ "url": "https://github.com/joyent/node-bcrypt-pbkdf/issues"
+ }
+}
diff --git a/tests/registry/npm/brace-expansion/registry.json b/tests/registry/npm/brace-expansion/registry.json
index 34bd0add9..f4852991f 100644
--- a/tests/registry/npm/brace-expansion/registry.json
+++ b/tests/registry/npm/brace-expansion/registry.json
@@ -1 +1,84 @@
-{"name":"brace-expansion","description":"Brace expansion as known from sh/bash","dist-tags":{"latest":"2.0.1"},"versions":{"2.0.1":{"name":"brace-expansion","description":"Brace expansion as known from sh/bash","version":"2.0.1","repository":{"type":"git","url":"git://github.com/juliangruber/brace-expansion.git"},"main":"index.js","scripts":{"test":"tape test/*.js","gentest":"bash test/generate.sh","bench":"matcha test/perf/bench.js"},"dependencies":{"balanced-match":"^1.0.0"},"devDependencies":{"@c4312/matcha":"^1.3.1","tape":"^4.6.0"},"author":{"name":"Julian Gruber","email":"mail@juliangruber.com","url":"http://juliangruber.com"},"license":"MIT","testling":{"files":"test/*.js","browsers":["ie/8..latest","firefox/20..latest","firefox/nightly","chrome/25..latest","chrome/canary","opera/12..latest","opera/next","safari/5.1..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2..latest"]},"gitHead":"b9c0e57027317a8d0a56a7ccee28fc478d847da2","bugs":{"url":"https://github.com/juliangruber/brace-expansion/issues"},"_id":"brace-expansion@2.0.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==","shasum":"1edc459e0f0c548486ecf9fc99f2221364b9a0ae","tarball":"http://localhost:4260/brace-expansion/brace-expansion-2.0.1.tgz","fileCount":5,"unpackedSize":11486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgM9lGCRA9TVsSAnZWagAAkYIQAIalRvvQqAOlBPALOfU+\nuIHTUBeNj/D6vRuqzPgWQVtUxRpdvXMI/aLxJx38aeZ6WgCvZWBQn3jItTEs\n3H2zWGue5+DAeWvBCqxSjdVV4ai+4EJuyS4+1D1qTm2syzT0aPdYRlhVMA/s\nOpiuPVHF1vqwSwPMCUXNW1sMi4N0qJzpAInYOCQ2NFUFZb5OssTqYQ1bzdl1\nRq/FtfkqOmz7OC/879lo3SCp+uvdXmkkQnSOGVU65HvzJp/NIvsFk5pHwo68\naRXefo/GRnqGFwFYOSqUUlBVjgEJYFdRVrYN+CNHK8iNJ6cphqz3EE1Edl1d\njT1SsFm9dJCqkfz5M/tW03vbMV88MYKhdDff5/Fugz4vcCAKfp+JcJolxUxz\nYXnB/xH/MsIEFIqwfDHYf+HFDZsZk7kJKm5JUciIV9CORiWtHz4d/y+4FYZM\n48okE1VAa5E7DVlGhTEUJUUt05JHztbm4EPklRd4/il61edoL516wp1XryxB\nSG3Jb+wLHH/ZHUQHpqrnBWvs68fxE8848EwiWIPKUk7pP/MtHdftjw2ouPSa\nD3EeHKJirZ3GAJqmwDy/vrOSB5/bQX82dGviV097AdPpnCAH6HJuaXBww+lN\nXgbxcuBiXlMuQAxpmQ578BOIGHnCo9EeauL2Ik9pHissAPUcpFCSUVZvXC3P\nJbt7\r\n=ayXm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgNFdV3ddgnkb39ucmGYRgdjxRfJEZcnAt+BXCAQaVPgIhAKW05a01tUGrzy0G/gZFOVqMptjiKbs9uy+dDpF0C75F"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# brace-expansion\n\n[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),\nas known from sh/bash, in JavaScript.\n\n[![CI](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml/badge.svg)](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml)\n[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)\n\n## Example\n\n```js\nimport expand from 'brace-expansion'\n\nexpand('file-{a,b,c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('-v{,,}')\n// => ['-v', '-v', '-v']\n\nexpand('file{0..2}.jpg')\n// => ['file0.jpg', 'file1.jpg', 'file2.jpg']\n\nexpand('file-{a..c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('file{2..0}.jpg')\n// => ['file2.jpg', 'file1.jpg', 'file0.jpg']\n\nexpand('file{0..4..2}.jpg')\n// => ['file0.jpg', 'file2.jpg', 'file4.jpg']\n\nexpand('file-{a..e..2}.jpg')\n// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']\n\nexpand('file{00..10..5}.jpg')\n// => ['file00.jpg', 'file05.jpg', 'file10.jpg']\n\nexpand('{{A..C},{a..c}}')\n// => ['A', 'B', 'C', 'a', 'b', 'c']\n\nexpand('ppp{,config,oe{,conf}}')\n// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']\n```\n\n## API\n\n```js\nimport expand from 'brace-expansion'\n```\n\n### const expanded = expand(str)\n\nReturn an array of all possible and valid expansions of `str`. If none are\nfound, `[str]` is returned.\n\nValid expansions are:\n\n```js\n/^(.*,)+(.+)?$/\n// {a,b,...}\n```\n\nA comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nA numeric sequence from `x` to `y` inclusive, with optional increment.\nIf `x` or `y` start with a leading `0`, all the numbers will be padded\nto have equal length. Negative numbers and backwards iteration work too.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nAn alphabetic sequence from `x` to `y` inclusive, with optional increment.\n`x` and `y` must be exactly one character, and if given, `incr` must be a\nnumber.\n\nFor compatibility reasons, the string `${` is not eligible for brace expansion.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install brace-expansion\n```\n\n## Contributors\n\n- [Julian Gruber](https://github.com/juliangruber)\n- [Isaac Z. Schlueter](https://github.com/isaacs)\n- [Haelwenn Monnier](https://github.com/lanodan)\n\n## Sponsors\n\nThis module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!\n\nDo you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!\n\n## Security contact information\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure.\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","author":{"name":"Julian Gruber","email":"mail@juliangruber.com","url":"http://juliangruber.com"},"repository":{"type":"git","url":"git://github.com/juliangruber/brace-expansion.git"},"homepage":"https://github.com/juliangruber/brace-expansion","bugs":{"url":"https://github.com/juliangruber/brace-expansion/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "brace-expansion",
+ "description": "Brace expansion as known from sh/bash",
+ "dist-tags": {
+ "latest": "2.0.1"
+ },
+ "versions": {
+ "2.0.1": {
+ "name": "brace-expansion",
+ "description": "Brace expansion as known from sh/bash",
+ "version": "2.0.1",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/brace-expansion.git"
+ },
+ "main": "index.js",
+ "scripts": {
+ "test": "tape test/*.js",
+ "gentest": "bash test/generate.sh",
+ "bench": "matcha test/perf/bench.js"
+ },
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ },
+ "devDependencies": {
+ "@c4312/matcha": "^1.3.1",
+ "tape": "^4.6.0"
+ },
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "license": "MIT",
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/20..latest",
+ "firefox/nightly",
+ "chrome/25..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "gitHead": "b9c0e57027317a8d0a56a7ccee28fc478d847da2",
+ "bugs": {
+ "url": "https://github.com/juliangruber/brace-expansion/issues"
+ },
+ "_id": "brace-expansion@2.0.1",
+ "_nodeVersion": "14.15.5",
+ "_npmVersion": "6.14.11",
+ "dist": {
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "shasum": "1edc459e0f0c548486ecf9fc99f2221364b9a0ae",
+ "tarball": "http://localhost:4260/brace-expansion/brace-expansion-2.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 11486
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/brace-expansion.git"
+ },
+ "homepage": "https://github.com/juliangruber/brace-expansion",
+ "bugs": {
+ "url": "https://github.com/juliangruber/brace-expansion/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/browserslist/registry.json b/tests/registry/npm/browserslist/registry.json
index a2f363da4..3ebddeaac 100644
--- a/tests/registry/npm/browserslist/registry.json
+++ b/tests/registry/npm/browserslist/registry.json
@@ -1 +1,42 @@
-{"name":"browserslist","dist-tags":{"latest":"4.21.5"},"versions":{"4.21.5":{"name":"browserslist","version":"4.21.5","dependencies":{"caniuse-lite":"^1.0.30001449","electron-to-chromium":"^1.4.284","node-releases":"^2.0.8","update-browserslist-db":"^1.0.10"},"bin":{"browserslist":"cli.js"},"dist":{"integrity":"sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==","shasum":"75c5dae60063ee641f977e00edd3cfb2fb7af6a7","tarball":"http://localhost:4260/browserslist/browserslist-4.21.5.tgz","fileCount":11,"unpackedSize":61255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0XHSVAgL/NPe/i20/v1wK0wtg070T8GIZS18EFOvTLQIgRoQX/or0wH43PUIMYs+x1HJLIjcQQmuA2Zd1JKaZSCI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj17HQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQlg/+IfJutijt+olNrnUqAH5LOGvmMH/c8uXsdFv62GnDXlTdVT2b\r\nIhTtt61aokbgwFhoOdIVQKXqw3k/uGy4pVzT5O4CigvZivbQYPZpYQXYnlxS\r\n/Yf9yL/kH9ekvVjv4XO9fYPPq5JA5UsTJzx1EuxNM1cnYCBl+Ltmu1+PAYJI\r\nW1JacUm+rx4KENjPuYCPzhpq+MqdXcurG/RxxTcIWwNejZhC3JhqVOpBPgF7\r\nZowQ3ooPIFUFStyOoZKUqnC428pLyr4IkBeME2H6jySew/9PL9ooyTsc7zxP\r\nan+iY1OC/gP4DqTtwK6x51pCHkM++sXYr+F645b1JYcAN6cIqkKQh/JgCUnN\r\nX9AifsOMhTgDnp1Ek7kg8tsZI6PO9ZL9gtEmX7ZQLmj8fD79LMj0klwgYc4g\r\n8xnuSjR4GYtt86vLdQTtvGlaLKg3Nqisorh5HhLO6G1ArwA6bS+mdxo+TRpb\r\nfz8DvKncHXQht4oPZ2l/pGv0go20dJwN3MDH+T0r6VDdYAkUQeB14rZeAy6x\r\njc6xkzFQEJ5IXqx+IduopetEClA9O705zKy7gZmr3xR7sxHJhRzfsLeIxj29\r\ny0uu6pJ7QopCVG5Hg8KpKeP1DE0jhPD7masNhtkdSSvao+ELrXATX4Dk5Wga\r\np98gzaP8iuPyJt1O0rPV/vbhBFmgKE8sY3w=\r\n=fvYE\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"},"funding":[{"type":"opencollective","url":"https://opencollective.com/browserslist"},{"type":"tidelift","url":"https://tidelift.com/funding/github/npm/browserslist"}]}},"modified":"2023-03-07T23:22:35.944Z"}
+{
+ "name": "browserslist",
+ "dist-tags": {
+ "latest": "4.21.5"
+ },
+ "versions": {
+ "4.21.5": {
+ "name": "browserslist",
+ "version": "4.21.5",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "dist": {
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "shasum": "75c5dae60063ee641f977e00edd3cfb2fb7af6a7",
+ "tarball": "http://localhost:4260/browserslist/browserslist-4.21.5.tgz",
+ "fileCount": 11,
+ "unpackedSize": 61255
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ]
+ }
+ },
+ "modified": "2023-03-07T23:22:35.944Z"
+}
diff --git a/tests/registry/npm/buildcheck/registry.json b/tests/registry/npm/buildcheck/registry.json
index 9135b1778..161928b8c 100644
--- a/tests/registry/npm/buildcheck/registry.json
+++ b/tests/registry/npm/buildcheck/registry.json
@@ -1 +1,71 @@
-{"name":"buildcheck","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.3":{"name":"buildcheck","version":"0.0.3","author":{"name":"Brian White","email":"mscdex@mscdex.net"},"description":"Build environment checking (a la autoconf) for node.js","main":"./lib/index.js","engines":{"node":">=10.0.0"},"devDependencies":{"@mscdex/eslint-config":"^1.1.0","eslint":"^7.0.0"},"scripts":{"lint":"eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib","lint:fix":"npm run lint -- --fix"},"licenses":[{"type":"MIT","url":"http://github.com/mscdex/buildcheck/raw/master/LICENSE"}],"repository":{"type":"git","url":"git+ssh://git@github.com/mscdex/buildcheck.git"},"_resolved":"","_integrity":"","_from":"https://github.com/mscdex/buildcheck/tarball/v0.0.3","bugs":{"url":"https://github.com/mscdex/buildcheck/issues"},"_id":"buildcheck@0.0.3","_nodeVersion":"10.22.1","_npmVersion":"6.14.6","dist":{"integrity":"sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==","shasum":"70451897a95d80f7807e68fc412eb2e7e35ff4d5","tarball":"http://localhost:4260/buildcheck/buildcheck-0.0.3.tgz","fileCount":14,"unpackedSize":42580,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh2lO2CRA9TVsSAnZWagAAkvwP/3lP+9kQb3DC9grgfRou\nWC8iEZxIbG1ggMTKfiYtOOjQ5tTcBQ5lWX4Wjv4KEHu+8R/AoRC2WJMIqwPj\nX3r8K0i22ptWTZdQPlQKXDPQG/yfRrB1mBz8KEJBW1374RBwe0g4q5MAGJSK\nrUVp9kmAJtugq5hvH0JtCb++9uxnvgZzUaO/geT1oPyb4rF9SEhv7AzSLTTg\nVu3vq49qxghoYCkeiOMsoOOrzu0Eix+nXuWFcuqIuVXaA7IQBTgSqnJwUV6d\nwOgQ8M78sJS2v94X0dTWiYH9Ni/LDgnAK62JvL6GhSaE5r98KgprMmp0ebC2\nfjFRllHBckqV8IJLyQiThKlsBDqomkNI1wRelFQFspGprPLLjbwQxm2s6+6H\n6irH8Z7uup6rivQMzQm3xLt5gokRIhwO6CIXQDEDL1k1WlgGic1rlpscsnat\nd/XkddHZvVu7lAW0uuufy37BhxHFTT3JQDxxHg2gRXzpRlEC3aHl5h7gSNKp\nVyqxgWBxnpwHTNv//WHzEIxGTfDXY03GcjpTx2ofqlvzSp4BcbibSgj/GRf6\nm78a9DAKOqZAqJ2gbRwROuTwmeqq9u3r1+V3PwiSPNWz5U5f6EGxQbtr/OoO\nfNkFz+7UCIKEJmDe3gPI0s/bMcAP/sZpdsfLLtBY6aCuKFzg52t/r8sTzvNN\nzW7f\r\n=jW+A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPtBDI6CdG76mWIhWcyPBzraHJ76pNO2QZnCGDoV+WUQIgYE6E8+IvlPlYV7dil5eQi6IKFs5+gDY1cyv+Db7MUI8="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Build environment checking (a la autoconf) for node.js","homepage":"https://github.com/mscdex/buildcheck#readme","repository":{"type":"git","url":"git+ssh://git@github.com/mscdex/buildcheck.git"},"author":{"name":"Brian White","email":"mscdex@mscdex.net"},"bugs":{"url":"https://github.com/mscdex/buildcheck/issues"},"readme":"# Description\n\nBuild environment checking for [node.js](http://nodejs.org/).\n\nThis allows for autoconf-like functionality for node addons/build scripts.\n\n**Note:** Obsolete and/or exotic build environments or platforms not supported\nby node.js are not supported.\n\n## Requirements\n\n* [node.js](http://nodejs.org/) -- v10.0.0 or newer\n* Supported compilers:\n * gcc\n * clang\n * MSVC 2013+ and Windows SDK 8.1+\n\n## Installation\n\n npm install buildcheck\n\n## Examples\n\n### Check if a C function exists\n\n```js\n'use strict';\n\nconst { BuildEnvironment } = require('buildcheck');\n\nconst buildEnv = new BuildEnvironment();\n\nconsole.log(buildEnv.checkFunction('c', 'preadv2'));\n```\n\n### Check if a C header is usable\n\n```js\n'use strict';\n\nconst { BuildEnvironment } = require('buildcheck');\n\nconst buildEnv = new BuildEnvironment();\n\nconsole.log(buildEnv.checkHeader('c', 'linux/io_uring.h'));\n```\n\n### Try to compile some C code\n\n```js\n'use strict';\n\nconst { BuildEnvironment } = require('buildcheck');\n\nconst buildEnv = new BuildEnvironment();\n\n// Should be a successful compile\nconsole.log(buildEnv.tryCompile('c', 'int main() { return 0; }'));\n\n// Should be a failed compile\nconsole.log(buildEnv.tryCompile('c', 'int main() { return z; }'));\n```\n\n## API\n\n### Exports\n\n* `BuildEnvironment` - The main class for dealing with a build environment.\n\n### BuildEnvironment\n\n#### Methods\n\n* **(constructor)**([< _object_ >config]) - Creates and returns a new BuildEnvironment instance. `config` may contain:\n\n * **compilerC** - _string_ - C compiler command to use. *Note: this is ignored on Windows.* **Default:** `process.env.CC` or `'cc'`\n\n * **compilerCXX** - _string_ - C++ compiler command to use. *Note: this is ignored on Windows.* **Default:** `process.env.CXX` or `'c++'`\n\n * **msvs_version** - _mixed_ - A string or number containing the year of the Visual Studio compiler to use. *Note: this is for Windows only.* **Default:** newest version installed\n\n* **checkDeclared**(< _string_ >lang, < _string_ >symbolName[, < _object_ >options]) - _boolean_ - Checks if a symbol `symbolName` is declared where `lang` is either `'c'` or `'c++'`. Returns `true` if symbol exists, `false` otherwise. `options` may contain:\n\n * **headers** - _array_ - A list of headers to try when checking if the symbol is declared. `checkFunction()` will always first try without a library. If not supplied, a default list of common (platform-specific) headers will be used.\n\n * **searchLibs** - _array_ - A list of library names (without the `'-l'` prefix) to try when checking if the symbol is declared. `checkDeclared()` will always first try without a library.\n\n* **checkFunction**(< _string_ >lang, < _string_ >functionName[, < _object_ >options]) - _boolean_ - Checks if a function `functionName` exists and is linkable where `lang` is either `'c'` or `'c++'`. Returns `true` if function exists, `false` otherwise. `options` may contain:\n\n * **searchLibs** - _array_ - A list of library names (without the `'-l'` prefix) to try when checking for this function. `checkFunction()` will always first try without a library.\n\n* **checkFeature**(< _string_ >featureName) - _mixed_ - Executes a special test for a \"feature\" and returns the result. Supported values for `featureName`:\n\n * `'strerror_r'` - Returns an object containing:\n\n * `declared` - _boolean_ - Whether `strerror_r()` is declared\n\n * `returnsCharPtr` - _boolean_ - If `strerror_r()` is declared, whether it returns `char*` (a GNU extension) or not.\n\n* **checkHeader**(< _string_ >lang, < _string_ >headerName) - _boolean_ - Checks if the header `headerName` exists and is usable where `lang` is either `'c'` or `'c++'`. Returns `true` if the header exists and is usable, `false` otherwise.\n\n* **defines**([< _string_ >lang[, < _boolean_ >rendered]]) - _array_ - Returns a list of features, functions, headers, and symbols known to be defined by this build environment instance. `lang` is either `'c'` or `'c++'` If `lang` is not set, defines for both `'c'` and `'c++'` will be returned. If `rendered` is `true` (defaults to `false`), autoconf-style defines (e.g. \"HAVE_FOO=1\") will be returned instead. Defines coming from features utilize base strings/names from autoconf for better compatibility.\n\n* **libs**([< _string_ >lang]) - _array_ - Returns a list of (`'-l'`-prefixed) libraries known to be required for features and functions defined by this build environment instance. `lang` is either `'c'` or `'c++'` If `lang` is not set, defines for both `'c'` and `'c++'` will be returned.\n\n* **tryCompile**(< _string_ >lang, < _string_ >code[, < _array_ >compilerParams]) - _mixed_ - Attempts to compile `code` where `lang` is either `'c'` or `'c++'`. `compilerParams` is an optional array of compiler/linker flags to include. Returns `true` on successful compilation, or an _Error_ instance with an `output` property containing the compiler error output.\n","readmeFilename":"README.md"}
+{
+ "name": "buildcheck",
+ "dist-tags": {
+ "latest": "0.0.3"
+ },
+ "versions": {
+ "0.0.3": {
+ "name": "buildcheck",
+ "version": "0.0.3",
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "description": "Build environment checking (a la autoconf) for node.js",
+ "main": "./lib/index.js",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "devDependencies": {
+ "@mscdex/eslint-config": "^1.1.0",
+ "eslint": "^7.0.0"
+ },
+ "scripts": {
+ "lint": "eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib",
+ "lint:fix": "npm run lint -- --fix"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://github.com/mscdex/buildcheck/raw/master/LICENSE"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mscdex/buildcheck.git"
+ },
+ "_resolved": "",
+ "_integrity": "",
+ "_from": "https://github.com/mscdex/buildcheck/tarball/v0.0.3",
+ "bugs": {
+ "url": "https://github.com/mscdex/buildcheck/issues"
+ },
+ "_id": "buildcheck@0.0.3",
+ "_nodeVersion": "10.22.1",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
+ "shasum": "70451897a95d80f7807e68fc412eb2e7e35ff4d5",
+ "tarball": "http://localhost:4260/buildcheck/buildcheck-0.0.3.tgz",
+ "fileCount": 14,
+ "unpackedSize": 42580
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Build environment checking (a la autoconf) for node.js",
+ "homepage": "https://github.com/mscdex/buildcheck#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mscdex/buildcheck.git"
+ },
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "bugs": {
+ "url": "https://github.com/mscdex/buildcheck/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/cacache/registry.json b/tests/registry/npm/cacache/registry.json
index ef17c4bf4..683772552 100644
--- a/tests/registry/npm/cacache/registry.json
+++ b/tests/registry/npm/cacache/registry.json
@@ -1 +1,109 @@
-{"name":"cacache","description":"Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.","dist-tags":{"latest":"18.0.3"},"versions":{"18.0.3":{"name":"cacache","version":"18.0.3","author":{"name":"GitHub Inc."},"license":"ISC","_id":"cacache@18.0.3","bugs":{"url":"https://github.com/npm/cacache/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"864e2c18414e1e141ae8763f31e46c2cb96d1b21","tarball":"http://localhost:4260/cacache/cacache-18.0.3.tgz","fileCount":17,"integrity":"sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==","signatures":[{"sig":"MEUCIQCC/lkDf8YH7ovTQqLbvK15fnzGfIJD1adj7kQqKK+peAIgWnG8F6vXojVvrsufossNxTJRwkt3kB21imzmvzAlRxI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/cacache@18.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63516},"main":"lib/index.js","engines":{"node":"^16.14.0 || >=18.0.0"},"gitHead":"f9ebcea7e36403d37cd46da1567f40302b950ea7","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","coverage":"tap","postlint":"template-oss-check","postsnap":"npm run lintfix --","posttest":"npm run lint","npmclilint":"npmcli-lint","test-docker":"docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/cacache.git","type":"git"},"_npmVersion":"10.7.0","description":"Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.","directories":{},"templateOSS":{"publish":"true","version":"4.22.0","windowsCI":false,"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"22.1.0","dependencies":{"tar":"^6.1.11","glob":"^10.2.2","ssri":"^10.0.0","p-map":"^4.0.0","minipass":"^7.0.3","lru-cache":"^10.0.1","@npmcli/fs":"^3.1.0","fs-minipass":"^3.0.0","minipass-flush":"^1.0.5","unique-filename":"^3.0.0","minipass-collect":"^2.0.1","minipass-pipeline":"^1.2.4"},"cache-version":{"index":"5","content":"2"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.0","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/cacache.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/cacache#readme","bugs":{"url":"https://github.com/npm/cacache/issues"},"readme":"# cacache [![npm version](https://img.shields.io/npm/v/cacache.svg)](https://npm.im/cacache) [![license](https://img.shields.io/npm/l/cacache.svg)](https://npm.im/cacache) [![Travis](https://img.shields.io/travis/npm/cacache.svg)](https://travis-ci.org/npm/cacache) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/npm/cacache?svg=true)](https://ci.appveyor.com/project/npm/cacache) [![Coverage Status](https://coveralls.io/repos/github/npm/cacache/badge.svg?branch=latest)](https://coveralls.io/github/npm/cacache?branch=latest)\n\n[`cacache`](https://github.com/npm/cacache) is a Node.js library for managing\nlocal key and content address caches. It's really fast, really good at\nconcurrency, and it will never give you corrupted data, even if cache files\nget corrupted or manipulated.\n\nOn systems that support user and group settings on files, cacache will\nmatch the `uid` and `gid` values to the folder where the cache lives, even\nwhen running as `root`.\n\nIt was written to be used as [npm](https://npm.im)'s local cache, but can\njust as easily be used on its own.\n\n## Install\n\n`$ npm install --save cacache`\n\n## Table of Contents\n\n* [Example](#example)\n* [Features](#features)\n* [Contributing](#contributing)\n* [API](#api)\n * [Using localized APIs](#localized-api)\n * Reading\n * [`ls`](#ls)\n * [`ls.stream`](#ls-stream)\n * [`get`](#get-data)\n * [`get.stream`](#get-stream)\n * [`get.info`](#get-info)\n * [`get.hasContent`](#get-hasContent)\n * Writing\n * [`put`](#put-data)\n * [`put.stream`](#put-stream)\n * [`rm.all`](#rm-all)\n * [`rm.entry`](#rm-entry)\n * [`rm.content`](#rm-content)\n * [`index.compact`](#index-compact)\n * [`index.insert`](#index-insert)\n * Utilities\n * [`clearMemoized`](#clear-memoized)\n * [`tmp.mkdir`](#tmp-mkdir)\n * [`tmp.withTmp`](#with-tmp)\n * Integrity\n * [Subresource Integrity](#integrity)\n * [`verify`](#verify)\n * [`verify.lastRun`](#verify-last-run)\n\n### Example\n\n```javascript\nconst cacache = require('cacache')\nconst fs = require('fs')\n\nconst cachePath = '/tmp/my-toy-cache'\nconst key = 'my-unique-key-1234'\n\n// Cache it! Use `cachePath` as the root of the content cache\ncacache.put(cachePath, key, '10293801983029384').then(integrity => {\n console.log(`Saved content to ${cachePath}.`)\n})\n\nconst destination = '/tmp/mytar.tgz'\n\n// Copy the contents out of the cache and into their destination!\n// But this time, use stream instead!\ncacache.get.stream(\n cachePath, key\n).pipe(\n fs.createWriteStream(destination)\n).on('finish', () => {\n console.log('done extracting!')\n})\n\n// The same thing, but skip the key index.\ncacache.get.byDigest(cachePath, integrityHash).then(data => {\n fs.writeFile(destination, data, err => {\n console.log('tarball data fetched based on its sha512sum and written out!')\n })\n})\n```\n\n### Features\n\n* Extraction by key or by content address (shasum, etc)\n* [Subresource Integrity](#integrity) web standard support\n* Multi-hash support - safely host sha1, sha512, etc, in a single cache\n* Automatic content deduplication\n* Fault tolerance (immune to corruption, partial writes, process races, etc)\n* Consistency guarantees on read and write (full data verification)\n* Lockless, high-concurrency cache access\n* Streaming support\n* Promise support\n* Fast -- sub-millisecond reads and writes including verification\n* Arbitrary metadata storage\n* Garbage collection and additional offline verification\n* Thorough test coverage\n* There's probably a bloom filter in there somewhere. Those are cool, right? 🤔\n\n### Contributing\n\nThe cacache team enthusiastically welcomes contributions and project participation! There's a bunch of things you can do if you want to contribute! Please don't hesitate to jump in if you'd like to, or even ask us questions if something isn't clear.\n\nAll participants and maintainers in this project are expected to follow [Code of Conduct](CODE_OF_CONDUCT.md), and just generally be excellent to each other.\n\nPlease refer to the [Changelog](CHANGELOG.md) for project history details, too.\n\nHappy hacking!\n\n### API\n\n#### <a name=\"ls\"></a> `> cacache.ls(cache) -> Promise<Object>`\n\nLists info for all entries currently in the cache as a single large object. Each\nentry in the object will be keyed by the unique index key, with corresponding\n[`get.info`](#get-info) objects as the values.\n\n##### Example\n\n```javascript\ncacache.ls(cachePath).then(console.log)\n// Output\n{\n 'my-thing': {\n key: 'my-thing',\n integrity: 'sha512-BaSe64/EnCoDED+HAsh=='\n path: '.testcache/content/deadbeef', // joined with `cachePath`\n time: 12345698490,\n size: 4023948,\n metadata: {\n name: 'blah',\n version: '1.2.3',\n description: 'this was once a package but now it is my-thing'\n }\n },\n 'other-thing': {\n key: 'other-thing',\n integrity: 'sha1-ANothER+hasH=',\n path: '.testcache/content/bada55',\n time: 11992309289,\n size: 111112\n }\n}\n```\n\n#### <a name=\"ls-stream\"></a> `> cacache.ls.stream(cache) -> Readable`\n\nLists info for all entries currently in the cache as a single large object.\n\nThis works just like [`ls`](#ls), except [`get.info`](#get-info) entries are\nreturned as `'data'` events on the returned stream.\n\n##### Example\n\n```javascript\ncacache.ls.stream(cachePath).on('data', console.log)\n// Output\n{\n key: 'my-thing',\n integrity: 'sha512-BaSe64HaSh',\n path: '.testcache/content/deadbeef', // joined with `cachePath`\n time: 12345698490,\n size: 13423,\n metadata: {\n name: 'blah',\n version: '1.2.3',\n description: 'this was once a package but now it is my-thing'\n }\n}\n\n{\n key: 'other-thing',\n integrity: 'whirlpool-WoWSoMuchSupport',\n path: '.testcache/content/bada55',\n time: 11992309289,\n size: 498023984029\n}\n\n{\n ...\n}\n```\n\n#### <a name=\"get-data\"></a> `> cacache.get(cache, key, [opts]) -> Promise({data, metadata, integrity})`\n\nReturns an object with the cached data, digest, and metadata identified by\n`key`. The `data` property of this object will be a `Buffer` instance that\npresumably holds some data that means something to you. I'm sure you know what\nto do with it! cacache just won't care.\n\n`integrity` is a [Subresource\nIntegrity](#integrity)\nstring. That is, a string that can be used to verify `data`, which looks like\n`<hash-algorithm>-<base64-integrity-hash>`.\n\nIf there is no content identified by `key`, or if the locally-stored data does\nnot pass the validity checksum, the promise will be rejected.\n\nA sub-function, `get.byDigest` may be used for identical behavior, except lookup\nwill happen by integrity hash, bypassing the index entirely. This version of the\nfunction *only* returns `data` itself, without any wrapper.\n\nSee: [options](#get-options)\n\n##### Note\n\nThis function loads the entire cache entry into memory before returning it. If\nyou're dealing with Very Large data, consider using [`get.stream`](#get-stream)\ninstead.\n\n##### Example\n\n```javascript\n// Look up by key\ncache.get(cachePath, 'my-thing').then(console.log)\n// Output:\n{\n metadata: {\n thingName: 'my'\n },\n integrity: 'sha512-BaSe64HaSh',\n data: Buffer#<deadbeef>,\n size: 9320\n}\n\n// Look up by digest\ncache.get.byDigest(cachePath, 'sha512-BaSe64HaSh').then(console.log)\n// Output:\nBuffer#<deadbeef>\n```\n\n#### <a name=\"get-stream\"></a> `> cacache.get.stream(cache, key, [opts]) -> Readable`\n\nReturns a [Readable Stream](https://nodejs.org/api/stream.html#stream_readable_streams) of the cached data identified by `key`.\n\nIf there is no content identified by `key`, or if the locally-stored data does\nnot pass the validity checksum, an error will be emitted.\n\n`metadata` and `integrity` events will be emitted before the stream closes, if\nyou need to collect that extra data about the cached entry.\n\nA sub-function, `get.stream.byDigest` may be used for identical behavior,\nexcept lookup will happen by integrity hash, bypassing the index entirely. This\nversion does not emit the `metadata` and `integrity` events at all.\n\nSee: [options](#get-options)\n\n##### Example\n\n```javascript\n// Look up by key\ncache.get.stream(\n cachePath, 'my-thing'\n).on('metadata', metadata => {\n console.log('metadata:', metadata)\n}).on('integrity', integrity => {\n console.log('integrity:', integrity)\n}).pipe(\n fs.createWriteStream('./x.tgz')\n)\n// Outputs:\nmetadata: { ... }\nintegrity: 'sha512-SoMeDIGest+64=='\n\n// Look up by digest\ncache.get.stream.byDigest(\n cachePath, 'sha512-SoMeDIGest+64=='\n).pipe(\n fs.createWriteStream('./x.tgz')\n)\n```\n\n#### <a name=\"get-info\"></a> `> cacache.get.info(cache, key) -> Promise`\n\nLooks up `key` in the cache index, returning information about the entry if\none exists.\n\n##### Fields\n\n* `key` - Key the entry was looked up under. Matches the `key` argument.\n* `integrity` - [Subresource Integrity hash](#integrity) for the content this entry refers to.\n* `path` - Filesystem path where content is stored, joined with `cache` argument.\n* `time` - Timestamp the entry was first added on.\n* `metadata` - User-assigned metadata associated with the entry/content.\n\n##### Example\n\n```javascript\ncacache.get.info(cachePath, 'my-thing').then(console.log)\n\n// Output\n{\n key: 'my-thing',\n integrity: 'sha256-MUSTVERIFY+ALL/THINGS=='\n path: '.testcache/content/deadbeef',\n time: 12345698490,\n size: 849234,\n metadata: {\n name: 'blah',\n version: '1.2.3',\n description: 'this was once a package but now it is my-thing'\n }\n}\n```\n\n#### <a name=\"get-hasContent\"></a> `> cacache.get.hasContent(cache, integrity) -> Promise`\n\nLooks up a [Subresource Integrity hash](#integrity) in the cache. If content\nexists for this `integrity`, it will return an object, with the specific single integrity hash\nthat was found in `sri` key, and the size of the found content as `size`. If no content exists for this integrity, it will return `false`.\n\n##### Example\n\n```javascript\ncacache.get.hasContent(cachePath, 'sha256-MUSTVERIFY+ALL/THINGS==').then(console.log)\n\n// Output\n{\n sri: {\n source: 'sha256-MUSTVERIFY+ALL/THINGS==',\n algorithm: 'sha256',\n digest: 'MUSTVERIFY+ALL/THINGS==',\n options: []\n },\n size: 9001\n}\n\ncacache.get.hasContent(cachePath, 'sha521-NOT+IN/CACHE==').then(console.log)\n\n// Output\nfalse\n```\n\n##### <a name=\"get-options\"></a> Options\n\n##### `opts.integrity`\nIf present, the pre-calculated digest for the inserted content. If this option\nis provided and does not match the post-insertion digest, insertion will fail\nwith an `EINTEGRITY` error.\n\n##### `opts.memoize`\n\nDefault: null\n\nIf explicitly truthy, cacache will read from memory and memoize data on bulk read. If `false`, cacache will read from disk data. Reader functions by default read from in-memory cache.\n\n##### `opts.size`\nIf provided, the data stream will be verified to check that enough data was\npassed through. If there's more or less data than expected, insertion will fail\nwith an `EBADSIZE` error.\n\n\n#### <a name=\"put-data\"></a> `> cacache.put(cache, key, data, [opts]) -> Promise`\n\nInserts data passed to it into the cache. The returned Promise resolves with a\ndigest (generated according to [`opts.algorithms`](#optsalgorithms)) after the\ncache entry has been successfully written.\n\nSee: [options](#put-options)\n\n##### Example\n\n```javascript\nfetch(\n 'http://localhost:4260/cacache/cacache-1.0.0.tgz'\n).then(data => {\n return cacache.put(cachePath, 'registry.npmjs.org|cacache@1.0.0', data)\n}).then(integrity => {\n console.log('integrity hash is', integrity)\n})\n```\n\n#### <a name=\"put-stream\"></a> `> cacache.put.stream(cache, key, [opts]) -> Writable`\n\nReturns a [Writable\nStream](https://nodejs.org/api/stream.html#stream_writable_streams) that inserts\ndata written to it into the cache. Emits an `integrity` event with the digest of\nwritten contents when it succeeds.\n\nSee: [options](#put-options)\n\n##### Example\n\n```javascript\nrequest.get(\n 'http://localhost:4260/cacache/cacache-1.0.0.tgz'\n).pipe(\n cacache.put.stream(\n cachePath, 'registry.npmjs.org|cacache@1.0.0'\n ).on('integrity', d => console.log(`integrity digest is ${d}`))\n)\n```\n\n##### <a name=\"put-options\"></a> Options\n\n##### `opts.metadata`\n\nArbitrary metadata to be attached to the inserted key.\n\n##### `opts.size`\n\nIf provided, the data stream will be verified to check that enough data was\npassed through. If there's more or less data than expected, insertion will fail\nwith an `EBADSIZE` error.\n\n##### `opts.integrity`\n\nIf present, the pre-calculated digest for the inserted content. If this option\nis provided and does not match the post-insertion digest, insertion will fail\nwith an `EINTEGRITY` error.\n\n`algorithms` has no effect if this option is present.\n\n##### `opts.integrityEmitter`\n\n*Streaming only* If present, uses the provided event emitter as a source of\ntruth for both integrity and size. This allows use cases where integrity is\nalready being calculated outside of cacache to reuse that data instead of\ncalculating it a second time.\n\nThe emitter must emit both the `'integrity'` and `'size'` events.\n\nNOTE: If this option is provided, you must verify that you receive the correct\nintegrity value yourself and emit an `'error'` event if there is a mismatch.\n[ssri Integrity Streams](https://github.com/npm/ssri#integrity-stream) do this for you when given an expected integrity.\n\n##### `opts.algorithms`\n\nDefault: ['sha512']\n\nHashing algorithms to use when calculating the [subresource integrity\ndigest](#integrity)\nfor inserted data. Can use any algorithm listed in `crypto.getHashes()` or\n`'omakase'`/`'お任せします'` to pick a random hash algorithm on each insertion. You\nmay also use any anagram of `'modnar'` to use this feature.\n\nCurrently only supports one algorithm at a time (i.e., an array length of\nexactly `1`). Has no effect if `opts.integrity` is present.\n\n##### `opts.memoize`\n\nDefault: null\n\nIf provided, cacache will memoize the given cache insertion in memory, bypassing\nany filesystem checks for that key or digest in future cache fetches. Nothing\nwill be written to the in-memory cache unless this option is explicitly truthy.\n\nIf `opts.memoize` is an object or a `Map`-like (that is, an object with `get`\nand `set` methods), it will be written to instead of the global memoization\ncache.\n\nReading from disk data can be forced by explicitly passing `memoize: false` to\nthe reader functions, but their default will be to read from memory.\n\n##### `opts.tmpPrefix`\nDefault: null\n\nPrefix to append on the temporary directory name inside the cache's tmp dir. \n\n#### <a name=\"rm-all\"></a> `> cacache.rm.all(cache) -> Promise`\n\nClears the entire cache. Mainly by blowing away the cache directory itself.\n\n##### Example\n\n```javascript\ncacache.rm.all(cachePath).then(() => {\n console.log('THE APOCALYPSE IS UPON US 😱')\n})\n```\n\n#### <a name=\"rm-entry\"></a> `> cacache.rm.entry(cache, key, [opts]) -> Promise`\n\nAlias: `cacache.rm`\n\nRemoves the index entry for `key`. Content will still be accessible if\nrequested directly by content address ([`get.stream.byDigest`](#get-stream)).\n\nBy default, this appends a new entry to the index with an integrity of `null`.\nIf `opts.removeFully` is set to `true` then the index file itself will be\nphysically deleted rather than appending a `null`.\n\nTo remove the content itself (which might still be used by other entries), use\n[`rm.content`](#rm-content). Or, to safely vacuum any unused content, use\n[`verify`](#verify).\n\n##### Example\n\n```javascript\ncacache.rm.entry(cachePath, 'my-thing').then(() => {\n console.log('I did not like it anyway')\n})\n```\n\n#### <a name=\"rm-content\"></a> `> cacache.rm.content(cache, integrity) -> Promise`\n\nRemoves the content identified by `integrity`. Any index entries referring to it\nwill not be usable again until the content is re-added to the cache with an\nidentical digest.\n\n##### Example\n\n```javascript\ncacache.rm.content(cachePath, 'sha512-SoMeDIGest/IN+BaSE64==').then(() => {\n console.log('data for my-thing is gone!')\n})\n```\n\n#### <a name=\"index-compact\"></a> `> cacache.index.compact(cache, key, matchFn, [opts]) -> Promise`\n\nUses `matchFn`, which must be a synchronous function that accepts two entries\nand returns a boolean indicating whether or not the two entries match, to\ndeduplicate all entries in the cache for the given `key`.\n\nIf `opts.validateEntry` is provided, it will be called as a function with the\nonly parameter being a single index entry. The function must return a Boolean,\nif it returns `true` the entry is considered valid and will be kept in the index,\nif it returns `false` the entry will be removed from the index.\n\nIf `opts.validateEntry` is not provided, however, every entry in the index will\nbe deduplicated and kept until the first `null` integrity is reached, removing\nall entries that were written before the `null`.\n\nThe deduplicated list of entries is both written to the index, replacing the\nexisting content, and returned in the Promise.\n\n#### <a name=\"index-insert\"></a> `> cacache.index.insert(cache, key, integrity, opts) -> Promise`\n\nWrites an index entry to the cache for the given `key` without writing content.\n\nIt is assumed if you are using this method, you have already stored the content\nsome other way and you only wish to add a new index to that content. The `metadata`\nand `size` properties are read from `opts` and used as part of the index entry.\n\nReturns a Promise resolving to the newly added entry.\n\n#### <a name=\"clear-memoized\"></a> `> cacache.clearMemoized()`\n\nCompletely resets the in-memory entry cache.\n\n#### <a name=\"tmp-mkdir\"></a> `> tmp.mkdir(cache, opts) -> Promise<Path>`\n\nReturns a unique temporary directory inside the cache's `tmp` dir. This\ndirectory will use the same safe user assignment that all the other stuff use.\n\nOnce the directory is made, it's the user's responsibility that all files\nwithin are given the appropriate `gid`/`uid` ownership settings to match\nthe rest of the cache. If not, you can ask cacache to do it for you by\ncalling [`tmp.fix()`](#tmp-fix), which will fix all tmp directory\npermissions.\n\nIf you want automatic cleanup of this directory, use\n[`tmp.withTmp()`](#with-tpm)\n\nSee: [options](#tmp-options)\n\n##### Example\n\n```javascript\ncacache.tmp.mkdir(cache).then(dir => {\n fs.writeFile(path.join(dir, 'blablabla'), Buffer#<1234>, ...)\n})\n```\n\n#### <a name=\"tmp-fix\"></a> `> tmp.fix(cache) -> Promise`\n\nSets the `uid` and `gid` properties on all files and folders within the tmp\nfolder to match the rest of the cache.\n\nUse this after manually writing files into [`tmp.mkdir`](#tmp-mkdir) or\n[`tmp.withTmp`](#with-tmp).\n\n##### Example\n\n```javascript\ncacache.tmp.mkdir(cache).then(dir => {\n writeFile(path.join(dir, 'file'), someData).then(() => {\n // make sure we didn't just put a root-owned file in the cache\n cacache.tmp.fix().then(() => {\n // all uids and gids match now\n })\n })\n})\n```\n\n#### <a name=\"with-tmp\"></a> `> tmp.withTmp(cache, opts, cb) -> Promise`\n\nCreates a temporary directory with [`tmp.mkdir()`](#tmp-mkdir) and calls `cb`\nwith it. The created temporary directory will be removed when the return value\nof `cb()` resolves, the tmp directory will be automatically deleted once that \npromise completes.\n\nThe same caveats apply when it comes to managing permissions for the tmp dir's\ncontents.\n\nSee: [options](#tmp-options)\n\n##### Example\n\n```javascript\ncacache.tmp.withTmp(cache, dir => {\n return fs.writeFile(path.join(dir, 'blablabla'), 'blabla contents', { encoding: 'utf8' })\n}).then(() => {\n // `dir` no longer exists\n})\n```\n\n##### <a name=\"tmp-options\"></a> Options\n\n##### `opts.tmpPrefix`\nDefault: null\n\nPrefix to append on the temporary directory name inside the cache's tmp dir. \n\n#### <a name=\"integrity\"></a> Subresource Integrity Digests\n\nFor content verification and addressing, cacache uses strings following the\n[Subresource\nIntegrity spec](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity).\nThat is, any time cacache expects an `integrity` argument or option, it\nshould be in the format `<hashAlgorithm>-<base64-hash>`.\n\nOne deviation from the current spec is that cacache will support any hash\nalgorithms supported by the underlying Node.js process. You can use\n`crypto.getHashes()` to see which ones you can use.\n\n##### Generating Digests Yourself\n\nIf you have an existing content shasum, they are generally formatted as a\nhexadecimal string (that is, a sha1 would look like:\n`5f5513f8822fdbe5145af33b64d8d970dcf95c6e`). In order to be compatible with\ncacache, you'll need to convert this to an equivalent subresource integrity\nstring. For this example, the corresponding hash would be:\n`sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4=`.\n\nIf you want to generate an integrity string yourself for existing data, you can\nuse something like this:\n\n```javascript\nconst crypto = require('crypto')\nconst hashAlgorithm = 'sha512'\nconst data = 'foobarbaz'\n\nconst integrity = (\n hashAlgorithm +\n '-' +\n crypto.createHash(hashAlgorithm).update(data).digest('base64')\n)\n```\n\nYou can also use [`ssri`](https://npm.im/ssri) to have a richer set of functionality\naround SRI strings, including generation, parsing, and translating from existing\nhex-formatted strings.\n\n#### <a name=\"verify\"></a> `> cacache.verify(cache, opts) -> Promise`\n\nChecks out and fixes up your cache:\n\n* Cleans up corrupted or invalid index entries.\n* Custom entry filtering options.\n* Garbage collects any content entries not referenced by the index.\n* Checks integrity for all content entries and removes invalid content.\n* Fixes cache ownership.\n* Removes the `tmp` directory in the cache and all its contents.\n\nWhen it's done, it'll return an object with various stats about the verification\nprocess, including amount of storage reclaimed, number of valid entries, number\nof entries removed, etc.\n\n##### <a name=\"verify-options\"></a> Options\n\n##### `opts.concurrency`\n\nDefault: 20\n\nNumber of concurrently read files in the filesystem while doing clean up.\n\n##### `opts.filter`\nReceives a formatted entry. Return false to remove it.\nNote: might be called more than once on the same entry.\n\n##### `opts.log`\nCustom logger function:\n```\n log: { silly () {} }\n log.silly('verify', 'verifying cache at', cache)\n```\n\n##### Example\n\n```sh\necho somegarbage >> $CACHEPATH/content/deadbeef\n```\n\n```javascript\ncacache.verify(cachePath).then(stats => {\n // deadbeef collected, because of invalid checksum.\n console.log('cache is much nicer now! stats:', stats)\n})\n```\n\n#### <a name=\"verify-last-run\"></a> `> cacache.verify.lastRun(cache) -> Promise`\n\nReturns a `Date` representing the last time `cacache.verify` was run on `cache`.\n\n##### Example\n\n```javascript\ncacache.verify(cachePath).then(() => {\n cacache.verify.lastRun(cachePath).then(lastTime => {\n console.log('cacache.verify was last called on' + lastTime)\n })\n})\n```\n","readmeFilename":"README.md"}
+{
+ "name": "cacache",
+ "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.",
+ "dist-tags": {
+ "latest": "18.0.3"
+ },
+ "versions": {
+ "18.0.3": {
+ "name": "cacache",
+ "version": "18.0.3",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "cacache@18.0.3",
+ "bugs": {
+ "url": "https://github.com/npm/cacache/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "864e2c18414e1e141ae8763f31e46c2cb96d1b21",
+ "tarball": "http://localhost:4260/cacache/cacache-18.0.3.tgz",
+ "fileCount": 17,
+ "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/cacache@18.0.3",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 63516
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ },
+ "gitHead": "f9ebcea7e36403d37cd46da1567f40302b950ea7",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "coverage": "tap",
+ "postlint": "template-oss-check",
+ "postsnap": "npm run lintfix --",
+ "posttest": "npm run lint",
+ "npmclilint": "npmcli-lint",
+ "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/cacache.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.22.0",
+ "windowsCI": false,
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "22.1.0",
+ "dependencies": {
+ "tar": "^6.1.11",
+ "glob": "^10.2.2",
+ "ssri": "^10.0.0",
+ "p-map": "^4.0.0",
+ "minipass": "^7.0.3",
+ "lru-cache": "^10.0.1",
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "unique-filename": "^3.0.0",
+ "minipass-collect": "^2.0.1",
+ "minipass-pipeline": "^1.2.4"
+ },
+ "cache-version": {
+ "index": "5",
+ "content": "2"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.0",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/cacache.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/cacache#readme",
+ "bugs": {
+ "url": "https://github.com/npm/cacache/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/camelcase/registry.json b/tests/registry/npm/camelcase/registry.json
index f691fa992..850775e1d 100644
--- a/tests/registry/npm/camelcase/registry.json
+++ b/tests/registry/npm/camelcase/registry.json
@@ -1 +1,66 @@
-{"name":"camelcase","dist-tags":{"latest":"5.3.1"},"description":"Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`","readme":"# camelcase\n\n> Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`\n\nCorrectly handles Unicode strings.\n\nIf you use this on untrusted user input, don't forget to limit the length to something reasonable.\n\n## Install\n\n```sh\nnpm install camelcase\n```\n\n## Usage\n\n```js\nimport camelCase from 'camelcase';\n\ncamelCase('foo-bar');\n//=> 'fooBar'\n\ncamelCase('foo_bar');\n//=> 'fooBar'\n\ncamelCase('Foo-Bar');\n//=> 'fooBar'\n\ncamelCase('розовый_пушистый_единорог');\n//=> 'розовыйПушистыйЕдинорог'\n\ncamelCase('Foo-Bar', {pascalCase: true});\n//=> 'FooBar'\n\ncamelCase('--foo.bar', {pascalCase: false});\n//=> 'fooBar'\n\ncamelCase('Foo-BAR', {preserveConsecutiveUppercase: true});\n//=> 'fooBAR'\n\ncamelCase('fooBAR', {pascalCase: true, preserveConsecutiveUppercase: true}));\n//=> 'FooBAR'\n\ncamelCase('foo bar');\n//=> 'fooBar'\n\nconsole.log(process.argv[3]);\n//=> '--foo-bar'\ncamelCase(process.argv[3]);\n//=> 'fooBar'\n\ncamelCase(['foo', 'bar']);\n//=> 'fooBar'\n\ncamelCase(['__foo__', '--bar'], {pascalCase: true});\n//=> 'FooBar'\n\ncamelCase(['foo', 'BAR'], {pascalCase: true, preserveConsecutiveUppercase: true})\n//=> 'FooBAR'\n\ncamelCase('lorem-ipsum', {locale: 'en-US'});\n//=> 'loremIpsum'\n```\n\n## API\n\n### camelCase(input, options?)\n\n#### input\n\nType: `string | string[]`\n\nString to convert to camel case.\n\n#### options\n\nType: `object`\n\n##### pascalCase\n\nType: `boolean`\\\nDefault: `false`\n\nUppercase the first character: `foo-bar` → `FooBar`\n\n##### preserveConsecutiveUppercase\n\nType: `boolean`\\\nDefault: `false`\n\nPreserve consecutive uppercase characters: `foo-BAR` → `FooBAR`.\n\n##### locale\n\nType: `false | string | string[]`\\\nDefault: The host environment’s current locale.\n\nThe locale parameter indicates the locale to be used to convert to upper/lower case according to any locale-specific case mappings. If multiple locales are given in an array, the best available locale is used.\n\n```js\nimport camelCase from 'camelcase';\n\ncamelCase('lorem-ipsum', {locale: 'en-US'});\n//=> 'loremIpsum'\n\ncamelCase('lorem-ipsum', {locale: 'tr-TR'});\n//=> 'loremİpsum'\n\ncamelCase('lorem-ipsum', {locale: ['en-US', 'en-GB']});\n//=> 'loremIpsum'\n\ncamelCase('lorem-ipsum', {locale: ['tr', 'TR', 'tr-TR']});\n//=> 'loremİpsum'\n```\n\nSetting `locale: false` ignores the platform locale and uses the [Unicode Default Case Conversion](https://unicode-org.github.io/icu/userguide/transforms/casemappings.html#simple-single-character-case-mapping) algorithm:\n\n```js\nimport camelCase from 'camelcase';\n\n// On a platform with 'tr-TR'\n\ncamelCase('lorem-ipsum');\n//=> 'loremİpsum'\n\ncamelCase('lorem-ipsum', {locale: false});\n//=> 'loremIpsum'\n```\n\n## camelcase for enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of camelcase and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-camelcase?utm_source=npm-camelcase&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n## Related\n\n- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module\n- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase\n- [titleize](https://github.com/sindresorhus/titleize) - Capitalize every word in string\n- [humanize-string](https://github.com/sindresorhus/humanize-string) - Convert a camelized/dasherized/underscored string into a humanized one\n- [camelcase-keys](https://github.com/sindresorhus/camelcase-keys) - Convert object keys to camel case\n","versions":{"5.3.1":{"name":"camelcase","version":"5.3.1","description":"Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/camelcase.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.1","xo":"^0.24.0"},"gitHead":"cbe5a519ec6745adbb5283d5ee8c5c9889050d74","bugs":{"url":"https://github.com/sindresorhus/camelcase/issues"},"_id":"camelcase@5.3.1","_nodeVersion":"8.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==","shasum":"e3c9b31569e106811df242f715725a1f4c494320","tarball":"http://localhost:4260/camelcase/camelcase-5.3.1.tgz","fileCount":5,"unpackedSize":7447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpLZpCRA9TVsSAnZWagAALTcP/1baON6MQMxgPLfVLfwR\n8QRj0qzMyFh7kG92DKB1wI7/9aMYWFPLaYb11734w1mL2omq9SqlTP6BKXOE\nZG4Yl1SQtAA3OUzJbFMi3t9m+/G2yBHHDAFIMQy8l0yXFfxbUmRlQ9Ix5AbR\ni/yU+r9PaJz0qrtRb4dtbTavI/Aj3bBA35lF1PQr/SPFsAGJEMBg7wDL2TDk\nyRQur7ssZjrfr313E1v9hbeWkUrp+i1fiZd9dpSic1TsRutbrCjZLxtWsHMc\nfAQPKqrx94gPgn1qqyYDxtCBdEoKIAhHN9hvPTGJ8r0ueR07DyyaVvaxlTfV\nfAjVDOH6cS5D9y1121j3++MCv7DL3I4XgfYtGkVZj5a0//UJX0aj4GmxFBU8\n7YppCnQiAl9r8Vhz8fHNPlRnx52X/dWxZHD8bDRXsYg1OxiwZecCJJtayB42\nYzX8QB9Wq/u2/EojyyW+4w4CrcVC8wgOMlQP7gaueNHLV/FefEPP+CTshyk/\nwxFS6vkd/tARb5gdQLKxxkvpcvJVyDl7PDXfsYO86rUA2JNf9wCIeAKmC0nX\ngGcEn8Ew7oe5rM6UaTZGBiOJER9Kcf5xZ24/01J82vGWnuqX8tC/C/iWrBKe\nfyXXqmZ38xENnHfb/W2HqTxCuEzg28Imms55Rmi14FmRr8s7ekPdo0PuSwPW\nGg2u\r\n=OQtl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDuztwb7jkQu1SGrBiLhWlKTz4LQmOPO1cvIa0jaYKlHAiEA/HsA5Up0bHLv4nO7dBYAx04p4PXcfzIvW7jFvYNmDzs="}]},"directories":{},"_hasShrinkwrap":false}},"homepage":"https://github.com/sindresorhus/camelcase#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/camelcase.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/camelcase/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "camelcase",
+ "dist-tags": {
+ "latest": "5.3.1"
+ },
+ "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`",
+ "versions": {
+ "5.3.1": {
+ "name": "camelcase",
+ "version": "5.3.1",
+ "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/camelcase.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.1",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "cbe5a519ec6745adbb5283d5ee8c5c9889050d74",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/camelcase/issues"
+ },
+ "_id": "camelcase@5.3.1",
+ "_nodeVersion": "8.15.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "shasum": "e3c9b31569e106811df242f715725a1f4c494320",
+ "tarball": "http://localhost:4260/camelcase/camelcase-5.3.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 7447
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/camelcase#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/camelcase.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/camelcase/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/caniuse-lite/registry.json b/tests/registry/npm/caniuse-lite/registry.json
index 77533496f..f8bce0b59 100644
--- a/tests/registry/npm/caniuse-lite/registry.json
+++ b/tests/registry/npm/caniuse-lite/registry.json
@@ -1 +1,34 @@
-{"name":"caniuse-lite","dist-tags":{"latest":"1.0.30001473"},"versions":{"1.0.30001473":{"name":"caniuse-lite","version":"1.0.30001473","dist":{"integrity":"sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==","shasum":"3859898b3cab65fc8905bb923df36ad35058153c","tarball":"http://localhost:4260/caniuse-lite/caniuse-lite-1.0.30001473.tgz","fileCount":813,"unpackedSize":1938805,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDA96k2NxLblWKvjPtSu8/jH3HEUgnYbV6AXVpA65dMxQIgLWlvFhAnkPArNdmgc0YEHN3oa95Z7aoEF0wKYnX30BY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJTCSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmolzQ//Rk4dCBjbIMaHqohfoo188C8JLY9+IbWiJJi/z5CXdHYch151\r\nF+U+eB2Qt6eTw24+v26xhytLA6k1q2hog3MmWdx3TVZAk8+KYVhuOhwgBqCL\r\nI4IzLj+UacdN5hidQkAYrMaBE4dJP4ilF+jDYloimiZsXvGgUPbkVfdXdL4n\r\nEWNsGSIoBMG95rI386ooT4gmLdyOIZ9U28ADvHqth2QLJRijfE9x/Rgppat1\r\nv8/9J+cpKuSn+6Icnw8HO4C2IXCcJ218oSmo4E5zyfcxKznKcx5Ka4eVtzvb\r\nr/6CSOj1DsC+3QtQgh61hRDbJzEC974hzcuPKcoatumYp7V727RSuVZlwNnZ\r\nLG0LULXSCamVho8f/njyyovG+ZMYXJknbvXH5lZm91SxXxWIjnEm+6jbXXhd\r\nLuGkSw9/ucEQtJ2w6WpH1vIzJSLaLo2o1ipF+ZpAlsIfKT37BHK7JY6o25Nd\r\nvLp/MaE1Hn3MD6/U0pOm4LrDoPmTIZtonnRCIROVK5jg/SHYYyCfn2CiKXYD\r\nZeVrLWNT4c19qGIRIBkplAPHht1Fw56Jb8vZ/9V6cFrIOWKK5P/8SXEs2kW6\r\nxvl50i3ZHgwW6O+GVZdXUNPB1QVoTaFoWNiAprTvhDII5ci1g1UAKHL+w+Xh\r\noH72n9zQcp7ZHE7twH+iUZE0TyxVfUM/G38=\r\n=+MLK\r\n-----END PGP SIGNATURE-----\r\n"},"funding":[{"type":"opencollective","url":"https://opencollective.com/browserslist"},{"type":"tidelift","url":"https://tidelift.com/funding/github/npm/caniuse-lite"},{"type":"github","url":"https://github.com/sponsors/ai"}]}},"modified":"2023-03-30T06:47:46.169Z"}
+{
+ "name": "caniuse-lite",
+ "dist-tags": {
+ "latest": "1.0.30001473"
+ },
+ "versions": {
+ "1.0.30001473": {
+ "name": "caniuse-lite",
+ "version": "1.0.30001473",
+ "dist": {
+ "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==",
+ "shasum": "3859898b3cab65fc8905bb923df36ad35058153c",
+ "tarball": "http://localhost:4260/caniuse-lite/caniuse-lite-1.0.30001473.tgz",
+ "fileCount": 813,
+ "unpackedSize": 1938805
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ }
+ },
+ "modified": "2023-03-30T06:47:46.169Z"
+}
diff --git a/tests/registry/npm/chai/registry.json b/tests/registry/npm/chai/registry.json
index 7ebdd5221..ddf47de87 100644
--- a/tests/registry/npm/chai/registry.json
+++ b/tests/registry/npm/chai/registry.json
@@ -1 +1,88 @@
-{"name":"chai","description":"BDD/TDD assertion library for node.js and the browser. Test framework agnostic.","dist-tags":{"latest":"4.3.6"},"versions":{"4.3.6":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"name":"chai","description":"BDD/TDD assertion library for node.js and the browser. Test framework agnostic.","license":"MIT","version":"4.3.6","repository":{"type":"git","url":"git+https://github.com/chaijs/chai.git"},"bugs":{"url":"https://github.com/chaijs/chai/issues"},"main":"./index","exports":{".":{"require":"./index.js","import":"./index.mjs"},"./*":"./*"},"scripts":{"test":"make test"},"engines":{"node":">=4"},"dependencies":{"assertion-error":"^1.1.0","check-error":"^1.0.2","deep-eql":"^3.0.1","get-func-name":"^2.0.0","loupe":"^2.3.1","pathval":"^1.1.1","type-detect":"^4.0.5"},"devDependencies":{"browserify":"^16.2.3","bump-cli":"^1.1.3","codecov":"^3.0.0","istanbul":"^0.4.3","karma":"^6.1.1","karma-chrome-launcher":"^2.2.0","karma-firefox-launcher":"^1.0.0","karma-mocha":"^2.0.1","karma-sauce-launcher":"^1.2.0","mocha":"^7.1.2"},"gitHead":"529b8b527ba99454471ac67d6aebca9d96cb5dd9","_id":"chai@4.3.6","_nodeVersion":"17.4.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==","shasum":"ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c","tarball":"http://localhost:4260/chai/chai-4.3.6.tgz","fileCount":50,"unpackedSize":750564,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh8UhgCRA9TVsSAnZWagAAv+YP/12t4uBk4xuCAA7pkDcj\nkJm0/jTdaEsIF0pyI4IDDzix91lwXhZCO5fNtlI8CYZ3NwOhtu5hROuOCAlp\ni/knLqRAilVcLpT6xNxOHtxPhaA8fMRMMyrtw029iH2nHevW3kt2kbzG3gNi\nWXO0E8EFmMURiAHKqucb9aV+Qbzh/d8Dmm67JoFPKY0bJktcbeSRB8qyNhTQ\nmTcKKpL4ZEboZ9ofpiICSLyEzmSU+3Hv53WlomWMG6nUz1+JsEZ2bXABQ6WJ\niqr+LkM2ipKgeq7ZNe1dTnY6h+1TpSXPidt6R2qtkdWavr0UuYNUp85eo0/C\n6HgtYcuYm2UysKrXJkzqpEl1FTzxo8atuVFubWphpvuPShkXpxj7Bi670Z8h\nuqpU2DX6CEZlBLhX6zF2Ly/DPDHDaKj9GMafg5g8zTOTXphnWOJ5vYmvqF7e\nTM9qwsxv1kPbZYYdmGUF1ADBDjy3vwG/+8py8j7TMLIa7LiMeR4mCUF4wLvU\nbSpxTYfAeHX7CQDTej1fD3LkwAzyBhHHEpJY2yRRwll/9FaNwb9JM8YcxpRO\nH+BsL9Mji/atpoK2WxEX/oqep17sGEA8yafHs9UiIqTo1fvunttqUwyYD+Lx\nd84syQ873+mg/tDuhx5L2AjmbANrQJAAjngMUBNOG9/NZz0sYQ9kSChqb9aK\nT/4b\r\n=ckEl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDsAllykGfti9wvQhGkKpJ7jdFVZ99oozpeX8CutT2MQIhAO3f06HA/ygzzZLliUMSLrxEdzCnQmxGZH5TQMVZVGfj"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"ChaiJS\" src=\"http://chaijs.com/img/chai-logo.png\">\n </a>\n <br>\n chai\n</h1>\n\n<p align=center>\n Chai is a BDD / TDD assertion library for <a href=\"http://nodejs.org\">node</a> and the browser that can be delightfully paired with any javascript testing framework.\n</p>\n\n<p align=center>\n <a href=\"./LICENSE\">\n <img\n alt=\"license:mit\"\n src=\"https://img.shields.io/badge/license-mit-green.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://github.com/chaijs/chai/releases\">\n <img\n alt=\"tag:?\"\n src=\"https://img.shields.io/github/tag/chaijs/chai.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/package/chai\">\n <img\n alt=\"node:?\"\n src=\"https://img.shields.io/badge/node-%3E=4.0-blue.svg?style=flat-square\"\n />\n </a>\n <br/>\n <a href=\"https://saucelabs.com/u/chaijs\">\n <img\n alt=\"Selenium Test Status\"\n src=\"https://saucelabs.com/browser-matrix/chaijs.svg\"\n />\n </a>\n <br/>\n <a href=\"https://www.npmjs.com/packages/chai\">\n <img\n alt=\"downloads:?\"\n src=\"https://img.shields.io/npm/dm/chai.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://travis-ci.org/chaijs/chai\">\n <img\n alt=\"build:?\"\n src=\"https://img.shields.io/travis/chaijs/chai/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://codecov.io/gh/chaijs/chai\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/codecov/c/github/chaijs/chai.svg?style=flat-square\"\n />\n </a>\n <a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/chai.svg?style=flat-square\"\n />\n </a>\n <br/>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/chai\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://opencollective.com/chaijs\">\n <img\n alt=\"OpenCollective Backers\"\n src=\"https://opencollective.com/chaijs/backers/badge.svg?style=flat-square\"\n />\n </a>\n</p>\n\nFor more information or to download plugins, view the [documentation](http://chaijs.com).\n\n## What is Chai?\n\nChai is an _assertion library_, similar to Node's built-in `assert`. It makes testing much easier by giving you lots of assertions you can run against your code.\n\n## Installation\n\n### Node.js\n\n`chai` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install --save-dev chai\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `chai.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/chai/chai.js\"></script>\n```\n\n## Usage\n\nImport the library in your code, and then pick one of the styles you'd like to use - either `assert`, `expect` or `should`:\n\n```js\nvar chai = require('chai'); \nvar assert = chai.assert; // Using Assert style\nvar expect = chai.expect; // Using Expect style\nvar should = chai.should(); // Using Should style\n```\n\n### Pre-Native Modules Usage (_registers the chai testing style globally_)\n\n```js\nrequire('chai/register-assert'); // Using Assert style\nrequire('chai/register-expect'); // Using Expect style\nrequire('chai/register-should'); // Using Should style\n```\n\n### Pre-Native Modules Usage (_as local variables_)\n\n```js\nconst { assert } = require('chai'); // Using Assert style\nconst { expect } = require('chai'); // Using Expect style\nconst { should } = require('chai'); // Using Should style\nshould(); // Modifies `Object.prototype`\n\nconst { expect, use } = require('chai'); // Creates local variables `expect` and `use`; useful for plugin use\n```\n\n### Native Modules Usage (_registers the chai testing style globally_)\n\n```js\nimport 'chai/register-assert'; // Using Assert style\nimport 'chai/register-expect'; // Using Expect style\nimport 'chai/register-should'; // Using Should style\n```\n\n### Native Modules Usage (_local import only_)\n\n```js\nimport { assert } from 'chai'; // Using Assert style\nimport { expect } from 'chai'; // Using Expect style\nimport { should } from 'chai'; // Using Should style\nshould(); // Modifies `Object.prototype`\n```\n\n### Usage with Mocha\n\n```bash\nmocha spec.js -r chai/register-assert # Using Assert style\nmocha spec.js -r chai/register-expect # Using Expect style\nmocha spec.js -r chai/register-should # Using Should style\n```\n\n[Read more about these styles in our docs](http://chaijs.com/guide/styles/).\n\n## Plugins\n\nChai offers a robust Plugin architecture for extending Chai's assertions and interfaces.\n\n- Need a plugin? View the [official plugin list](http://chaijs.com/plugins).\n- Want to build a plugin? Read the [plugin api documentation](http://chaijs.com/guide/plugins/).\n- Have a plugin and want it listed? Simply add the following keywords to your package.json:\n - `chai-plugin`\n - `browser` if your plugin works in the browser as well as Node.js\n - `browser-only` if your plugin does not work with Node.js\n\n### Related Projects\n\n- [chaijs / chai-docs](https://github.com/chaijs/chai-docs): The chaijs.com website source code.\n- [chaijs / assertion-error](https://github.com/chaijs/assertion-error): Custom `Error` constructor thrown upon an assertion failing.\n- [chaijs / deep-eql](https://github.com/chaijs/deep-eql): Improved deep equality testing for Node.js and the browser.\n- [chaijs / type-detect](https://github.com/chaijs/type-detect): Improved typeof detection for Node.js and the browser.\n- [chaijs / check-error](https://github.com/chaijs/check-error): Error comparison and information related utility for Node.js and the browser.\n- [chaijs / loupe](https://github.com/chaijs/loupe): Inspect utility for Node.js and browsers.\n- [chaijs / pathval](https://github.com/chaijs/pathval): Object value retrieval given a string path.\n- [chaijs / get-func-name](https://github.com/chaijs/get-func-name): Utility for getting a function's name for node and the browser.\n\n### Contributing\n\nThank you very much for considering to contribute!\n\nPlease make sure you follow our [Code Of Conduct](https://github.com/chaijs/chai/blob/master/CODE_OF_CONDUCT.md) and we also strongly recommend reading our [Contributing Guide](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md).\n\nHere are a few issues other contributors frequently ran into when opening pull requests:\n\n- Please do not commit changes to the `chai.js` build. We do it once per release.\n- Before pushing your commits, please make sure you [rebase](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md#pull-requests) them.\n\n### Contributors\n\nPlease see the full\n[Contributors Graph](https://github.com/chaijs/chai/graphs/contributors) for our\nlist of contributors.\n\n### Core Contributors\n\nFeel free to reach out to any of the core contributors with your questions or\nconcerns. We will do our best to respond in a timely manner.\n\n[![Jake Luer](https://avatars3.githubusercontent.com/u/58988?v=3&s=50)](https://github.com/logicalparadox)\n[![Veselin Todorov](https://avatars3.githubusercontent.com/u/330048?v=3&s=50)](https://github.com/vesln)\n[![Keith Cirkel](https://avatars3.githubusercontent.com/u/118266?v=3&s=50)](https://github.com/keithamus)\n[![Lucas Fernandes da Costa](https://avatars3.githubusercontent.com/u/6868147?v=3&s=50)](https://github.com/lucasfcosta)\n[![Grant Snodgrass](https://avatars3.githubusercontent.com/u/17260989?v=3&s=50)](https://github.com/meeber)\n","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"repository":{"type":"git","url":"git+https://github.com/chaijs/chai.git"},"readmeFilename":"README.md","homepage":"http://chaijs.com","bugs":{"url":"https://github.com/chaijs/chai/issues"},"license":"MIT"}
+{
+ "name": "chai",
+ "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.",
+ "dist-tags": {
+ "latest": "4.3.6"
+ },
+ "versions": {
+ "4.3.6": {
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com"
+ },
+ "name": "chai",
+ "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.",
+ "license": "MIT",
+ "version": "4.3.6",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chaijs/chai.git"
+ },
+ "bugs": {
+ "url": "https://github.com/chaijs/chai/issues"
+ },
+ "main": "./index",
+ "exports": {
+ ".": {
+ "require": "./index.js",
+ "import": "./index.mjs"
+ },
+ "./*": "./*"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "devDependencies": {
+ "browserify": "^16.2.3",
+ "bump-cli": "^1.1.3",
+ "codecov": "^3.0.0",
+ "istanbul": "^0.4.3",
+ "karma": "^6.1.1",
+ "karma-chrome-launcher": "^2.2.0",
+ "karma-firefox-launcher": "^1.0.0",
+ "karma-mocha": "^2.0.1",
+ "karma-sauce-launcher": "^1.2.0",
+ "mocha": "^7.1.2"
+ },
+ "gitHead": "529b8b527ba99454471ac67d6aebca9d96cb5dd9",
+ "_id": "chai@4.3.6",
+ "_nodeVersion": "17.4.0",
+ "_npmVersion": "8.3.1",
+ "dist": {
+ "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+ "shasum": "ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c",
+ "tarball": "http://localhost:4260/chai/chai-4.3.6.tgz",
+ "fileCount": 50,
+ "unpackedSize": 750564
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chaijs/chai.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "http://chaijs.com",
+ "bugs": {
+ "url": "https://github.com/chaijs/chai/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/chalk/registry.json b/tests/registry/npm/chalk/registry.json
index c08ed67cf..e148e60fe 100644
--- a/tests/registry/npm/chalk/registry.json
+++ b/tests/registry/npm/chalk/registry.json
@@ -1 +1,150 @@
-{"name":"chalk","description":"Terminal string styling done right","dist-tags":{"latest":"5.0.1"},"versions":{"4.1.2":{"name":"chalk","version":"4.1.2","description":"Terminal string styling done right","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/chalk.git"},"funding":"https://github.com/chalk/chalk?sponsor=1","main":"source","engines":{"node":">=10"},"scripts":{"test":"xo && nyc ava && tsd","bench":"matcha benchmark.js"},"dependencies":{"ansi-styles":"^4.1.0","supports-color":"^7.1.0"},"devDependencies":{"ava":"^2.4.0","coveralls":"^3.0.7","execa":"^4.0.0","import-fresh":"^3.1.0","matcha":"^0.7.0","nyc":"^15.0.0","resolve-from":"^5.0.0","tsd":"^0.7.4","xo":"^0.28.2"},"xo":{"rules":{"unicorn/prefer-string-slice":"off","unicorn/prefer-includes":"off","@typescript-eslint/member-ordering":"off","no-redeclare":"off","unicorn/string-content":"off","unicorn/better-regex":"off"}},"gitHead":"95d74cbe8d3df3674dec1445a4608d3288d8b73c","bugs":{"url":"https://github.com/chalk/chalk/issues"},"_id":"chalk@4.1.2","_nodeVersion":"12.22.1","_npmVersion":"7.5.4","dist":{"integrity":"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==","shasum":"aac4e2b7734a740867aeb16bf02aad556a1e7a01","tarball":"http://localhost:4260/chalk/chalk-4.1.2.tgz","fileCount":7,"unpackedSize":35047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhA+psCRA9TVsSAnZWagAAaj8QAIsfB8+2kMsY5OUrDEqr\nqbznQ57bFD3ArrUSvhg+03aVEQV8fwgQHZtDC4KUSFuZGw/1l+3A+GFxvK68\nMM9SOD7jMNy1BUfzrfi0M2TR+V4pNjqJl+/ePQlgQ1SYzCZ+JpMUXdwkiV6r\nYzXuyObH6lJHPvdch+ynLSIYsQHHCDEe1qKEsdZXJzEAOc51a17ymlt+HdGg\nYZKENPA80H6h1bxOwf74i6uUNOYRLucAjDDuZX+cBxzILh9HOzl1MLRSgEJR\nD8Yl212H5+02bZb2Mhlrl+iFcfaPwz/CWWFxTW3dFoaAEVpiK+g06vlVKR+4\nIagsh89hAyWLl4mc661vycKi+WdhVQ275bzjtnzmti4E2CKVevksJS6aJKKo\nrtgAVlI0XEWDfduEEH3Bh/MfazmRl2BlKtKQoWmQjnj8ydydEchk2nN0N8cd\nnshOuqhOVtRoCROOUBIZHP84cy7teK0HDNKypv1Lu/43F3pZl12fJNPuo+zA\nGSjCke6YI6GFn0NkZ403iMQnOb8bF/nyQwVNUf/0DXEP3wNJbGyXyrY3HLeY\nleZa/LuXwt/4dXs5+g8RlaMjcqIukABwEwpsqX8G/ASaW9Do6VuwRqD7fva+\nXQCIebFDLUTbtAbI4L0qIqIDPCxvXR67m/j0fzHvzjGDwQzOlL2Og10rI0ZT\nmil5\r\n=FyBn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4dG0uJ9LWDhLIbBJazgFGOYD+6u8gUvOP/yfEluvstAIhAK7GZOqN8KY0Alry2lZ2MBIvWjuEGISyqHydp9oFrw22"}]},"directories":{},"_hasShrinkwrap":false},"5.0.1":{"name":"chalk","version":"5.0.1","description":"Terminal string styling done right","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/chalk.git"},"funding":"https://github.com/chalk/chalk?sponsor=1","type":"module","main":"./source/index.js","exports":"./source/index.js","imports":{"#ansi-styles":"./source/vendor/ansi-styles/index.js","#supports-color":{"node":"./source/vendor/supports-color/index.js","default":"./source/vendor/supports-color/browser.js"}},"types":"./source/index.d.ts","engines":{"node":"^12.17.0 || ^14.13 || >=16.0.0"},"scripts":{"test":"xo && c8 ava && tsd","bench":"matcha benchmark.js"},"devDependencies":{"@types/node":"^16.11.10","ava":"^3.15.0","c8":"^7.10.0","color-convert":"^2.0.1","execa":"^6.0.0","log-update":"^5.0.0","matcha":"^0.7.0","tsd":"^0.19.0","xo":"^0.47.0","yoctodelay":"^2.0.0"},"xo":{"rules":{"unicorn/prefer-string-slice":"off"}},"c8":{"reporter":["text","lcov"],"exclude":["source/vendor"]},"gitHead":"bccde97f8a1bb125d4fe99e8fd355182101ff4f2","bugs":{"url":"https://github.com/chalk/chalk/issues"},"_id":"chalk@5.0.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.2","dist":{"integrity":"sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==","shasum":"ca57d71e82bb534a296df63bbacc4a1c22b2a4b6","tarball":"http://localhost:4260/chalk/chalk-5.0.1.tgz","fileCount":12,"unpackedSize":41336,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ6QUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoR4hAAkZ1Pzo7shU7iLgAUqhpUI79vsAQoqkKYBv9iC+Z4ogWUlcd0\r\nRmauMjugcrKH6fsokqp9jDuJLiZSAbj7nwbmWDoBR9XRrxedjsB2H0eANVlC\r\nTAecFxGdN4gxEBzE6yVOfJelpNuw2qWstXKwOZmLwZkTlqE9LETYWO7xmzfs\r\nUW42alsTOP78ZYRnUWwkeZr3Z8yt7thGUwIi9q+QFsDIt0VwE86uTLeLvv+6\r\npNI04MyKzNkKRG+PF8uW+O+j5PYIr9BPYY++g+f+rayFdwSYcoQjutF0BHdj\r\nG+7DGTrk+dhzCJ5xLSZY0rljcgyY9/KMSj+3rO7fUJalPIpqbwLClmMtfJQU\r\n2MmdM+dJfsXAfoZA5rMxP3GoOC8LC6RaScliVivockrCSJgd9Tp9KzRt+66I\r\nqNiuztSypB5SRB7TC41S8jvIHDw5PNNnNP5C7E/uBjU35yc6aX/2pyxUeXYm\r\nAOPLmVWqBcroBiE4zi4OmG1fB2Izw9DJsK31i2U98lkMLfkVaUa4tIBgVwbU\r\nkB62F3BA86yYuWucYeZL3hp9H1TG5+WBhs9+lHrb0+mH3b6ab2lZu/uCWvH6\r\nSedXquHHQxyM9JcuxDrDtmELqR87B+h0iAKzBf7KYtmyrqrxpHE0FiteQsV9\r\nUJbfD3SPAaX/IBAryNeP4Q4e/oSQDy3YUuI=\r\n=ZFqY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF8zpu4flQt9Ck8M+VS0lz3b8mdY12JcKsCNaVK+2pY1AiEA4+L33unqlFikjPh1wCQQcPQ5jOpz9l5PGjjp1ERb/GA="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<h1 align=\"center\">\n\t<br>\n\t<br>\n\t<img width=\"320\" src=\"media/logo.svg\" alt=\"Chalk\">\n\t<br>\n\t<br>\n\t<br>\n</h1>\n\n> Terminal string styling done right\n\n[![Coverage Status](https://codecov.io/gh/chalk/chalk/branch/main/graph/badge.svg)](https://codecov.io/gh/chalk/chalk)\n[![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk)\n[![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk)\n[![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15)\n\n<img src=\"https://cdn.jsdelivr.net/gh/chalk/ansi-styles@8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg\" width=\"900\">\n\n<br>\n\n---\n\n<div align=\"center\">\n\t<p>\n\t\t<p>\n\t\t\t<sup>\n\t\t\t\tSindre Sorhus' open source work is supported by the community on <a href=\"https://github.com/sponsors/sindresorhus\">GitHub Sponsors</a> and <a href=\"https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15\">Dev</a>\n\t\t\t</sup>\n\t\t</p>\n\t\t<sup>Special thanks to:</sup>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://standardresume.co/tech\">\n\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/standard-resume-logo.svg\" width=\"160\"/>\n\t\t</a>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://retool.com/?utm_campaign=sindresorhus\">\n\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/retool-logo.svg\" width=\"230\"/>\n\t\t</a>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://doppler.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=chalk&utm_source=github\">\n\t\t\t<div>\n\t\t\t\t<img src=\"https://dashboard.doppler.com/imgs/logo-long.svg\" width=\"240\" alt=\"Doppler\">\n\t\t\t</div>\n\t\t\t<b>All your environment variables, in one place</b>\n\t\t\t<div>\n\t\t\t\t<span>Stop struggling with scattered API keys, hacking together home-brewed tools,</span>\n\t\t\t\t<br>\n\t\t\t\t<span>and avoiding access controls. Keep your team and servers in sync with Doppler.</span>\n\t\t\t</div>\n\t\t</a>\n\t\t<br>\n\t\t<a href=\"https://strapi.io/?ref=sindresorhus\">\n\t\t\t<div>\n\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/strapi-logo-white-bg.png\" width=\"220\" alt=\"Strapi\">\n\t\t\t</div>\n\t\t\t<b>Strapi is the leading open-source headless CMS.</b>\n\t\t\t<div>\n\t\t\t\t<sup>It’s 100% JavaScript, fully customizable, and developer-first.</sup>\n\t\t\t</div>\n\t\t</a>\n\t</p>\n</div>\n\n---\n\n<br>\n\n## Highlights\n\n- Expressive API\n- Highly performant\n- No dependencies\n- Ability to nest styles\n- [256/Truecolor color support](#256-and-truecolor-color-support)\n- Auto-detects color support\n- Doesn't extend `String.prototype`\n- Clean and focused\n- Actively maintained\n- [Used by ~76,000 packages](https://www.npmjs.com/browse/depended/chalk) as of October 26, 2021\n\n## Install\n\n```sh\nnpm install chalk\n```\n\n**IMPORTANT:** Chalk 5 is ESM. If you want to use Chalk with TypeScript or a build tool, you will probably want to use Chalk 4 for now. [Read more.](https://github.com/chalk/chalk/releases/tag/v5.0.0)\n\n## Usage\n\n```js\nimport chalk from 'chalk';\n\nconsole.log(chalk.blue('Hello world!'));\n```\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nimport chalk from 'chalk';\n\nconst log = console.log;\n\n// Combine styled and normal strings\nlog(chalk.blue('Hello') + ' World' + chalk.red('!'));\n\n// Compose multiple styles using the chainable API\nlog(chalk.blue.bgRed.bold('Hello world!'));\n\n// Pass in multiple arguments\nlog(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));\n\n// Nest styles\nlog(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));\n\n// Nest styles of the same type even (color, underline, background)\nlog(chalk.green(\n\t'I am a green line ' +\n\tchalk.blue.underline.bold('with a blue substring') +\n\t' that becomes green again!'\n));\n\n// ES2015 template literal\nlog(`\nCPU: ${chalk.red('90%')}\nRAM: ${chalk.green('40%')}\nDISK: ${chalk.yellow('70%')}\n`);\n\n// Use RGB colors in terminal emulators that support it.\nlog(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));\nlog(chalk.hex('#DEADED').bold('Bold gray!'));\n```\n\nEasily define your own themes:\n\n```js\nimport chalk from 'chalk';\n\nconst error = chalk.bold.red;\nconst warning = chalk.hex('#FFA500'); // Orange color\n\nconsole.log(error('Error!'));\nconsole.log(warning('Warning!'));\n```\n\nTake advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):\n\n```js\nimport chalk from 'chalk';\n\nconst name = 'Sindre';\nconsole.log(chalk.green('Hello %s'), name);\n//=> 'Hello Sindre'\n```\n\n## API\n\n### chalk.`<style>[.<style>...](string, [string...])`\n\nExample: `chalk.red.bold.underline('Hello', 'world');`\n\nChain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.\n\nMultiple arguments will be separated by space.\n\n### chalk.level\n\nSpecifies the level of color support.\n\nColor support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.\n\nIf you need to change this in a reusable module, create a new instance:\n\n```js\nimport {Chalk} from 'chalk';\n\nconst customChalk = new Chalk({level: 0});\n```\n\n| Level | Description |\n| :---: | :--- |\n| `0` | All colors disabled |\n| `1` | Basic color support (16 colors) |\n| `2` | 256 color support |\n| `3` | Truecolor support (16 million colors) |\n\n### supportsColor\n\nDetect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.\n\nCan be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.\n\nExplicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.\n\n### chalkStderr and supportsColorStderr\n\n`chalkStderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `supportsColor` apply to this too. `supportsColorStderr` is exposed for convenience.\n\n## Styles\n\n### Modifiers\n\n- `reset` - Reset the current style.\n- `bold` - Make the text bold.\n- `dim` - Make the text have lower opacity.\n- `italic` - Make the text italic. *(Not widely supported)*\n- `underline` - Put a horizontal line below the text. *(Not widely supported)*\n- `overline` - Put a horizontal line above the text. *(Not widely supported)*\n- `inverse`- Invert background and foreground colors.\n- `hidden` - Print the text but make it invisible.\n- `strikethrough` - Puts a horizontal line through the center of the text. *(Not widely supported)*\n- `visible`- Print the text only when Chalk has a color level above zero. Can be useful for things that are purely cosmetic.\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `blackBright` (alias: `gray`, `grey`)\n- `redBright`\n- `greenBright`\n- `yellowBright`\n- `blueBright`\n- `magentaBright`\n- `cyanBright`\n- `whiteBright`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n- `bgBlackBright` (alias: `bgGray`, `bgGrey`)\n- `bgRedBright`\n- `bgGreenBright`\n- `bgYellowBright`\n- `bgBlueBright`\n- `bgMagentaBright`\n- `bgCyanBright`\n- `bgWhiteBright`\n\n## 256 and Truecolor color support\n\nChalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.\n\nColors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).\n\nExamples:\n\n- `chalk.hex('#DEADED').underline('Hello, world!')`\n- `chalk.rgb(15, 100, 204).inverse('Hello!')`\n\nBackground versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `hex` for foreground colors and `bgHex` for background colors).\n\n- `chalk.bgHex('#DEADED').underline('Hello, world!')`\n- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`\n\nThe following color models can be used:\n\n- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`\n- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`\n- [`ansi256`](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) - Example: `chalk.bgAnsi256(194)('Honeydew, more or less')`\n\n## Browser support\n\nSince Chrome 69, ANSI escape codes are natively supported in the developer console.\n\n## Windows\n\nIf you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`.\n\n## Origin story\n\n[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.\n\n## chalk for enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of chalk and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-chalk?utm_source=npm-chalk&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n## Related\n\n- [chalk-template](https://github.com/chalk/chalk-template) - [Tagged template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) support for this module\n- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module\n- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal\n- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color\n- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes\n- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes\n- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes\n- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models\n- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal\n- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings\n- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings\n- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n","repository":{"type":"git","url":"git+https://github.com/chalk/chalk.git"},"homepage":"https://github.com/chalk/chalk#readme","bugs":{"url":"https://github.com/chalk/chalk/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "chalk",
+ "description": "Terminal string styling done right",
+ "dist-tags": {
+ "latest": "5.0.1"
+ },
+ "versions": {
+ "4.1.2": {
+ "name": "chalk",
+ "version": "4.1.2",
+ "description": "Terminal string styling done right",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/chalk.git"
+ },
+ "funding": "https://github.com/chalk/chalk?sponsor=1",
+ "main": "source",
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && nyc ava && tsd",
+ "bench": "matcha benchmark.js"
+ },
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "coveralls": "^3.0.7",
+ "execa": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "matcha": "^0.7.0",
+ "nyc": "^15.0.0",
+ "resolve-from": "^5.0.0",
+ "tsd": "^0.7.4",
+ "xo": "^0.28.2"
+ },
+ "xo": {
+ "rules": {
+ "unicorn/prefer-string-slice": "off",
+ "unicorn/prefer-includes": "off",
+ "@typescript-eslint/member-ordering": "off",
+ "no-redeclare": "off",
+ "unicorn/string-content": "off",
+ "unicorn/better-regex": "off"
+ }
+ },
+ "gitHead": "95d74cbe8d3df3674dec1445a4608d3288d8b73c",
+ "bugs": {
+ "url": "https://github.com/chalk/chalk/issues"
+ },
+ "_id": "chalk@4.1.2",
+ "_nodeVersion": "12.22.1",
+ "_npmVersion": "7.5.4",
+ "dist": {
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "shasum": "aac4e2b7734a740867aeb16bf02aad556a1e7a01",
+ "tarball": "http://localhost:4260/chalk/chalk-4.1.2.tgz",
+ "fileCount": 7,
+ "unpackedSize": 35047
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "5.0.1": {
+ "name": "chalk",
+ "version": "5.0.1",
+ "description": "Terminal string styling done right",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/chalk.git"
+ },
+ "funding": "https://github.com/chalk/chalk?sponsor=1",
+ "type": "module",
+ "main": "./source/index.js",
+ "exports": "./source/index.js",
+ "imports": {
+ "#ansi-styles": "./source/vendor/ansi-styles/index.js",
+ "#supports-color": {
+ "node": "./source/vendor/supports-color/index.js",
+ "default": "./source/vendor/supports-color/browser.js"
+ }
+ },
+ "types": "./source/index.d.ts",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "scripts": {
+ "test": "xo && c8 ava && tsd",
+ "bench": "matcha benchmark.js"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.10",
+ "ava": "^3.15.0",
+ "c8": "^7.10.0",
+ "color-convert": "^2.0.1",
+ "execa": "^6.0.0",
+ "log-update": "^5.0.0",
+ "matcha": "^0.7.0",
+ "tsd": "^0.19.0",
+ "xo": "^0.47.0",
+ "yoctodelay": "^2.0.0"
+ },
+ "xo": {
+ "rules": {
+ "unicorn/prefer-string-slice": "off"
+ }
+ },
+ "c8": {
+ "reporter": [
+ "text",
+ "lcov"
+ ],
+ "exclude": [
+ "source/vendor"
+ ]
+ },
+ "gitHead": "bccde97f8a1bb125d4fe99e8fd355182101ff4f2",
+ "bugs": {
+ "url": "https://github.com/chalk/chalk/issues"
+ },
+ "_id": "chalk@5.0.1",
+ "_nodeVersion": "16.14.0",
+ "_npmVersion": "8.3.2",
+ "dist": {
+ "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
+ "shasum": "ca57d71e82bb534a296df63bbacc4a1c22b2a4b6",
+ "tarball": "http://localhost:4260/chalk/chalk-5.0.1.tgz",
+ "fileCount": 12,
+ "unpackedSize": 41336
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/chalk.git"
+ },
+ "homepage": "https://github.com/chalk/chalk#readme",
+ "bugs": {
+ "url": "https://github.com/chalk/chalk/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/check-error/registry.json b/tests/registry/npm/check-error/registry.json
index ff26c0c75..0fdecbfae 100644
--- a/tests/registry/npm/check-error/registry.json
+++ b/tests/registry/npm/check-error/registry.json
@@ -1 +1,116 @@
-{"name":"check-error","description":"Error comparison and information related utility for node and the browser","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.2":{"name":"check-error","description":"Error comparison and information related utility for node and the browser","license":"MIT","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"files":["index.js","check-error.js"],"main":"./index.js","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/check-error.git"},"scripts":{"build":"browserify --bare $npm_package_main --standalone checkError -o check-error.js","lint":"eslint --ignore-path .gitignore .","prepublish":"npm run build","semantic-release":"semantic-release pre && npm publish && semantic-release post","pretest":"npm run lint","test":"npm run test:node && npm run test:browser && npm run upload-coverage","test:browser":"karma start --singleRun=true","test:node":"istanbul cover _mocha","upload-coverage":"lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg"}},"eslintConfig":{"extends":["strict/es5"],"env":{"es6":true},"globals":{"HTMLElement":false},"rules":{"complexity":0,"max-statements":0}},"dependencies":{},"devDependencies":{"browserify":"^13.0.0","browserify-istanbul":"^1.0.0","coveralls":"2.11.9","eslint":"^2.4.0","eslint-config-strict":"^8.5.0","eslint-plugin-filenames":"^0.2.0","ghooks":"^1.0.1","istanbul":"^0.4.2","karma":"^0.13.22","karma-browserify":"^5.0.2","karma-coverage":"^0.5.5","karma-mocha":"^0.2.2","karma-phantomjs-launcher":"^1.0.0","karma-sauce-launcher":"^0.3.1","lcov-result-merger":"^1.0.2","mocha":"^2.4.5","phantomjs-prebuilt":"^2.1.5","semantic-release":"^4.3.5","simple-assert":"^1.0.0","travis-after-all":"^1.4.4","validate-commit-msg":"^2.3.1"},"engines":{"node":"*"},"version":"1.0.2","gitHead":"22a3985d2ec528015774206703332790aec4dea7","bugs":{"url":"https://github.com/chaijs/check-error/issues"},"_id":"check-error@1.0.2","_shasum":"574d312edd88bb5dd8912e9286dd6c0aed4aac82","_from":".","_npmVersion":"3.10.2","_nodeVersion":"0.10.46","dist":{"shasum":"574d312edd88bb5dd8912e9286dd6c0aed4aac82","tarball":"http://localhost:4260/check-error/check-error-1.0.2.tgz","integrity":"sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVWmYXeEYVwFkYTypixrwO19ECHIY0laL4EB4NGe4mSAIhAPe+o1k5NTKHNeVIxbUR1ph7taBOst3UuoDF/n5J2HId"}]}}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"ChaiJS\" src=\"http://chaijs.com/img/chai-logo.png\"/> check-error\n </a>\n</h1>\n\n<p align=center>\n Error comparison and information related utility for <a href=\"http://nodejs.org\">node</a> and the browser.\n</p>\n\n<p align=center>\n <a href=\"./LICENSE\">\n <img\n alt=\"license:mit\"\n src=\"https://img.shields.io/badge/license-mit-green.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://github.com/chaijs/check-error/releases\">\n <img\n alt=\"tag:?\"\n src=\"https://img.shields.io/github/tag/chaijs/check-error.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://travis-ci.org/chaijs/check-error\">\n <img\n alt=\"build:?\"\n src=\"https://img.shields.io/travis/chaijs/check-error/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://coveralls.io/r/chaijs/check-error\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/coveralls/chaijs/check-error/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/check-error\">\n <img\n alt=\"npm:?\"\n src=\"https://img.shields.io/npm/v/check-error.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/check-error\">\n <img\n alt=\"dependencies:?\"\n src=\"https://img.shields.io/npm/dm/check-error.svg?style=flat-square\"\n />\n </a>\n <a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/check-error.svg?style=flat-square\"\n />\n </a>\n <br/>\n <a href=\"https://saucelabs.com/u/chaijs-check-error\">\n <img\n alt=\"Selenium Test Status\"\n src=\"https://saucelabs.com/browser-matrix/chaijs-check-error.svg\"\n />\n </a>\n <br>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/chai\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n</p>\n\n## What is Check-Error?\n\nCheck-Error is a module which you can use to retrieve an Error's information such as its `message` or `constructor` name and also to check whether two Errors are compatible based on their messages, constructors or even instances.\n\n## Installation\n\n### Node.js\n\n`check-error` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install check-error\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `check-error.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/check-error/check-error.js\"></script>\n```\n\n## Usage\n\nThe primary export of `check-error` is an object which has the following methods:\n\n* `compatibleInstance(err, errorLike)` - Checks if an error is compatible with another `errorLike` object. If `errorLike` is an error instance we do a strict comparison, otherwise we return `false` by default, because instances of objects can only be compatible if they're both error instances.\n* `compatibleConstructor(err, errorLike)` - Checks if an error's constructor is compatible with another `errorLike` object. If `err` has the same constructor as `errorLike` or if `err` is an instance of `errorLike`.\n* `compatibleMessage(err, errMatcher)` - Checks if an error message is compatible with an `errMatcher` RegExp or String (we check if the message contains the String).\n* `getConstructorName(errorLike)` - Retrieves the name of a constructor, an error's constructor or `errorLike` itself if it's not an error instance or constructor.\n* `getMessage(err)` - Retrieves the message of an error or `err` itself if it's a String. If `err` or `err.message` is undefined we return an empty String.\n\n```js\nvar checkError = require('check-error');\n```\n\n#### .compatibleInstance(err, errorLike)\n\n```js\nvar checkError = require('check-error');\n\nvar funcThatThrows = function() { throw new TypeError('I am a TypeError') };\nvar caughtErr;\n\ntry {\n funcThatThrows();\n} catch(e) {\n caughtErr = e;\n}\n\nvar sameInstance = caughtErr;\n\ncheckError.compatibleInstance(caughtErr, sameInstance); // true\ncheckError.compatibleInstance(caughtErr, new TypeError('Another error')); // false\n```\n\n#### .compatibleConstructor(err, errorLike)\n\n```js\nvar checkError = require('check-error');\n\nvar funcThatThrows = function() { throw new TypeError('I am a TypeError') };\nvar caughtErr;\n\ntry {\n funcThatThrows();\n} catch(e) {\n caughtErr = e;\n}\n\ncheckError.compatibleConstructor(caughtErr, Error); // true\ncheckError.compatibleConstructor(caughtErr, TypeError); // true\ncheckError.compatibleConstructor(caughtErr, RangeError); // false\n```\n\n#### .compatibleMessage(err, errMatcher)\n\n```js\nvar checkError = require('check-error');\n\nvar funcThatThrows = function() { throw new TypeError('I am a TypeError') };\nvar caughtErr;\n\ntry {\n funcThatThrows();\n} catch(e) {\n caughtErr = e;\n}\n\nvar sameInstance = caughtErr;\n\ncheckError.compatibleMessage(caughtErr, /TypeError$/); // true\ncheckError.compatibleMessage(caughtErr, 'I am a'); // true\ncheckError.compatibleMessage(caughtErr, /unicorn/); // false\ncheckError.compatibleMessage(caughtErr, 'I do not exist'); // false\n```\n\n#### .getConstructorName(errorLike)\n\n```js\nvar checkError = require('check-error');\n\nvar funcThatThrows = function() { throw new TypeError('I am a TypeError') };\nvar caughtErr;\n\ntry {\n funcThatThrows();\n} catch(e) {\n caughtErr = e;\n}\n\nvar sameInstance = caughtErr;\n\ncheckError.getConstructorName(caughtErr) // 'TypeError'\n```\n\n#### .getMessage(err)\n\n```js\nvar checkError = require('check-error');\n\nvar funcThatThrows = function() { throw new TypeError('I am a TypeError') };\nvar caughtErr;\n\ntry {\n funcThatThrows();\n} catch(e) {\n caughtErr = e;\n}\n\nvar sameInstance = caughtErr;\n\ncheckError.getMessage(caughtErr) // 'I am a TypeError'\n```\n","homepage":"https://github.com/chaijs/check-error#readme","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/check-error.git"},"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"bugs":{"url":"https://github.com/chaijs/check-error/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "check-error",
+ "description": "Error comparison and information related utility for node and the browser",
+ "dist-tags": {
+ "latest": "1.0.2"
+ },
+ "versions": {
+ "1.0.2": {
+ "name": "check-error",
+ "description": "Error comparison and information related utility for node and the browser",
+ "license": "MIT",
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "files": [
+ "index.js",
+ "check-error.js"
+ ],
+ "main": "./index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/check-error.git"
+ },
+ "scripts": {
+ "build": "browserify --bare $npm_package_main --standalone checkError -o check-error.js",
+ "lint": "eslint --ignore-path .gitignore .",
+ "prepublish": "npm run build",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "pretest": "npm run lint",
+ "test": "npm run test:node && npm run test:browser && npm run upload-coverage",
+ "test:browser": "karma start --singleRun=true",
+ "test:node": "istanbul cover _mocha",
+ "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"
+ },
+ "config": {
+ "ghooks": {
+ "commit-msg": "validate-commit-msg"
+ }
+ },
+ "eslintConfig": {
+ "extends": [
+ "strict/es5"
+ ],
+ "env": {
+ "es6": true
+ },
+ "globals": {
+ "HTMLElement": false
+ },
+ "rules": {
+ "complexity": 0,
+ "max-statements": 0
+ }
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "browserify": "^13.0.0",
+ "browserify-istanbul": "^1.0.0",
+ "coveralls": "2.11.9",
+ "eslint": "^2.4.0",
+ "eslint-config-strict": "^8.5.0",
+ "eslint-plugin-filenames": "^0.2.0",
+ "ghooks": "^1.0.1",
+ "istanbul": "^0.4.2",
+ "karma": "^0.13.22",
+ "karma-browserify": "^5.0.2",
+ "karma-coverage": "^0.5.5",
+ "karma-mocha": "^0.2.2",
+ "karma-phantomjs-launcher": "^1.0.0",
+ "karma-sauce-launcher": "^0.3.1",
+ "lcov-result-merger": "^1.0.2",
+ "mocha": "^2.4.5",
+ "phantomjs-prebuilt": "^2.1.5",
+ "semantic-release": "^4.3.5",
+ "simple-assert": "^1.0.0",
+ "travis-after-all": "^1.4.4",
+ "validate-commit-msg": "^2.3.1"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "version": "1.0.2",
+ "gitHead": "22a3985d2ec528015774206703332790aec4dea7",
+ "bugs": {
+ "url": "https://github.com/chaijs/check-error/issues"
+ },
+ "_id": "check-error@1.0.2",
+ "_shasum": "574d312edd88bb5dd8912e9286dd6c0aed4aac82",
+ "_from": ".",
+ "_npmVersion": "3.10.2",
+ "_nodeVersion": "0.10.46",
+ "dist": {
+ "shasum": "574d312edd88bb5dd8912e9286dd6c0aed4aac82",
+ "tarball": "http://localhost:4260/check-error/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA=="
+ }
+ }
+ },
+ "homepage": "https://github.com/chaijs/check-error#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/check-error.git"
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chaijs/check-error/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/chownr/registry.json b/tests/registry/npm/chownr/registry.json
index 3a79510d6..3650b6b8f 100644
--- a/tests/registry/npm/chownr/registry.json
+++ b/tests/registry/npm/chownr/registry.json
@@ -1 +1,73 @@
-{"name":"chownr","description":"like `chown -R`","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"chownr","description":"like `chown -R`","version":"2.0.0","repository":{"type":"git","url":"git://github.com/isaacs/chownr.git"},"main":"chownr.js","devDependencies":{"mkdirp":"0.3","rimraf":"^2.7.1","tap":"^14.10.6"},"tap":{"check-coverage":true},"scripts":{"test":"tap","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags"},"license":"ISC","engines":{"node":">=10"},"gitHead":"f9f9d866bebb2f9ff8efc93b78305f9d999c6f17","bugs":{"url":"https://github.com/isaacs/chownr/issues"},"_id":"chownr@2.0.0","_nodeVersion":"13.7.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==","shasum":"15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece","tarball":"http://localhost:4260/chownr/chownr-2.0.0.tgz","fileCount":4,"unpackedSize":5748,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQ2PkCRA9TVsSAnZWagAApeIP/2yqh1W+b3D7qaCsODPY\nG/eO4oYZvjf7XYYvExZs3oiFkHWKHLgIZH0Z1NdhfyxG/pyVnDpF6ewy03z8\nuNYo3aHX3h5bgiwbgAaNWa+ZxhNbeQ8CJWZNH9OYT37aKB9XvamCdLt7btO+\nkJbkYkdlz/3XTMP7CXxsMng0qorjHHk0IyNJZ1Bcy+NSeKPFlyq7/8E5VIK2\nsoz2Zz2pXAi0nKsrJdMzjjAwm50bKRq9eD1gZE2nUFfUjICk0A9d9PTc+2Pn\nalkGyPLMTpTxiTvaWLr+CXAhudfhBbteUVz1CFi6hXR+iVevCqcVewuzWijL\nDlFzTz/TQOR1i6/aH4FUVIdm1BS6jee+JVLCAH58zbdQR1QYQV8MukKHocpH\nWNuLPyX/YyCjU9+LlPMX0pLpikjReZgxZkpZdtIYPtN6u3c4zNhub9jNlaNz\nlcgSAk/0LpH0lSs+Zh3GxBd/O43fXfchPHoIHqILIH8oTRSXLzw6tG+5LNkt\nS/JWmOz+RXp0AzRrPz9ra09ssJIKzYhqprxBLXwvj3MnbZzev9GfDgrPoBCk\n93CA+q3eS32Wg1D18yqC0spgEfsptypdnxWhVijnFZ+egcdMFpTRb6HzKyEj\n5FYbiqMkP2aHnQD7SEIcxQmkF9izZnHfmftOjI2lzjyfeKl9+F46smiJRoeh\nhn9O\r\n=R+L8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/ziEIBMm9nLYVawYleu/fQ1UujEqC9o4ZssCQ/CBLKAIhALKls4xaLdIDO4YvLKv5P/PgchXHvwp3avlCHkhFJnHR"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"Like `chown -R`.\n\nTakes the same arguments as `fs.chown()`\n","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"type":"git","url":"git://github.com/isaacs/chownr.git"},"homepage":"https://github.com/isaacs/chownr#readme","bugs":{"url":"https://github.com/isaacs/chownr/issues"},"license":"BlueOak-1.0.0","readmeFilename":"README.md"}
+{
+ "name": "chownr",
+ "description": "like `chown -R`",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "name": "chownr",
+ "description": "like `chown -R`",
+ "version": "2.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/chownr.git"
+ },
+ "main": "chownr.js",
+ "devDependencies": {
+ "mkdirp": "0.3",
+ "rimraf": "^2.7.1",
+ "tap": "^14.10.6"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "scripts": {
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ },
+ "gitHead": "f9f9d866bebb2f9ff8efc93b78305f9d999c6f17",
+ "bugs": {
+ "url": "https://github.com/isaacs/chownr/issues"
+ },
+ "_id": "chownr@2.0.0",
+ "_nodeVersion": "13.7.0",
+ "_npmVersion": "6.13.7",
+ "dist": {
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "shasum": "15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece",
+ "tarball": "http://localhost:4260/chownr/chownr-2.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 5748
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/chownr.git"
+ },
+ "homepage": "https://github.com/isaacs/chownr#readme",
+ "bugs": {
+ "url": "https://github.com/isaacs/chownr/issues"
+ },
+ "license": "BlueOak-1.0.0",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/clean-stack/registry.json b/tests/registry/npm/clean-stack/registry.json
index e704d17aa..debc3b6fa 100644
--- a/tests/registry/npm/clean-stack/registry.json
+++ b/tests/registry/npm/clean-stack/registry.json
@@ -1 +1,69 @@
-{"name":"clean-stack","description":"Clean up error stack traces","dist-tags":{"latest":"2.2.0"},"versions":{"2.2.0":{"name":"clean-stack","version":"2.2.0","description":"Clean up error stack traces","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/clean-stack.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"browser":{"os":false},"gitHead":"91440c5a1615354fb9419354650937c434eb9f49","bugs":{"url":"https://github.com/sindresorhus/clean-stack/issues"},"_id":"clean-stack@2.2.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==","shasum":"ee8472dbb129e727b31e8a10a427dee9dfe4008b","tarball":"http://localhost:4260/clean-stack/clean-stack-2.2.0.tgz","fileCount":5,"unpackedSize":5508,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQbLICRA9TVsSAnZWagAA/rgP/1TWGRCM3DhESdXGjNFH\niKBjOj8P+r/uaBFCV2EWL+/4gyww3VA6ECIyw3NJ8Iin0tiulY+nzo65bmxv\n0sEg3R57d5W3XFrvKc/3w+EEyeq+EVTUUZFxb3jw63WGJppezy+24WBiI1wZ\nUkgPXvfhs2ZqXmCdVlrOQ3zhCuwDzMXHO7rChGfOMhsQTPPB3uhxdlMdS7N5\noA3MnPUOcTO1oHIWL6Kj/EfQcLcgxnQQrR0gJd+NZGoS3Wa4Z5HhWPtfKBh1\n7roltnx0tKKKXbEK/XMvjVJdO+tbGaunmLjD/d7R+pctEazftxjWjef0b8ve\nlpT3k+j8unp/scto7a3hZnKSgfBJz9QO0OE0jciuBijEvTm2PN2IMjUXxbeq\ni+DtRYLdIRnL6SsiqMxIZUuO2KuR+O1xMmxPkM1LkiSW8x9s9vwifHYBtQnM\nhElRbyGqO+nILUklpt9a9lvxwpYDqQeuGJt4Fogdsz5BoDf640pmn/5KS6NV\n3ydUF0lEXihTs24Nl1TPH7hYVV7fdM4/gQm4BlmtkBuvP738BkkAHRt/HCfl\nBAwWPgPXpW7TwpPP/jK+UNud4YKzj6fDiDxoVPOuj5584IEPx4nU2rdIiPHa\nq0w7XIgmqoBGNU5wPAepNhPOlITXAiuSFZnEZG4NVUNPqNaprc1msH48QpFu\nQWIh\r\n=N8TA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5PrgG9Ds9PcV/WTk5JfxwjrzMq7cESI0NFDUOcz5MQAIgIUJEeTCPKar2fj39jSQbw4v/jjsJE3pOaNtDh5n9MS8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# clean-stack\n\n> Clean up error stack traces\n\nRemoves the mostly unhelpful internal Node.js entries.\n\nAlso works in Electron.\n\n## Install\n\n```sh\nnpm install clean-stack\n```\n\n## Usage\n\n```js\nimport cleanStack from 'clean-stack';\n\nconst error = new Error('Missing unicorn');\n\nconsole.log(error.stack);\n/*\nError: Missing unicorn\n at Object.<anonymous> (/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15)\n at Module._compile (module.js:409:26)\n at Object.Module._extensions..js (module.js:416:10)\n at Module.load (module.js:343:32)\n at Function.Module._load (module.js:300:12)\n at Function.Module.runMain (module.js:441:10)\n at startup (node.js:139:18)\n*/\n\nconsole.log(cleanStack(error.stack));\n/*\nError: Missing unicorn\n at Object.<anonymous> (/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15)\n*/\n```\n\n## API\n\n### cleanStack(stack, options?)\n\nReturns the cleaned stack or `undefined` if the given `stack` is `undefined`.\n\n#### stack\n\nType: `string | undefined`\n\nThe `stack` property of an [`Error`](https://github.com/microsoft/TypeScript/blob/eac073894b172ec719ca7f28b0b94fc6e6e7d4cf/lib/lib.es5.d.ts#L972-L976).\n\n#### options\n\nType: `object`\n\n##### pretty\n\nType: `boolean`\\\nDefault: `false`\n\nPrettify the file paths in the stack:\n\n`/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15` → `~/dev/clean-stack/unicorn.js:2:15`\n\n##### basePath\n\nType: `string?`\n\nRemove the given base path from stack trace file paths, effectively turning absolute paths into relative ones. It will also transform absolute file URLs into relative paths.\n\nExample with `'/Users/sindresorhus/dev/clean-stack'` as `basePath`:\n\n`/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15` → `unicorn.js:2:15`\n\n##### pathFilter\n\nType: `(path: string) => boolean`\n\nRemove the stack lines where the given function returns `false`. The function receives the path part of the stack line.\n\n```js\nimport cleanStack from 'clean-stack';\n\nconst error = new Error('Missing unicorn');\n\nconsole.log(cleanStack(error.stack));\n// Error: Missing unicorn\n// at Object.<anonymous> (/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15)\n// at Object.<anonymous> (/Users/sindresorhus/dev/clean-stack/omit-me.js:1:16)\n\nconst pathFilter = path => !/omit-me/.test(path);\n\nconsole.log(cleanStack(error.stack, {pathFilter}));\n// Error: Missing unicorn\n// at Object.<anonymous> (/Users/sindresorhus/dev/clean-stack/unicorn.js:2:15)\n```\n\n## Related\n\n- [extract-stack](https://github.com/sindresorhus/extract-stack) - Extract the actual stack of an error\n- [stack-utils](https://github.com/tapjs/stack-utils) - Captures and cleans stack traces\n","homepage":"https://github.com/sindresorhus/clean-stack#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/clean-stack.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/clean-stack/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "clean-stack",
+ "description": "Clean up error stack traces",
+ "dist-tags": {
+ "latest": "2.2.0"
+ },
+ "versions": {
+ "2.2.0": {
+ "name": "clean-stack",
+ "version": "2.2.0",
+ "description": "Clean up error stack traces",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/clean-stack.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "browser": {
+ "os": false
+ },
+ "gitHead": "91440c5a1615354fb9419354650937c434eb9f49",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/clean-stack/issues"
+ },
+ "_id": "clean-stack@2.2.0",
+ "_nodeVersion": "10.16.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "shasum": "ee8472dbb129e727b31e8a10a427dee9dfe4008b",
+ "tarball": "http://localhost:4260/clean-stack/clean-stack-2.2.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 5508
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/clean-stack#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/clean-stack.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/clean-stack/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/cliui/registry.json b/tests/registry/npm/cliui/registry.json
index 07d3ae88d..4006d0747 100644
--- a/tests/registry/npm/cliui/registry.json
+++ b/tests/registry/npm/cliui/registry.json
@@ -1 +1,95 @@
-{"name":"cliui","description":"easily create complex multi-column command-line-interfaces","dist-tags":{"latest":"6.0.0"},"versions":{"6.0.0":{"name":"cliui","version":"6.0.0","description":"easily create complex multi-column command-line-interfaces","main":"index.js","scripts":{"pretest":"standard","test":"nyc mocha","coverage":"nyc --reporter=text-lcov mocha | coveralls"},"repository":{"type":"git","url":"git+ssh://git@github.com/yargs/cliui.git"},"config":{"blanket":{"pattern":["index.js"],"data-cover-never":["node_modules","test"],"output-reporter":"spec"}},"standard":{"ignore":["**/example/**"],"globals":["it"]},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","dependencies":{"string-width":"^4.2.0","strip-ansi":"^6.0.0","wrap-ansi":"^6.2.0"},"devDependencies":{"chai":"^4.2.0","chalk":"^3.0.0","coveralls":"^3.0.3","mocha":"^6.2.2","nyc":"^14.1.1","standard":"^12.0.1"},"engine":{"node":">=8"},"gitHead":"7761da3e8cddd1f49024252a6b0195a94565b357","bugs":{"url":"https://github.com/yargs/cliui/issues"},"_id":"cliui@6.0.0","_nodeVersion":"13.0.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==","shasum":"511d702c0c4e41ca156d7d0e96021f23e13225b1","tarball":"http://localhost:4260/cliui/cliui-6.0.0.tgz","fileCount":5,"unpackedSize":14873,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0HOpCRA9TVsSAnZWagAAbIQP/ijBtX9rdZGp+liNKOdI\nHXXvoC5bwDcEItg6CyPsDbeQWLQVt2NFe+x4UwECNYdk2VEYx5w9+6O+Yw/U\nRdQtEV6Ia9aHuo7EGwCuuuLs0F58t+976O89msU6F0MwSVCHe75FnVA8Jw6M\nJcBqAy14vlqKngXp1KtkZrt3+pmd4siwOlglhWZ3bRUQAiqpkcLBx/OaT4xl\npXgp7wwMJmdQ7yKz//ncJsiBs6yt21ukvh3MHXd2xeznBP6KIO5kuZ+aXwfe\nT2R/cBcH7A+MjlZr2lYHMfBcGTnHZ9Hwls2xqsXOXnAae/8sSVAjWwZHrA1K\nk+8cxhUHvyxcD+JahSJ3J5XXX5ToEZrYZ52NK8pwOHQANj2Md3qr5uj1C+pw\ng2ZKgMpZCWHsWAI9LK1qCsnkQRq0K59NgfynrFB4X75wqTAzbPMbRVCX1H72\nYFx6L9LQLlRF7YKCkwNjYIIFHKV2NNlgZTDQWhckD7enz4JuXm70Dti87ntp\nL9OTuABvAJmwcHebbh5ELfhszSAof/FgYOGD1r4zrWZSPBFlBVKLp0JzjHtK\n1pykG6YhVxzKIePK7ksHPIbZSwYf9O+NqTo1yw02EVk5GlRyJADhbn80mI5n\nIc3TjnKaSHCnLAs1Hr+Xbx0TlpzCTtk8OteZ8luS8cJCmfDmtTF/CpTag3Bo\n8Ieq\r\n=pcrZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBjblVIv0dQgLMhp3niugCvEUB2Wf4FvUIlwqN3BleYDAiAceF7BadnCX2aA7FUOW8bbCnz5Q6uGO5zD1F8bBHDvhw=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# cliui\n\n![ci](https://github.com/yargs/cliui/workflows/ci/badge.svg)\n[![NPM version](https://img.shields.io/npm/v/cliui.svg)](https://www.npmjs.com/package/cliui)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n![nycrc config on GitHub](https://img.shields.io/nycrc/yargs/cliui)\n\neasily create complex multi-column command-line-interfaces.\n\n## Example\n\n```js\nconst ui = require('cliui')()\n\nui.div('Usage: $0 [command] [options]')\n\nui.div({\n text: 'Options:',\n padding: [2, 0, 1, 0]\n})\n\nui.div(\n {\n text: \"-f, --file\",\n width: 20,\n padding: [0, 4, 0, 4]\n },\n {\n text: \"the file to load.\" +\n chalk.green(\"(if this description is long it wraps).\")\n ,\n width: 20\n },\n {\n text: chalk.red(\"[required]\"),\n align: 'right'\n }\n)\n\nconsole.log(ui.toString())\n```\n\n## Deno/ESM Support\n\nAs of `v7` `cliui` supports [Deno](https://github.com/denoland/deno) and\n[ESM](https://nodejs.org/api/esm.html#esm_ecmascript_modules):\n\n```typescript\nimport cliui from \"https://deno.land/x/cliui/deno.ts\";\n\nconst ui = cliui({})\n\nui.div('Usage: $0 [command] [options]')\n\nui.div({\n text: 'Options:',\n padding: [2, 0, 1, 0]\n})\n\nui.div({\n text: \"-f, --file\",\n width: 20,\n padding: [0, 4, 0, 4]\n})\n\nconsole.log(ui.toString())\n```\n\n<img width=\"500\" src=\"screenshot.png\">\n\n## Layout DSL\n\ncliui exposes a simple layout DSL:\n\nIf you create a single `ui.div`, passing a string rather than an\nobject:\n\n* `\\n`: characters will be interpreted as new rows.\n* `\\t`: characters will be interpreted as new columns.\n* `\\s`: characters will be interpreted as padding.\n\n**as an example...**\n\n```js\nvar ui = require('./')({\n width: 60\n})\n\nui.div(\n 'Usage: node ./bin/foo.js\\n' +\n ' <regex>\\t provide a regex\\n' +\n ' <glob>\\t provide a glob\\t [required]'\n)\n\nconsole.log(ui.toString())\n```\n\n**will output:**\n\n```shell\nUsage: node ./bin/foo.js\n <regex> provide a regex\n <glob> provide a glob [required]\n```\n\n## Methods\n\n```js\ncliui = require('cliui')\n```\n\n### cliui({width: integer})\n\nSpecify the maximum width of the UI being generated.\nIf no width is provided, cliui will try to get the current window's width and use it, and if that doesn't work, width will be set to `80`.\n\n### cliui({wrap: boolean})\n\nEnable or disable the wrapping of text in a column.\n\n### cliui.div(column, column, column)\n\nCreate a row with any number of columns, a column\ncan either be a string, or an object with the following\noptions:\n\n* **text:** some text to place in the column.\n* **width:** the width of a column.\n* **align:** alignment, `right` or `center`.\n* **padding:** `[top, right, bottom, left]`.\n* **border:** should a border be placed around the div?\n\n### cliui.span(column, column, column)\n\nSimilar to `div`, except the next row will be appended without\na new line being created.\n\n### cliui.resetOutput()\n\nResets the UI elements of the current cliui instance, maintaining the values\nset for `width` and `wrap`.\n","author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","readmeFilename":"README.md","homepage":"https://github.com/yargs/cliui#readme","repository":{"type":"git","url":"git+https://github.com/yargs/cliui.git"},"bugs":{"url":"https://github.com/yargs/cliui/issues"}}
+{
+ "name": "cliui",
+ "description": "easily create complex multi-column command-line-interfaces",
+ "dist-tags": {
+ "latest": "6.0.0"
+ },
+ "versions": {
+ "6.0.0": {
+ "name": "cliui",
+ "version": "6.0.0",
+ "description": "easily create complex multi-column command-line-interfaces",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "standard",
+ "test": "nyc mocha",
+ "coverage": "nyc --reporter=text-lcov mocha | coveralls"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/yargs/cliui.git"
+ },
+ "config": {
+ "blanket": {
+ "pattern": [
+ "index.js"
+ ],
+ "data-cover-never": [
+ "node_modules",
+ "test"
+ ],
+ "output-reporter": "spec"
+ }
+ },
+ "standard": {
+ "ignore": [
+ "**/example/**"
+ ],
+ "globals": [
+ "it"
+ ]
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "devDependencies": {
+ "chai": "^4.2.0",
+ "chalk": "^3.0.0",
+ "coveralls": "^3.0.3",
+ "mocha": "^6.2.2",
+ "nyc": "^14.1.1",
+ "standard": "^12.0.1"
+ },
+ "engine": {
+ "node": ">=8"
+ },
+ "gitHead": "7761da3e8cddd1f49024252a6b0195a94565b357",
+ "bugs": {
+ "url": "https://github.com/yargs/cliui/issues"
+ },
+ "_id": "cliui@6.0.0",
+ "_nodeVersion": "13.0.0",
+ "_npmVersion": "6.12.0",
+ "dist": {
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "shasum": "511d702c0c4e41ca156d7d0e96021f23e13225b1",
+ "tarball": "http://localhost:4260/cliui/cliui-6.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 14873
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/yargs/cliui#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/cliui.git"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/cliui/issues"
+ }
+}
diff --git a/tests/registry/npm/color-convert/registry.json b/tests/registry/npm/color-convert/registry.json
index 4df939aac..5a294b078 100644
--- a/tests/registry/npm/color-convert/registry.json
+++ b/tests/registry/npm/color-convert/registry.json
@@ -1 +1,74 @@
-{"name":"color-convert","description":"Plain color conversion functions","dist-tags":{"latest":"2.0.1"},"versions":{"2.0.1":{"name":"color-convert","description":"Plain color conversion functions","version":"2.0.1","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Qix-/color-convert.git"},"scripts":{"pretest":"xo","test":"node test/basic.js"},"engines":{"node":">=7.0.0"},"xo":{"rules":{"default-case":0,"no-inline-comments":0,"operator-linebreak":0}},"devDependencies":{"chalk":"^2.4.2","xo":"^0.24.0"},"dependencies":{"color-name":"~1.1.4"},"gitHead":"e1cb7846258e1d7aa25873814684d4fbbbca53ed","bugs":{"url":"https://github.com/Qix-/color-convert/issues"},"_id":"color-convert@2.0.1","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==","shasum":"72d3a68d598c9bdb3af2ad1e84f21d896abd4de3","tarball":"http://localhost:4260/color-convert/color-convert-2.0.1.tgz","fileCount":7,"unpackedSize":27189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWw8hCRA9TVsSAnZWagAAc60P/14ziCngY6rmLxrmBZwI\n/u9S0nyyyBwBtCMRDYg9QnZizmcuDmeoBb1ptCNHAqPzW9O5xS4jtc59h+Cz\nFJgsFWNdSxQm7VraaBfgRvlDD+epDc8TyHRarG3wZ3GwK/xUPDkY8exK7JHl\nTUqwy3rOSJlxlfY5KYqvcAw9jUW4Ki5NA+1mvWpill/T6GwwiU9/mxv3Ul6f\nSuid8MxGZxBKVy5qMASbJ452cer5QyPgbty57ZdpAqWiIK0s6iaESJJCjfxI\nyiO7lWZMpgRfDihzSCxBhEb3hdO+7dia5M/RJm2L0jkW1rO6oTtvdOiI82AN\nRgRMT53u+ZVgf3gXoVQHgHmb2aikycXVSnwRv4Z6JIrToxbxbYj6AmNgSb39\n4Royuzzlt17SIKTkJ0BF3ZKeumnQyeK2aIgDahRzT1xeVvCcpMLqsgpu6FKP\nsMDk9f7+nKvaQf13D7xh9tEeMB3wd5ab2FAYpk7Gk47jtOQTG5FGyGwIKCyn\nxaxv85/KDAITn0AQQ2dyPuUshoTQVPUCnaGlN2XNtnLQ9QjPXIkTfdYlgry4\n6ysJCtzKLrjaz1zXpvBxQmexcjpBozt7raOO76XqDc9rQY8hirMMT+kFn4wy\nBK0FSk4jJNPqb9GduVnyMGR3eq5UxrDZbYdowb+DpDBEih/DUimhi0+5uro1\nqeOh\r\n=9TuD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDawANUBU4JyKUu4FIXFy8S7MRHb4bNg7kk0ifG6KLYaQIgJ3p3N1TtoTXNQlvECo4whQoW3oot3kbzgAOutQTZTrA="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/Qix-/color-convert.git"},"readme":"# color-convert\n\n[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)\n\nColor-convert is a color conversion library for JavaScript and node.\nIt converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):\n\n```js\nvar convert = require('color-convert');\n\nconvert.rgb.hsl(140, 200, 100); // [96, 48, 59]\nconvert.keyword.rgb('blue'); // [0, 0, 255]\n\nvar rgbChannels = convert.rgb.channels; // 3\nvar cmykChannels = convert.cmyk.channels; // 4\nvar ansiChannels = convert.ansi16.channels; // 1\n```\n\n# Install\n\n```console\n$ npm install color-convert\n```\n\n# API\n\nSimply get the property of the _from_ and _to_ conversion that you're looking for.\n\nAll functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.\n\nAll 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).\n\n```js\nvar convert = require('color-convert');\n\n// Hex to LAB\nconvert.hex.lab('DEADBF'); // [ 76, 21, -2 ]\nconvert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]\n\n// RGB to CMYK\nconvert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ]\nconvert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]\n```\n\n### Arrays\nAll functions that accept multiple arguments also support passing an array.\n\nNote that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)\n\n```js\nvar convert = require('color-convert');\n\nconvert.rgb.hex(123, 45, 67); // '7B2D43'\nconvert.rgb.hex([123, 45, 67]); // '7B2D43'\n```\n\n## Routing\n\nConversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).\n\nKeep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of \"direct\" (single-step) conversions, see [conversions.js](conversions.js).\n\n# Contribute\n\nIf there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.\n\n# License\nCopyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).\n","readmeFilename":"README.md","homepage":"https://github.com/Qix-/color-convert#readme","bugs":{"url":"https://github.com/Qix-/color-convert/issues"},"license":"MIT"}
+{
+ "name": "color-convert",
+ "description": "Plain color conversion functions",
+ "dist-tags": {
+ "latest": "2.0.1"
+ },
+ "versions": {
+ "2.0.1": {
+ "name": "color-convert",
+ "description": "Plain color conversion functions",
+ "version": "2.0.1",
+ "author": {
+ "name": "Heather Arthur",
+ "email": "fayearthur@gmail.com"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Qix-/color-convert.git"
+ },
+ "scripts": {
+ "pretest": "xo",
+ "test": "node test/basic.js"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ },
+ "xo": {
+ "rules": {
+ "default-case": 0,
+ "no-inline-comments": 0,
+ "operator-linebreak": 0
+ }
+ },
+ "devDependencies": {
+ "chalk": "^2.4.2",
+ "xo": "^0.24.0"
+ },
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "gitHead": "e1cb7846258e1d7aa25873814684d4fbbbca53ed",
+ "bugs": {
+ "url": "https://github.com/Qix-/color-convert/issues"
+ },
+ "_id": "color-convert@2.0.1",
+ "_nodeVersion": "12.4.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "shasum": "72d3a68d598c9bdb3af2ad1e84f21d896abd4de3",
+ "tarball": "http://localhost:4260/color-convert/color-convert-2.0.1.tgz",
+ "fileCount": 7,
+ "unpackedSize": 27189
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Heather Arthur",
+ "email": "fayearthur@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Qix-/color-convert.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/Qix-/color-convert#readme",
+ "bugs": {
+ "url": "https://github.com/Qix-/color-convert/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/color-name/registry.json b/tests/registry/npm/color-name/registry.json
index b70632987..cc49ad60b 100644
--- a/tests/registry/npm/color-name/registry.json
+++ b/tests/registry/npm/color-name/registry.json
@@ -1 +1,57 @@
-{"name":"color-name","description":"A list of color names and its values","dist-tags":{"latest":"1.1.4"},"versions":{"1.1.4":{"name":"color-name","version":"1.1.4","description":"A list of color names and its values","main":"index.js","scripts":{"test":"node test.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/colorjs/color-name.git"},"author":{"name":"DY","email":"dfcreative@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/colorjs/color-name/issues"},"gitHead":"4536ce5944f56659a2dfb2198eaf81b5ad5f2ad9","_id":"color-name@1.1.4","_npmVersion":"6.4.1","_nodeVersion":"8.11.1","dist":{"integrity":"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==","shasum":"c2a09a87acbde69543de6f63fa3995c826c536a2","tarball":"http://localhost:4260/color-name/color-name-1.1.4.tgz","fileCount":4,"unpackedSize":6693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpMyZCRA9TVsSAnZWagAA8GsP/0AsmYCiGphh3CFKIPep\nvNTX/KZgee4XYpqtD9GtlSg2t7vq3RzzMqe0ZVaVtI6lHu6xbx1sjCSKveN2\nhhzpchB4yDFadju+d180Blrawa+JAuJW+mG5k346Iqt6d8zuPPrHhraR6fEY\ntHCVxhQiHpgyzoyMATZnII8fNc236SCgvDwV0vJsJS3xbJp21peIVgZAOZg+\nKNzcM6dH1yxgZb99THhHYI4za/+xkIm2oy8o9AKIJz8HcogqOG5MHaklc5R+\niZlIE5A9KpbUbLerhUatXUKu6CeosCbQcPcYsOfifXw5ifQunM86ySU6OgQF\nSADAeVO6k5ZBFvzaSjc7La7+MisZ2KPAKiegCLMxcqc5xVBCcjZb0F7vS59m\nHTAa/uHLgmv76wiNMz2zHR+1qYWt3/mQq5OItunccFZQ5jxw3JWzygY9C/Zs\ndUakmc6+pCScPuDzs6OruKqHPk4S0fv8HfH8wBGFzd0GvHtT8xKUmit5p6G7\nTIPJV+dVaz5iO8uhhtUpVUogs8Y9DyoRDBaz3Btq19B8sYBwacMlRZCHiwBQ\nYdpTe9Go7NBPUNYEUsiSiZxCT6GuIdCit6P6Dwx6AZ3+DdeTEB1DcF9UVycE\nwbc1jz10q0pTbW5REgtFZ5eDTVXUkepA3+P6sLwubq7yu8lsqO34tYp3rOop\nshOJ\r\n=Rq6j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA/cRJF1USbKE8OvNZK7EOTIg9+Bg+KvqGyAcFM83/7VAiB4QKj7PJ06UPRuqXUutmL6e+n5XgOGZlpNzYmkOyPUSQ=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.\r\n\r\n[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)\r\n\r\n\r\n```js\r\nvar colors = require('color-name');\r\ncolors.red //[255,0,0]\r\n```\r\n\r\n<a href=\"LICENSE\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg\" width=\"120\"/></a>\r\n","homepage":"https://github.com/colorjs/color-name","repository":{"type":"git","url":"git+ssh://git@github.com/colorjs/color-name.git"},"author":{"name":"DY","email":"dfcreative@gmail.com"},"bugs":{"url":"https://github.com/colorjs/color-name/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "color-name",
+ "description": "A list of color names and its values",
+ "dist-tags": {
+ "latest": "1.1.4"
+ },
+ "versions": {
+ "1.1.4": {
+ "name": "color-name",
+ "version": "1.1.4",
+ "description": "A list of color names and its values",
+ "main": "index.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/colorjs/color-name.git"
+ },
+ "author": {
+ "name": "DY",
+ "email": "dfcreative@gmail.com"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/colorjs/color-name/issues"
+ },
+ "gitHead": "4536ce5944f56659a2dfb2198eaf81b5ad5f2ad9",
+ "_id": "color-name@1.1.4",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "8.11.1",
+ "dist": {
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "shasum": "c2a09a87acbde69543de6f63fa3995c826c536a2",
+ "tarball": "http://localhost:4260/color-name/color-name-1.1.4.tgz",
+ "fileCount": 4,
+ "unpackedSize": 6693
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/colorjs/color-name",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/colorjs/color-name.git"
+ },
+ "author": {
+ "name": "DY",
+ "email": "dfcreative@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/colorjs/color-name/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/cowsay/registry.json b/tests/registry/npm/cowsay/registry.json
index b655f2622..d171f36f2 100644
--- a/tests/registry/npm/cowsay/registry.json
+++ b/tests/registry/npm/cowsay/registry.json
@@ -1 +1,86 @@
-{"name":"cowsay","description":"cowsay is a configurable talking cow","dist-tags":{"latest":"1.5.0"},"versions":{"1.5.0":{"name":"cowsay","version":"1.5.0","description":"cowsay is a configurable talking cow","author":{"name":"Fabio Crisci","email":"piuccio@gmail.com","url":"https://github.com/piuccio/"},"license":"MIT","main":"./index","types":"./index.d.ts","module":"./build/cowsay.es.js","browser":"./build/cowsay.umd.js","bin":{"cowsay":"cli.js","cowthink":"cli.js"},"repository":{"type":"git","url":"git+https://github.com/piuccio/cowsay.git"},"scripts":{"prepare":"rollup -c","test":"tape test/**/*.js | tap-dot"},"dependencies":{"get-stdin":"8.0.0","string-width":"~2.1.1","strip-final-newline":"2.0.0","yargs":"15.4.1"},"devDependencies":{"@rollup/plugin-commonjs":"15.0.0","@rollup/plugin-node-resolve":"9.0.0","execa":"5.0.0","rollup":"2.26.5","rollup-plugin-string":"3.0.0","tap-dot":"2.0.0","tape":"5.0.1"},"preferGlobal":true,"engines":{"node":">= 4"},"gitHead":"692127f8c29f071cc081a5bf41cb51c4b012ef18","bugs":{"url":"https://github.com/piuccio/cowsay/issues"},"_id":"cowsay@1.5.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-8Ipzr54Z8zROr/62C8f0PdhQcDusS05gKTS87xxdji8VbWefWly0k8BwGK7+VqamOrkv3eGsCkPtvlHzrhWsCA==","shasum":"4a2a453b8b59383c7d7a50e44d765c5de0bf615f","tarball":"http://localhost:4260/cowsay/cowsay-1.5.0.tgz","fileCount":202,"unpackedSize":277259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsHV0CRA9TVsSAnZWagAADjsP/A4MpqF8x0gI5BfOQ3vp\nHQg/fnDVsYd+vSLXeEDGn44np72O8w3SLdNuS9KRpj2MrsCP9oA5eqVtyvIu\nXoiK5ygVV/0Rq+JaY0V2FMn8VAsTDxTUt7KunN2eSRAzNSaPVh3HOndSO5nh\n4W2j9MvMXss+iePZKhmAW6wgcnj84dW6kYsjRmlO9M4miBMcL8hoWEyeWobm\nkEY7EDSA3zDwGanWPDp7RGFZsjBzoQwIhmvsewUjrkW1xbNSnKg/nKltcFLO\nRgC7Aa+zFevFz9+SUPLtWyrJ1ZcuHZ8fT3S5hL9/lWXweSydOqvM6cnvIi16\ned5CLWq4/rFylTvr18KXCC5lm+IQjRa9SioU5lBp/nETqrER56N5clS9rqX9\n7aMsP6JgsXMGOPZQ0Zkg1lF1cDvSrYI+ZfKuiAhw9AKsZK/BFmLF7LG2dWAT\nxWqyG2ZQtrvnXFgU7BWEvh9nDJxabRffUPzwBDHN7eJgFlFZO2F5ofcBu21t\ni1vUSbL5Qd7Ip8jP2ScJiNE2siH5CRutdjVjAOw13WWyiPZpF4OsCKqgkVD/\nm2jMsqeUU0DjN/SgOTvAZiyDyW7p+E7BGYno/uLEQQe97C2f4BG6FxYNLZ7P\n+OK0oHX6ssEu7MAHEjhFY6aIIJyR3YLQ3VjBj44nHoN07cLcEmRnhEWBcMwP\nX5TS\r\n=SE4V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDF7XRc3OJHKWff5596Pr9rOiFUzXMs0eVNt/lfWu5lYgIgChPEMnRXMWCHvcB/8qupW63YJ4QGz1ds40ipKpfCA0I="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# cowsay\n\n````\n __________________\n< srsly dude, why? >\n ------------------\n \\ ^__^\n \\ (oo)\\_______\n (__)\\ )\\/\\\n ||----w |\n || ||\n````\n\ncowsay is a configurable talking cow, originally written in Perl by [Tony Monroe](https://github.com/tnalpgge/rank-amateur-cowsay)\n\nThis project is a translation in JavaScript of the original program and an attempt to bring the same silliness to node.js.\n\n## Install\n\n npm install -g cowsay\n\n## Usage\n\n cowsay JavaScript FTW!\n\nor\n\n cowthink node.js is cool\n\nIt acts in the same way as the original cowsay, so consult `cowsay(1)` or run `cowsay -h`\n\n````\n ________\n< indeed >\n --------\n \\\n \\\n .::!!!!!!!:.\n .!!!!!:. .:!!!!!!!!!!!!\n ~~~~!!!!!!. .:!!!!!!!!!UWWW$$$\n :$$NWX!!: .:!!!!!!XUWW$$$$$$$$$P\n $$$$$##WX!: .<!!!!UW$$$$\" $$$$$$$$#\n $$$$$ $$$UX :!!UW$$$$$$$$$ 4$$$$$*\n ^$$$B $$$$\\ $$$$$$$$$$$$ d$$R\"\n \"*$bd$$$$ '*$$$$$$$$$$$o+#\"\n \"\"\"\" \"\"\"\"\"\"\"\n````\n\n## Usage as a module\n\ncowsay can be used as any other npm dependency\n```js\nvar cowsay = require(\"cowsay\");\n\nconsole.log(cowsay.say({\n text : \"I'm a moooodule\",\n e : \"oO\",\n T : \"U \"\n}));\n\n// or cowsay.think()\n```\n````\n _________________\n( I'm a moooodule )\n -----------------\n o ^__^\n o (oO)\\_______\n (__)\\ )\\/\\\n U ||----w |\n || ||\n````\n\ngetting a list of cow names:\n```js\nfunction get_cows(error, cow_names) {\n if (error) {\n console.log(error)\n }\n else if (cow_names) {\n console.log(`Number of cows available: ${cow_names.length}`);\n }\n}\n\ncowsay.list(get_cows);\n```\n\n#### Typescript examples:\n```ts\nimport * as cowsay from \"cowsay\"\n\nlet output: string = cowsay.say({ text: 'Hello from typescript!' });\n\nconsole.log(output);\n```\n\ngetting a list of cow names:\n```ts\nfunction get_cows(error: NodeJS.ErrnoException, cow_names: Array<string>): void {\n if (error) {\n console.log(`Error getting cow names: ${error.message}`)\n }\n else if (cow_names) {\n console.log(`Number of cows available: ${cow_names.length}`);\n }\n}\n\ncowsay.list(get_cows);\n```\n\nimporting the `IOptions` interface directly:\n```ts\nimport { IOptions } from \"cowsay\" // optional\n\nlet opts: IOptions = {\n text: \"Hello from TypeScript!\",\n e: '^^',\n r: true,\n};\n\nconsole.log(cowsay.say(opts));\n```\n\n\n## Pipe from standard input\n\n echo please repeat | cowsay\n\n## Usage in the browser\n\ncowsay works in your browser too with rollup / webpack / browserify / you name it.\n\n```js\nimport { say } from 'cowsay';\n\nconsole.log(say({ text: 'grazing in the browser' }));\n```\n\nYou can customize the cow by importing the relevant one\n\n```js\nimport { think, SQUIRREL } from 'cowsay';\n\nconsole.log(think({\n text: 'grazing in the browser',\n cow: SQUIRREL,\n eyes: 'pp',\n tongue: ';;',\n}));\n```\n\nAll cows are included in the bundle, but you can use rollup / webpack tree-shake feature to reduce the final bundle size.\n\n### Browser options\n\n```js\nsay({\n text: 'hello',\n cow: '', // Template for a cow, get inspiration from `./cows`\n eyes: 'oo', // Select the appearance of the cow's eyes, equivalent to cowsay -e\n tongue: 'L|', // The tongue is configurable similarly to the eyes through -T and tongue_string, equivalent to cowsay -T\n wrap: false, // If it is specified, the given message will not be word-wrapped. equivalent to cowsay -n\n wrapLength: 40, // Specifies roughly where the message should be wrapped. equivalent to cowsay -W\n mode: 'b', // One of \t\"b\", \"d\", \"g\", \"p\", \"s\", \"t\", \"w\", \"y\"\n});\n```\n","author":{"name":"Fabio Crisci","email":"piuccio@gmail.com","url":"https://github.com/piuccio/"},"repository":{"type":"git","url":"git+https://github.com/piuccio/cowsay.git"},"homepage":"https://github.com/piuccio/cowsay","bugs":{"url":"https://github.com/piuccio/cowsay/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "cowsay",
+ "description": "cowsay is a configurable talking cow",
+ "dist-tags": {
+ "latest": "1.5.0"
+ },
+ "versions": {
+ "1.5.0": {
+ "name": "cowsay",
+ "version": "1.5.0",
+ "description": "cowsay is a configurable talking cow",
+ "author": {
+ "name": "Fabio Crisci",
+ "email": "piuccio@gmail.com",
+ "url": "https://github.com/piuccio/"
+ },
+ "license": "MIT",
+ "main": "./index",
+ "types": "./index.d.ts",
+ "module": "./build/cowsay.es.js",
+ "browser": "./build/cowsay.umd.js",
+ "bin": {
+ "cowsay": "cli.js",
+ "cowthink": "cli.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/piuccio/cowsay.git"
+ },
+ "scripts": {
+ "prepare": "rollup -c",
+ "test": "tape test/**/*.js | tap-dot"
+ },
+ "dependencies": {
+ "get-stdin": "8.0.0",
+ "string-width": "~2.1.1",
+ "strip-final-newline": "2.0.0",
+ "yargs": "15.4.1"
+ },
+ "devDependencies": {
+ "@rollup/plugin-commonjs": "15.0.0",
+ "@rollup/plugin-node-resolve": "9.0.0",
+ "execa": "5.0.0",
+ "rollup": "2.26.5",
+ "rollup-plugin-string": "3.0.0",
+ "tap-dot": "2.0.0",
+ "tape": "5.0.1"
+ },
+ "preferGlobal": true,
+ "engines": {
+ "node": ">= 4"
+ },
+ "gitHead": "692127f8c29f071cc081a5bf41cb51c4b012ef18",
+ "bugs": {
+ "url": "https://github.com/piuccio/cowsay/issues"
+ },
+ "_id": "cowsay@1.5.0",
+ "_nodeVersion": "12.18.3",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-8Ipzr54Z8zROr/62C8f0PdhQcDusS05gKTS87xxdji8VbWefWly0k8BwGK7+VqamOrkv3eGsCkPtvlHzrhWsCA==",
+ "shasum": "4a2a453b8b59383c7d7a50e44d765c5de0bf615f",
+ "tarball": "http://localhost:4260/cowsay/cowsay-1.5.0.tgz",
+ "fileCount": 202,
+ "unpackedSize": 277259
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Fabio Crisci",
+ "email": "piuccio@gmail.com",
+ "url": "https://github.com/piuccio/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/piuccio/cowsay.git"
+ },
+ "homepage": "https://github.com/piuccio/cowsay",
+ "bugs": {
+ "url": "https://github.com/piuccio/cowsay/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/cpu-features/registry.json b/tests/registry/npm/cpu-features/registry.json
index 5449d4a2c..6880c34e5 100644
--- a/tests/registry/npm/cpu-features/registry.json
+++ b/tests/registry/npm/cpu-features/registry.json
@@ -1 +1,77 @@
-{"name":"cpu-features","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.4":{"name":"cpu-features","version":"0.0.4","author":{"name":"Brian White","email":"mscdex@mscdex.net"},"description":"A simple binding to Google's cpu_features library for obtaining information about installed CPU(s)","main":"./lib/index","dependencies":{"buildcheck":"0.0.3","nan":"^2.15.0"},"devDependencies":{"@mscdex/eslint-config":"^1.1.0","eslint":"^7.0.0"},"scripts":{"install":"node buildcheck.js > buildcheck.gypi && node-gyp rebuild","test":"node test/test.js","lint":"eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib test","lint:fix":"npm run lint -- --fix"},"engines":{"node":">=10.0.0"},"licenses":[{"type":"MIT","url":"https://github.com/mscdex/cpu-features/raw/master/LICENSE"}],"repository":{"type":"git","url":"git+https://github.com/mscdex/cpu-features.git"},"_resolved":"","_integrity":"","_from":"https://github.com/mscdex/cpu-features/tarball/v0.0.4","bugs":{"url":"https://github.com/mscdex/cpu-features/issues"},"_id":"cpu-features@0.0.4","_nodeVersion":"10.22.1","_npmVersion":"6.14.6","dist":{"integrity":"sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==","shasum":"0023475bb4f4c525869c162e4108099e35bf19d8","tarball":"http://localhost:4260/cpu-features/cpu-features-0.0.4.tgz","fileCount":124,"unpackedSize":441166,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSoV5qJZIAzWTYCD64r4fVmVBgeFomwHHNYtaKRCEvKwIhAKRJESSPM24XRXra2se6hwBay/LKhu6xjQNB0xaAxOBc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRx9JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+5w/+KuurV/OwC51tg6PDWX8G3ii9UOqdhwAyZNLPH7Mwje02Lkak\r\nWYTr4fyEYajXSM5xCi3btEdK4npEX9bfUVpwh/OOBPJ9vHg0lcF6oFpl0d3K\r\ngXO36F6oI+qsTE6QVDgyv8ugQtSEjGkcyI9wiwJfWxODxDCZzl54Ai4MCla1\r\nLnDuISklJAJTwGFiMFwsNKicys4l8nqYdJUL5TL92+WTDBI07aqHEBagJzfH\r\novlDbQUHrKO5dXn0tGLrwQUQ4gmwak2vMID007PiAAW7XZD3QPrsq5mAqXCp\r\nQVU3/a5Zf+ApDRl0wSHbLU8SMqU+M3tCUS/Nn7vCzUYXPE+urFS/vM+y/KHS\r\n/zYvVDq6Lh/x72pThqIdDM9ieVThZUzeQRkcnK8JKCJjh3e8hUNu5zoSk0KX\r\ndxhSL4L22jZaBNY9+YzCxKS9iTrSiE1i9NOOzuBQ1qezF840RrJJrqRnMWq3\r\nf1WRU8CeUhZv6xgz9xaDWrLHAygAOlh6LNJj3Olshi0QGwfk6RCRodjZhlpV\r\nj92Z3J4pKauQcvXDfJRroeyg8JgB79UHhrauekUs/ExEYwmg5lAuRaYJp4vG\r\nSXR0q3bJsRxAtVriNaqd6zyEGiVPAuf2J2uVT6/GW0pg58ma0W/Xp0XBYjnE\r\npzj6Ywk2ciP+lL854X5noeBnTxcCBWCcRhk=\r\n=W+qc\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"A simple binding to Google's cpu_features library for obtaining information about installed CPU(s)","homepage":"https://github.com/mscdex/cpu-features#readme","repository":{"type":"git","url":"git+https://github.com/mscdex/cpu-features.git"},"author":{"name":"Brian White","email":"mscdex@mscdex.net"},"bugs":{"url":"https://github.com/mscdex/cpu-features/issues"},"readme":"\nDescription\n===========\n\nA simple [node.js](https://nodejs.org) binding to [cpu_features](https://github.com/google/cpu_features) for obtaining information about installed CPU(s).\n\n\nRequirements\n============\n\n* [node.js](http://nodejs.org/) -- v10.0.0 or newer\n* An appropriate build environment -- see [node-gyp's documentation](https://github.com/nodejs/node-gyp/blob/master/README.md)\n\n\nInstall\n=======\n\n npm install cpu-features\n\n\nExample\n=======\n\n```js\n // Generally it's a good idea to just call this once and\n // reuse the result since `cpu-features` does not cache\n // the result itself.\n const features = require('cpu-features')();\n\n console.log(features);\n // example output:\n // { arch: 'x86',\n // brand: 'Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz',\n // family: 6,\n // model: 58,\n // stepping: 9,\n // uarch: 'INTEL_IVB',\n // flags:\n // { fpu: true,\n // tsc: true,\n // cx8: true,\n // clfsh: true,\n // mmx: true,\n // aes: true,\n // erms: true,\n // f16c: true,\n // sse: true,\n // sse2: true,\n // sse3: true,\n // ssse3: true,\n // sse4_1: true,\n // sse4_2: true,\n // avx: true,\n // pclmulqdq: true,\n // cx16: true,\n // popcnt: true,\n // rdrnd: true,\n // ss: true } }\n```\n","readmeFilename":"README.md"}
+{
+ "name": "cpu-features",
+ "dist-tags": {
+ "latest": "0.0.4"
+ },
+ "versions": {
+ "0.0.4": {
+ "name": "cpu-features",
+ "version": "0.0.4",
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "description": "A simple binding to Google's cpu_features library for obtaining information about installed CPU(s)",
+ "main": "./lib/index",
+ "dependencies": {
+ "buildcheck": "0.0.3",
+ "nan": "^2.15.0"
+ },
+ "devDependencies": {
+ "@mscdex/eslint-config": "^1.1.0",
+ "eslint": "^7.0.0"
+ },
+ "scripts": {
+ "install": "node buildcheck.js > buildcheck.gypi && node-gyp rebuild",
+ "test": "node test/test.js",
+ "lint": "eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib test",
+ "lint:fix": "npm run lint -- --fix"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://github.com/mscdex/cpu-features/raw/master/LICENSE"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mscdex/cpu-features.git"
+ },
+ "_resolved": "",
+ "_integrity": "",
+ "_from": "https://github.com/mscdex/cpu-features/tarball/v0.0.4",
+ "bugs": {
+ "url": "https://github.com/mscdex/cpu-features/issues"
+ },
+ "_id": "cpu-features@0.0.4",
+ "_nodeVersion": "10.22.1",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
+ "shasum": "0023475bb4f4c525869c162e4108099e35bf19d8",
+ "tarball": "http://localhost:4260/cpu-features/cpu-features-0.0.4.tgz",
+ "fileCount": 124,
+ "unpackedSize": 441166
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A simple binding to Google's cpu_features library for obtaining information about installed CPU(s)",
+ "homepage": "https://github.com/mscdex/cpu-features#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mscdex/cpu-features.git"
+ },
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "bugs": {
+ "url": "https://github.com/mscdex/cpu-features/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/cross-spawn/registry.json b/tests/registry/npm/cross-spawn/registry.json
index 051d26c61..462096714 100644
--- a/tests/registry/npm/cross-spawn/registry.json
+++ b/tests/registry/npm/cross-spawn/registry.json
@@ -1 +1,101 @@
-{"name":"cross-spawn","description":"Cross platform child_process#spawn and child_process#spawnSync","dist-tags":{"latest":"7.0.3"},"versions":{"7.0.3":{"name":"cross-spawn","version":"7.0.3","description":"Cross platform child_process#spawn and child_process#spawnSync","author":{"name":"André Cruz","email":"andre@moxy.studio"},"repository":{"type":"git","url":"git+ssh://git@github.com/moxystudio/node-cross-spawn.git"},"license":"MIT","main":"index.js","scripts":{"lint":"eslint .","test":"jest --env node --coverage","prerelease":"npm t && npm run lint","release":"standard-version","postrelease":"git push --follow-tags origin HEAD && npm publish"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged"}},"lint-staged":{"*.js":["eslint --fix","git add"]},"commitlint":{"extends":["@commitlint/config-conventional"]},"dependencies":{"path-key":"^3.1.0","shebang-command":"^2.0.0","which":"^2.0.1"},"devDependencies":{"@commitlint/cli":"^8.1.0","@commitlint/config-conventional":"^8.1.0","babel-core":"^6.26.3","babel-jest":"^24.9.0","babel-preset-moxy":"^3.1.0","eslint":"^5.16.0","eslint-config-moxy":"^7.1.0","husky":"^3.0.5","jest":"^24.9.0","lint-staged":"^9.2.5","mkdirp":"^0.5.1","rimraf":"^3.0.0","standard-version":"^7.0.0"},"engines":{"node":">= 8"},"gitHead":"7bc42bc409d9da6ad691df8d1d5ef69003bf1dc3","bugs":{"url":"https://github.com/moxystudio/node-cross-spawn/issues"},"_id":"cross-spawn@7.0.3","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==","shasum":"f73a85b9d5d41d045551c177e2882d4ac85728a6","tarball":"http://localhost:4260/cross-spawn/cross-spawn-7.0.3.tgz","fileCount":10,"unpackedSize":21207,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJey+WtCRA9TVsSAnZWagAAQbcP/1FGxwkPr+a5gx/ntrWD\n5YJdj1PVM6QsC2wUtn8CwW8GQVt5S4jMEQ4ZWbhBPgsHKyvfC4O5CxwGa7JR\n/ONvY8hrfjeXZZ7ePL0u683K05+wBC8n9anUd/RROEbF/0Ptia7pWyiKGEpG\nTh6btdUzKIijKtXrANxXe/U7dXOtFtg3sEtKKhFGB0EFl2x6vQJi3FlCasfT\nTrL4kCVcGiLFVDFLPgM18iRDG83obqsi0fnujL/EzLSGt1ldBm0aTNyIUWkt\nDdcvuWYTDAH6yCEB/kDIUfBTy94p2Vc5yp76Rp5vMCbPPBWEHszGbHcGqhkK\n0BFTs/e5dzhCDZ0i83YCwyTBP0bF+Jzum4/lckN2m5VYeeWAbfvB5G2jmUAv\nlTXNyPsg03ycX3p6OvSxbdpSzea/SZVYybr59gHHBkL4JgoFo2ypFs0ZVJfw\ncG4A8LF4z6V2DbLVviLUVsQ6KQqKaCTLxMLcfwd59AHVUrGqtzB6EzqYfyl5\n9oYQgZF78WjXTezST2e7cf14ITfIv7voJ5ci9xVh27L0wvkSvJX4SENyn9Nr\ngIvfeSSJndO76mhB0vZ6ArW6S9BV/FspGpZm5zASk+i9tj+ppy19zbNWhm/5\ncvN8TJiui80niDmnM6mHXHrC3mZiIBgFJHp9NoepmUG03GG9lmLCab3CkGu6\nhqhR\r\n=lXVa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDV3uyoAawrXTO40sTQ71+tY4UBLGXyIxxzykg9MOSZRgIhAOXE5g5AY0aGrmKohMbsOiiiWUWew3zD5tGO9e/D6VNJ"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# cross-spawn\n\n[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Coverage Status][codecov-image]][codecov-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url]\n\n[npm-url]:https://npmjs.org/package/cross-spawn\n[downloads-image]:https://img.shields.io/npm/dm/cross-spawn.svg\n[npm-image]:https://img.shields.io/npm/v/cross-spawn.svg\n[travis-url]:https://travis-ci.org/moxystudio/node-cross-spawn\n[travis-image]:https://img.shields.io/travis/moxystudio/node-cross-spawn/master.svg\n[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn\n[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg\n[codecov-url]:https://codecov.io/gh/moxystudio/node-cross-spawn\n[codecov-image]:https://img.shields.io/codecov/c/github/moxystudio/node-cross-spawn/master.svg\n[david-dm-url]:https://david-dm.org/moxystudio/node-cross-spawn\n[david-dm-image]:https://img.shields.io/david/moxystudio/node-cross-spawn.svg\n[david-dm-dev-url]:https://david-dm.org/moxystudio/node-cross-spawn?type=dev\n[david-dm-dev-image]:https://img.shields.io/david/dev/moxystudio/node-cross-spawn.svg\n\nA cross platform solution to node's spawn and spawnSync.\n\n\n## Installation\n\nNode.js version 8 and up:\n`$ npm install cross-spawn`\n\nNode.js version 7 and under:\n`$ npm install cross-spawn@6`\n\n## Why\n\nNode has issues when using spawn on Windows:\n\n- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318)\n- It does not support [shebangs](https://en.wikipedia.org/wiki/Shebang_(Unix))\n- Has problems running commands with [spaces](https://github.com/nodejs/node/issues/7367)\n- Has problems running commands with posix relative paths (e.g.: `./my-folder/my-executable`)\n- Has an [issue](https://github.com/moxystudio/node-cross-spawn/issues/82) with command shims (files in `node_modules/.bin/`), where arguments with quotes and parenthesis would result in [invalid syntax error](https://github.com/moxystudio/node-cross-spawn/blob/e77b8f22a416db46b6196767bcd35601d7e11d54/test/index.test.js#L149)\n- No `options.shell` support on node `<v4.8`\n\nAll these issues are handled correctly by `cross-spawn`.\nThere are some known modules, such as [win-spawn](https://github.com/ForbesLindesay/win-spawn), that try to solve this but they are either broken or provide faulty escaping of shell arguments.\n\n\n## Usage\n\nExactly the same way as node's [`spawn`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) or [`spawnSync`](https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options), so it's a drop in replacement.\n\n\n```js\nconst spawn = require('cross-spawn');\n\n// Spawn NPM asynchronously\nconst child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });\n\n// Spawn NPM synchronously\nconst result = spawn.sync('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });\n```\n\n\n## Caveats\n\n### Using `options.shell` as an alternative to `cross-spawn`\n\nStarting from node `v4.8`, `spawn` has a `shell` option that allows you run commands from within a shell. This new option solves\nthe [PATHEXT](https://github.com/joyent/node/issues/2318) issue but:\n\n- It's not supported in node `<v4.8`\n- You must manually escape the command and arguments which is very error prone, specially when passing user input\n- There are a lot of other unresolved issues from the [Why](#why) section that you must take into account\n\nIf you are using the `shell` option to spawn a command in a cross platform way, consider using `cross-spawn` instead. You have been warned.\n\n### `options.shell` support\n\nWhile `cross-spawn` adds support for `options.shell` in node `<v4.8`, all of its enhancements are disabled.\n\nThis mimics the Node.js behavior. More specifically, the command and its arguments will not be automatically escaped nor shebang support will be offered. This is by design because if you are using `options.shell` you are probably targeting a specific platform anyway and you don't want things to get into your way.\n\n### Shebangs support\n\nWhile `cross-spawn` handles shebangs on Windows, its support is limited. More specifically, it just supports `#!/usr/bin/env <program>` where `<program>` must not contain any arguments. \nIf you would like to have the shebang support improved, feel free to contribute via a pull-request.\n\nRemember to always test your code on Windows!\n\n\n## Tests\n\n`$ npm test` \n`$ npm test -- --watch` during development\n\n\n## License\n\nReleased under the [MIT License](https://www.opensource.org/licenses/mit-license.php).\n","homepage":"https://github.com/moxystudio/node-cross-spawn","repository":{"type":"git","url":"git+ssh://git@github.com/moxystudio/node-cross-spawn.git"},"author":{"name":"André Cruz","email":"andre@moxy.studio"},"bugs":{"url":"https://github.com/moxystudio/node-cross-spawn/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "cross-spawn",
+ "description": "Cross platform child_process#spawn and child_process#spawnSync",
+ "dist-tags": {
+ "latest": "7.0.3"
+ },
+ "versions": {
+ "7.0.3": {
+ "name": "cross-spawn",
+ "version": "7.0.3",
+ "description": "Cross platform child_process#spawn and child_process#spawnSync",
+ "author": {
+ "name": "André Cruz",
+ "email": "andre@moxy.studio"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/moxystudio/node-cross-spawn.git"
+ },
+ "license": "MIT",
+ "main": "index.js",
+ "scripts": {
+ "lint": "eslint .",
+ "test": "jest --env node --coverage",
+ "prerelease": "npm t && npm run lint",
+ "release": "standard-version",
+ "postrelease": "git push --follow-tags origin HEAD && npm publish"
+ },
+ "husky": {
+ "hooks": {
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "*.js": [
+ "eslint --fix",
+ "git add"
+ ]
+ },
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ]
+ },
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^8.1.0",
+ "@commitlint/config-conventional": "^8.1.0",
+ "babel-core": "^6.26.3",
+ "babel-jest": "^24.9.0",
+ "babel-preset-moxy": "^3.1.0",
+ "eslint": "^5.16.0",
+ "eslint-config-moxy": "^7.1.0",
+ "husky": "^3.0.5",
+ "jest": "^24.9.0",
+ "lint-staged": "^9.2.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^3.0.0",
+ "standard-version": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ },
+ "gitHead": "7bc42bc409d9da6ad691df8d1d5ef69003bf1dc3",
+ "bugs": {
+ "url": "https://github.com/moxystudio/node-cross-spawn/issues"
+ },
+ "_id": "cross-spawn@7.0.3",
+ "_nodeVersion": "12.16.3",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "shasum": "f73a85b9d5d41d045551c177e2882d4ac85728a6",
+ "tarball": "http://localhost:4260/cross-spawn/cross-spawn-7.0.3.tgz",
+ "fileCount": 10,
+ "unpackedSize": 21207
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/moxystudio/node-cross-spawn",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/moxystudio/node-cross-spawn.git"
+ },
+ "author": {
+ "name": "André Cruz",
+ "email": "andre@moxy.studio"
+ },
+ "bugs": {
+ "url": "https://github.com/moxystudio/node-cross-spawn/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/crypto-js/registry.json b/tests/registry/npm/crypto-js/registry.json
index 3ba6f1e62..f5569a4d9 100644
--- a/tests/registry/npm/crypto-js/registry.json
+++ b/tests/registry/npm/crypto-js/registry.json
@@ -1 +1,58 @@
-{"name":"crypto-js","description":"JavaScript library of crypto standards.","dist-tags":{"latest":"4.1.1"},"versions":{"4.1.1":{"name":"crypto-js","version":"4.1.1","description":"JavaScript library of crypto standards.","license":"MIT","author":{"name":"Evan Vosberg","url":"http://github.com/evanvosberg"},"repository":{"type":"git","url":"git+ssh://git@github.com/brix/crypto-js.git"},"main":"index.js","dependencies":{},"browser":{"crypto":false},"gitHead":"7c26cc72a618053c294309c22c95a895af39b7b7","bugs":{"url":"https://github.com/brix/crypto-js/issues"},"_id":"crypto-js@4.1.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==","shasum":"9e485bcf03521041bd85844786b83fb7619736cf","tarball":"http://localhost:4260/crypto-js/crypto-js-4.1.1.tgz","fileCount":55,"unpackedSize":443864,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+VyvCRA9TVsSAnZWagAARZYQAJlADGhjvGRce4dYK7dc\nbtY5w4EXXZ1LyK1XATNYxwcVmA2LhIer7GKkarr0q7A7idN6CvPrJ2BtiQhZ\nxbP7gbyuWJ62S2DvMmC5xBLK225i2f3BnMD7L0C/mjYnjy9WzVnUMNr0x7OP\nTbEu92yXZiYI1BlpbaBOAhxBgc6XZtPXlOwchh0kSZirNvWS9+BLOPWBfAD+\nzoFD7XMMIySxdZa0CL3Y6h/Y7Yo3iFFVygwYJfj8JdkJk7HLrUHEXq9zjZ5m\nUOKrOldl2rrIui28uF/GIR3ObXXHTA/oqhr/GdvXcdCHJWBqytojdevJ4ijE\n8hit0d6BRfMqA6sK4Mb6QqPlTn3m7XQd6WqEtpMEI9ah3JO5yA+KklP3HyES\nI5E2djCz9J9d4x+yM0wFlfP2ZP2z/xNFFl7OdVk+0rgeDJZ/aiLp8v6b84z/\nAoWBUsjRXcNdnEMrM9YhVEtYULDokz/rqb+qxrVgYJZykGpNzhV02jnNxeka\nWGYpS/vJWDsuBlntX52swAaOsygEVcCVqi4p6Cj+xsh3thPZEUqIQej5g8+3\nsvTbwh/q3ay2jlRDCbN1S0nXxlZgtYs6ONB+NUkA+xVqrXm+ZuSGa+HvqFU5\nGp4SmDwtQTvphUd6NE4ZtZ01E7h8gqvveQ789fzd98OkMNen4qtYqFspua+z\nBwlP\r\n=kt9s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFkpEFcFkddoirHN3vTnn/BPJA1RT5bDPbTCrS8og0B0AiAiSY0ISuuKUJowa5hCUEINK1GuvR6X6tcKOPxCBzB+vA=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# crypto-js [![Build Status](https://travis-ci.org/brix/crypto-js.svg?branch=develop)](https://travis-ci.org/brix/crypto-js)\n\nJavaScript library of crypto standards.\n\n## Node.js (Install)\n\nRequirements:\n\n- Node.js\n- npm (Node.js package manager)\n\n```bash\nnpm install crypto-js\n```\n\n### Usage\n\nES6 import for typical API call signing use case:\n\n```javascript\nimport sha256 from 'crypto-js/sha256';\nimport hmacSHA512 from 'crypto-js/hmac-sha512';\nimport Base64 from 'crypto-js/enc-base64';\n\nconst message, nonce, path, privateKey; // ...\nconst hashDigest = sha256(nonce + message);\nconst hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));\n```\n\nModular include:\n\n```javascript\nvar AES = require(\"crypto-js/aes\");\nvar SHA256 = require(\"crypto-js/sha256\");\n...\nconsole.log(SHA256(\"Message\"));\n```\n\nIncluding all libraries, for access to extra methods:\n\n```javascript\nvar CryptoJS = require(\"crypto-js\");\nconsole.log(CryptoJS.HmacSHA1(\"Message\", \"Key\"));\n```\n\n## Client (browser)\n\nRequirements:\n\n- Node.js\n- Bower (package manager for frontend)\n\n```bash\nbower install crypto-js\n```\n\n### Usage\n\nModular include:\n\n```javascript\nrequire.config({\n packages: [\n {\n name: 'crypto-js',\n location: 'path-to/bower_components/crypto-js',\n main: 'index'\n }\n ]\n});\n\nrequire([\"crypto-js/aes\", \"crypto-js/sha256\"], function (AES, SHA256) {\n console.log(SHA256(\"Message\"));\n});\n```\n\nIncluding all libraries, for access to extra methods:\n\n```javascript\n// Above-mentioned will work or use this simple form\nrequire.config({\n paths: {\n 'crypto-js': 'path-to/bower_components/crypto-js/crypto-js'\n }\n});\n\nrequire([\"crypto-js\"], function (CryptoJS) {\n console.log(CryptoJS.HmacSHA1(\"Message\", \"Key\"));\n});\n```\n\n### Usage without RequireJS\n\n```html\n<script type=\"text/javascript\" src=\"path-to/bower_components/crypto-js/crypto-js.js\"></script>\n<script type=\"text/javascript\">\n var encrypted = CryptoJS.AES(...);\n var encrypted = CryptoJS.SHA256(...);\n</script>\n```\n\n## API\n\nSee: https://cryptojs.gitbook.io/docs/\n\n### AES Encryption\n\n#### Plain text encryption\n\n```javascript\nvar CryptoJS = require(\"crypto-js\");\n\n// Encrypt\nvar ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString();\n\n// Decrypt\nvar bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');\nvar originalText = bytes.toString(CryptoJS.enc.Utf8);\n\nconsole.log(originalText); // 'my message'\n```\n\n#### Object encryption\n\n```javascript\nvar CryptoJS = require(\"crypto-js\");\n\nvar data = [{id: 1}, {id: 2}]\n\n// Encrypt\nvar ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123').toString();\n\n// Decrypt\nvar bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');\nvar decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));\n\nconsole.log(decryptedData); // [{id: 1}, {id: 2}]\n```\n\n### List of modules\n\n\n- ```crypto-js/core```\n- ```crypto-js/x64-core```\n- ```crypto-js/lib-typedarrays```\n\n---\n\n- ```crypto-js/md5```\n- ```crypto-js/sha1```\n- ```crypto-js/sha256```\n- ```crypto-js/sha224```\n- ```crypto-js/sha512```\n- ```crypto-js/sha384```\n- ```crypto-js/sha3```\n- ```crypto-js/ripemd160```\n\n---\n\n- ```crypto-js/hmac-md5```\n- ```crypto-js/hmac-sha1```\n- ```crypto-js/hmac-sha256```\n- ```crypto-js/hmac-sha224```\n- ```crypto-js/hmac-sha512```\n- ```crypto-js/hmac-sha384```\n- ```crypto-js/hmac-sha3```\n- ```crypto-js/hmac-ripemd160```\n\n---\n\n- ```crypto-js/pbkdf2```\n\n---\n\n- ```crypto-js/aes```\n- ```crypto-js/tripledes```\n- ```crypto-js/rc4```\n- ```crypto-js/rabbit```\n- ```crypto-js/rabbit-legacy```\n- ```crypto-js/evpkdf```\n\n---\n\n- ```crypto-js/format-openssl```\n- ```crypto-js/format-hex```\n\n---\n\n- ```crypto-js/enc-latin1```\n- ```crypto-js/enc-utf8```\n- ```crypto-js/enc-hex```\n- ```crypto-js/enc-utf16```\n- ```crypto-js/enc-base64```\n\n---\n\n- ```crypto-js/mode-cfb```\n- ```crypto-js/mode-ctr```\n- ```crypto-js/mode-ctr-gladman```\n- ```crypto-js/mode-ofb```\n- ```crypto-js/mode-ecb```\n\n---\n\n- ```crypto-js/pad-pkcs7```\n- ```crypto-js/pad-ansix923```\n- ```crypto-js/pad-iso10126```\n- ```crypto-js/pad-iso97971```\n- ```crypto-js/pad-zeropadding```\n- ```crypto-js/pad-nopadding```\n\n\n## Release notes\n\n### 4.1.1\n\nFix module order in bundled release.\n\nInclude the browser field in the released package.json.\n\n### 4.1.0\n\nAdded url safe variant of base64 encoding. [357](https://github.com/brix/crypto-js/pull/357)\n\nAvoid webpack to add crypto-browser package. [364](https://github.com/brix/crypto-js/pull/364)\n\n### 4.0.0\n\nThis is an update including breaking changes for some environments.\n\nIn this version `Math.random()` has been replaced by the random methods of the native crypto module.\n\nFor this reason CryptoJS might not run in some JavaScript environments without native crypto module. Such as IE 10 or before or React Native.\n\n### 3.3.0\n\nRollback, `3.3.0` is the same as `3.1.9-1`.\n\nThe move of using native secure crypto module will be shifted to a new `4.x.x` version. As it is a breaking change the impact is too big for a minor release.\n\n### 3.2.1\n\nThe usage of the native crypto module has been fixed. The import and access of the native crypto module has been improved.\n\n### 3.2.0\n\nIn this version `Math.random()` has been replaced by the random methods of the native crypto module.\n\nFor this reason CryptoJS might does not run in some JavaScript environments without native crypto module. Such as IE 10 or before.\n\nIf it's absolute required to run CryptoJS in such an environment, stay with `3.1.x` version. Encrypting and decrypting stays compatible. But keep in mind `3.1.x` versions still use `Math.random()` which is cryptographically not secure, as it's not random enough. \n\nThis version came along with `CRITICAL` `BUG`. \n\nDO NOT USE THIS VERSION! Please, go for a newer version!\n\n### 3.1.x\n\nThe `3.1.x` are based on the original CryptoJS, wrapped in CommonJS modules.\n\n\n","author":{"name":"Evan Vosberg","url":"http://github.com/evanvosberg"},"repository":{"type":"git","url":"git+ssh://git@github.com/brix/crypto-js.git"},"homepage":"http://github.com/brix/crypto-js","bugs":{"url":"https://github.com/brix/crypto-js/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "crypto-js",
+ "description": "JavaScript library of crypto standards.",
+ "dist-tags": {
+ "latest": "4.1.1"
+ },
+ "versions": {
+ "4.1.1": {
+ "name": "crypto-js",
+ "version": "4.1.1",
+ "description": "JavaScript library of crypto standards.",
+ "license": "MIT",
+ "author": {
+ "name": "Evan Vosberg",
+ "url": "http://github.com/evanvosberg"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/brix/crypto-js.git"
+ },
+ "main": "index.js",
+ "dependencies": {},
+ "browser": {
+ "crypto": false
+ },
+ "gitHead": "7c26cc72a618053c294309c22c95a895af39b7b7",
+ "bugs": {
+ "url": "https://github.com/brix/crypto-js/issues"
+ },
+ "_id": "crypto-js@4.1.1",
+ "_nodeVersion": "12.18.3",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
+ "shasum": "9e485bcf03521041bd85844786b83fb7619736cf",
+ "tarball": "http://localhost:4260/crypto-js/crypto-js-4.1.1.tgz",
+ "fileCount": 55,
+ "unpackedSize": 443864
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Evan Vosberg",
+ "url": "http://github.com/evanvosberg"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/brix/crypto-js.git"
+ },
+ "homepage": "http://github.com/brix/crypto-js",
+ "bugs": {
+ "url": "https://github.com/brix/crypto-js/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/csstype/registry.json b/tests/registry/npm/csstype/registry.json
index a84a95c8d..cc3eb9f99 100644
--- a/tests/registry/npm/csstype/registry.json
+++ b/tests/registry/npm/csstype/registry.json
@@ -1 +1,92 @@
-{"name":"csstype","description":"Strict TypeScript and Flow types for style based on MDN data","dist-tags":{"latest":"2.6.20","version-2":"2.6.20"},"versions":{"2.6.20":{"name":"csstype","version":"2.6.20","main":"","types":"index.d.ts","description":"Strict TypeScript and Flow types for style based on MDN data","repository":{"type":"git","url":"git+https://github.com/frenic/csstype.git"},"author":{"name":"Fredrik Nicol","email":"fredrik.nicol@gmail.com"},"license":"MIT","devDependencies":{"@types/chokidar":"^2.1.3","@types/jest":"^24.0.21","@types/jsdom":"^12.2.4","@types/node":"^12.12.3","@types/prettier":"^1.18.3","chalk":"^2.4.2","chokidar":"^3.2.3","fast-glob":"^3.1.0","flow-bin":"^0.110.1","jest":"^24.9.0","jsdom":"^15.2.0","mdn-browser-compat-data":"git+https://github.com/mdn/browser-compat-data.git#92bf4cb8c5594edb314995e53a9cde79d5fb1b1e","mdn-data":"git+https://github.com/mdn/data.git#cad93443ab28ee08b1ba490b13cf45eafd1f008d","prettier":"^1.18.2","sync-request":"^6.1.0","ts-node":"^8.4.1","tslint":"^5.20.0","tslint-config-prettier":"^1.18.0","turndown":"^5.0.3","typescript":"~3.6.4"},"scripts":{"update":"ts-node --files update.ts","build":"ts-node --files build.ts --start","watch":"ts-node --files build.ts --watch","lint":"tslint --exclude node_modules/**/* --exclude **/*.d.ts --fix **/*.ts","pretty":"prettier --write build.ts **/*.{ts,js,json,md}","lazy":"tsc && npm run lint && npm run pretty","test":"jest --no-cache","typecheck":"tsc typecheck.ts --noEmit --pretty & flow check typecheck.js","prepublish":"tsc && npm run test && npm run build && npm run typecheck","rebase-build":"git rebase --exec \"yarn --ignore-scripts && yarn build && git commit -a --amend --no-verify --no-edit --allow-empty\""},"readme":"# CSSType\r\n\r\n[![npm](https://img.shields.io/npm/v/csstype.svg)](https://www.npmjs.com/package/csstype)\r\n\r\nTypeScript and Flow definitions for CSS, generated by [data from MDN](https://github.com/mdn/data). It provides autocompletion and type checking for CSS properties and values.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.Properties = {\r\n colour: 'white', // Type error on property\r\n textAlign: 'middle', // Type error on value\r\n};\r\n```\r\n\r\n## Getting started\r\n\r\n```sh\r\n$ npm install csstype\r\n$ # or\r\n$ yarn add csstype\r\n```\r\n\r\n## Table of content\r\n\r\n- [Style types](#style-types)\r\n- [At-rule types](#at-rule-types)\r\n- [Pseudo types](#pseudo-types)\r\n- [Usage](#usage)\r\n- [What should I do when I get type errors?](#what-should-i-do-when-i-get-type-errors)\r\n- [Version 2.0](#version-20)\r\n- [Contributing](#contributing)\r\n - [Commands](#commands)\r\n\r\n## Style types\r\n\r\nProperties are categorized in different uses and in several technical variations to provide typings that suits as many as possible.\r\n\r\nAll interfaces has one optional generic argument to define length. It defaults to `string | 0` because `0` is the only [length where the unit identifier is optional](https://drafts.csswg.org/css-values-3/#lengths). You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.\r\n\r\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\r\n| -------------- | -------------------- | -------------------------- | ---------------------------- | ---------------------------------- |\r\n| **All** | `Properties` | `PropertiesHyphen` | `PropertiesFallback` | `PropertiesHyphenFallback` |\r\n| **`Standard`** | `StandardProperties` | `StandardPropertiesHyphen` | `StandardPropertiesFallback` | `StandardPropertiesHyphenFallback` |\r\n| **`Vendor`** | `VendorProperties` | `VendorPropertiesHyphen` | `VendorPropertiesFallback` | `VendorPropertiesHyphenFallback` |\r\n| **`Obsolete`** | `ObsoleteProperties` | `ObsoletePropertiesHyphen` | `ObsoletePropertiesFallback` | `ObsoletePropertiesHyphenFallback` |\r\n| **`Svg`** | `SvgProperties` | `SvgPropertiesHyphen` | `SvgPropertiesFallback` | `SvgPropertiesHyphenFallback` |\r\n\r\nCategories:\r\n\r\n- **All** - Includes `Standard`, `Vendor`, `Obsolete` and `Svg`\r\n- **`Standard`** - Current properties and extends subcategories `StandardLonghand` and `StandardShorthand` _(e.g. `StandardShorthandProperties`)_\r\n- **`Vendor`** - Vendor prefixed properties and extends subcategories `VendorLonghand` and `VendorShorthand` _(e.g. `VendorShorthandProperties`)_\r\n- **`Obsolete`** - Removed or deprecated properties\r\n- **`Svg`** - SVG-specific properties\r\n\r\nVariations:\r\n\r\n- **Default** - JavaScript (camel) cased property names\r\n- **`Hyphen`** - CSS (kebab) cased property names\r\n- **`Fallback`** - Also accepts array of values e.g. `string | string[]`\r\n\r\n## At-rule types\r\n\r\nAt-rule interfaces with descriptors.\r\n\r\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\r\n| -------------------- | -------------- | -------------------- | ---------------------- | ---------------------------- |\r\n| **`@counter-style`** | `CounterStyle` | `CounterStyleHyphen` | `CounterStyleFallback` | `CounterStyleHyphenFallback` |\r\n| **`@font-face`** | `FontFace` | `FontFaceHyphen` | `FontFaceFallback` | `FontFaceHyphenFallback` |\r\n| **`@page`** | `Page` | `PageHyphen` | `PageFallback` | `PageHyphenFallback` |\r\n| **`@viewport`** | `Viewport` | `ViewportHyphen` | `ViewportFallback` | `ViewportHyphenFallback` |\r\n\r\n## Pseudo types\r\n\r\nString literals of pseudo classes and pseudo elements\r\n\r\n- `Pseudos`\r\n\r\n Extends:\r\n\r\n - `AdvancedPseudos`\r\n\r\n Function-like pseudos e.g. `:not(:first-child)`. The string literal contains the value excluding the parenthesis: `:not`. These are separated because they require an argument that results in infinite number of variations.\r\n\r\n - `SimplePseudos`\r\n\r\n Plain pseudos e.g. `:hover` that can only be **one** variation.\r\n\r\n## Usage\r\n\r\nLength defaults to `string | 0`. But it's possible to override it using generics.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.Properties<string | number> = {\r\n padding: 10,\r\n margin: '1rem',\r\n};\r\n```\r\n\r\nIn some cases, like for CSS-in-JS libraries, an array of values is a way to provide fallback values in CSS. Using `CSS.PropertiesFallback` instead of `CSS.Properties` will add the possibility to use any property value as an array of values.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.PropertiesFallback = {\r\n display: ['-webkit-flex', 'flex'],\r\n color: 'white',\r\n};\r\n```\r\n\r\nThere's even string literals for pseudo selectors and elements.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst pseudos: { [P in CSS.SimplePseudos]?: CSS.Properties } = {\r\n ':hover': {\r\n display: 'flex',\r\n },\r\n};\r\n```\r\n\r\nHyphen cased (kebab cased) properties are provided in `CSS.PropertiesHyphen` and `CSS.PropertiesHyphenFallback`. It's not **not** added by default in `CSS.Properties`. To allow both of them, you can simply extend with `CSS.PropertiesHyphen` or/and `CSS.PropertiesHyphenFallback`.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\ninterface Style extends CSS.Properties, CSS.PropertiesHyphen {}\r\n\r\nconst style: Style = {\r\n 'flex-grow': 1,\r\n 'flex-shrink': 0,\r\n 'font-weight': 'normal',\r\n backgroundColor: 'white',\r\n};\r\n```\r\n\r\n## What should I do when I get type errors?\r\n\r\nThe goal is to have as perfect types as possible and we're trying to do our best. But with CSS Custom Properties, the CSS specification changing frequently and vendors implementing their own specifications with new releases sometimes causes type errors even if it should work. Here's some steps you could take to get it fixed:\r\n\r\n_If you're using CSS Custom Properties you can step directly to step 3._\r\n\r\n1. **First of all, make sure you're doing it right.** A type error could also indicate that you're not :wink:\r\n\r\n - Some CSS specs that some vendors has implemented could have been officially rejected or haven't yet received any official acceptance and are therefor not included\r\n - If you're using TypeScript, [type widening](https://blog.mariusschulz.com/2017/02/04/typescript-2-1-literal-type-widening) could be the reason you get `Type 'string' is not assignable to...` errors\r\n\r\n2. **Have a look in [issues](https://github.com/frenic/csstype/issues) to see if an issue already has been filed. If not, create a new one.** To help us out, please refer to any information you have found.\r\n3. Fix the issue locally with **TypeScript** (Flow further down):\r\n\r\n - The recommended way is to use **module augmentation**. Here's a few examples:\r\n\r\n ```ts\r\n // My css.d.ts file\r\n import * as CSS from 'csstype';\r\n\r\n declare module 'csstype' {\r\n interface Properties {\r\n // Add a missing property\r\n WebkitRocketLauncher?: string;\r\n\r\n // Add a CSS Custom Property\r\n '--theme-color'?: 'black' | 'white';\r\n\r\n // ...or allow any other property\r\n [index: string]: any;\r\n }\r\n }\r\n ```\r\n\r\n - The alternative way is to use **type assertion**. Here's a few examples:\r\n\r\n ```ts\r\n const style: CSS.Properties = {\r\n // Add a missing property\r\n ['WebkitRocketLauncher' as any]: 'launching',\r\n\r\n // Add a CSS Custom Property\r\n ['--theme-color' as any]: 'black',\r\n };\r\n ```\r\n\r\n Fix the issue locally with **Flow**:\r\n\r\n - Use **type assertion**. Here's a few examples:\r\n\r\n ```js\r\n const style: $Exact<CSS.Properties<*>> = {\r\n // Add a missing property\r\n [('WebkitRocketLauncher': any)]: 'launching',\r\n\r\n // Add a CSS Custom Property\r\n [('--theme-color': any)]: 'black',\r\n };\r\n ```\r\n\r\n## Version 2.0\r\n\r\nThe casing of CSS vendor properties are changed matching the casing of prefixes in Javascript. So all of them are capitalized except for `ms`.\r\n\r\n- `msOverflowStyle` is still `msOverflowStyle`\r\n- `mozAppearance` is now `MozAppearance`\r\n- `webkitOverflowScrolling` is now `WebkitOverflowScrolling`\r\n\r\nMore info: https://www.andismith.com/blogs/2012/02/modernizr-prefixed/\r\n\r\n## Contributing\r\n\r\n**Never modify `index.d.ts` and `index.js.flow` directly. They are generated automatically and committed so that we can easily follow any change it results in.** Therefor it's important that you run `$ git config merge.ours.driver true` after you've forked and cloned. That setting prevents merge conflicts when doing rebase.\r\n\r\n### Commands\r\n\r\n- `yarn build` Generates typings and type checks them\r\n- `yarn watch` Runs build on each save\r\n- `yarn test` Runs the tests\r\n- `yarn lazy` Type checks, lints and formats everything\r\n","readmeFilename":"README.md","gitHead":"451d62da7ef1b5e73907bb12fbcc1d2a0106993f","bugs":{"url":"https://github.com/frenic/csstype/issues"},"_id":"csstype@2.6.20","_nodeVersion":"16.6.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==","shasum":"9229c65ea0b260cf4d3d997cb06288e36a8d6dda","tarball":"http://localhost:4260/csstype/csstype-2.6.20.tgz","fileCount":5,"unpackedSize":1953772,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIMu8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmot6A/9F75bkIR+Vla5zqeTXrV4KxBDepWCI4qGFMqarW8mh7y11kjy\r\nRS8isnssmSXzjthbAqjBZ3r4WqbTqL1WIKKiaDP0wF9rBeyb77oDq5RF+p7a\r\nyNwdJCdBS9H5Nf6PoCfdG3hIyw6iWjVa4ksDXoqm5kbWDwKBylSDyUl7JgEK\r\nViQelNTfvxRzxnPFjc/ZbLMstCYyubxZSY8xAZvKEsp2xgZIQsbJEt6agjP/\r\n0zXmsD6WIltlQJfMhfqUpEvRVRDmpx0XxrOcUAwttZ13/nT05uvdaYG1fJsV\r\nHhgWgIcuHuC2c9qi6k44HJYLskcfN6QCuYnKUUIk3vW/Hzy+/UqHCs3BOnSA\r\n5fCjgmTjDdmwnuEhtzi48xcU8ZjmhYek3Va222fOmalGE1W9MbPRaM0eJVrA\r\nftNM1EjkOxjoXxt2skzhYkBbSexVPP6Jk8fVfCRA6Pib8GTDtdTghzUjZ6PB\r\no6hlWydM7d92ncoIzjGB0/hY6pRiCL/UjPHCXd96HN/IUnNGJqvaNAhUxN56\r\nq8yBaKBEyaFAtWr5xYDgqz17GGzFrupd4z2g2VDreL2SdDIa/kQ29ET5OhE1\r\n8XEn1ukDmvp1cF8mdUCAhaicq423B2xLFo2vjNJyou72MBj1BkduQIfmJfuZ\r\nzV2wJBAf2la+BaP15g8OaUUGr/G+VS1wdMU=\r\n=+EMb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF9rD6kWkhLcx9bm3xNsd9ClHYmYOawd/91j6ZJzH5OjAiEAquhV6qcStUcs2dvQlINIbnegIf2MXYcnP50dEEXs+JE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# CSSType\n\n[![npm](https://img.shields.io/npm/v/csstype.svg)](https://www.npmjs.com/package/csstype)\n\nTypeScript and Flow definitions for CSS, generated by [data from MDN](https://github.com/mdn/data). It provides autocompletion and type checking for CSS properties and values.\n\n**TypeScript**\n\n```ts\nimport type * as CSS from 'csstype';\n\nconst style: CSS.Properties = {\n colour: 'white', // Type error on property\n textAlign: 'middle', // Type error on value\n};\n```\n\n**Flow**\n\n```js\n// @flow strict\nimport * as CSS from 'csstype';\n\nconst style: CSS.Properties<> = {\n colour: 'white', // Type error on property\n textAlign: 'middle', // Type error on value\n};\n```\n\n_Further examples below will be in TypeScript!_\n\n## Getting started\n\n```sh\n$ npm install csstype\n```\n\n## Table of content\n\n- [Style types](#style-types)\n- [At-rule types](#at-rule-types)\n- [Pseudo types](#pseudo-types)\n- [Generics](#generics)\n- [Usage](#usage)\n- [What should I do when I get type errors?](#what-should-i-do-when-i-get-type-errors)\n- [Version 3.0](#version-30)\n- [Contributing](#contributing)\n\n## Style types\n\nProperties are categorized in different uses and in several technical variations to provide typings that suits as many as possible.\n\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\n| -------------- | -------------------- | -------------------------- | ---------------------------- | ---------------------------------- |\n| **All** | `Properties` | `PropertiesHyphen` | `PropertiesFallback` | `PropertiesHyphenFallback` |\n| **`Standard`** | `StandardProperties` | `StandardPropertiesHyphen` | `StandardPropertiesFallback` | `StandardPropertiesHyphenFallback` |\n| **`Vendor`** | `VendorProperties` | `VendorPropertiesHyphen` | `VendorPropertiesFallback` | `VendorPropertiesHyphenFallback` |\n| **`Obsolete`** | `ObsoleteProperties` | `ObsoletePropertiesHyphen` | `ObsoletePropertiesFallback` | `ObsoletePropertiesHyphenFallback` |\n| **`Svg`** | `SvgProperties` | `SvgPropertiesHyphen` | `SvgPropertiesFallback` | `SvgPropertiesHyphenFallback` |\n\nCategories:\n\n- **All** - Includes `Standard`, `Vendor`, `Obsolete` and `Svg`\n- **`Standard`** - Current properties and extends subcategories `StandardLonghand` and `StandardShorthand` _(e.g. `StandardShorthandProperties`)_\n- **`Vendor`** - Vendor prefixed properties and extends subcategories `VendorLonghand` and `VendorShorthand` _(e.g. `VendorShorthandProperties`)_\n- **`Obsolete`** - Removed or deprecated properties\n- **`Svg`** - SVG-specific properties\n\nVariations:\n\n- **Default** - JavaScript (camel) cased property names\n- **`Hyphen`** - CSS (kebab) cased property names\n- **`Fallback`** - Also accepts array of values e.g. `string | string[]`\n\n## At-rule types\n\nAt-rule interfaces with descriptors.\n\n**TypeScript**: These will be found in the `AtRule` namespace, e.g. `AtRule.Viewport`. \n**Flow**: These will be prefixed with `AtRule$`, e.g. `AtRule$Viewport`.\n\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\n| -------------------- | -------------- | -------------------- | ---------------------- | ---------------------------- |\n| **`@counter-style`** | `CounterStyle` | `CounterStyleHyphen` | `CounterStyleFallback` | `CounterStyleHyphenFallback` |\n| **`@font-face`** | `FontFace` | `FontFaceHyphen` | `FontFaceFallback` | `FontFaceHyphenFallback` |\n| **`@viewport`** | `Viewport` | `ViewportHyphen` | `ViewportFallback` | `ViewportHyphenFallback` |\n\n## Pseudo types\n\nString literals of pseudo classes and pseudo elements\n\n- `Pseudos`\n\n Extends:\n\n - `AdvancedPseudos`\n\n Function-like pseudos e.g. `:not(:first-child)`. The string literal contains the value excluding the parenthesis: `:not`. These are separated because they require an argument that results in infinite number of variations.\n\n - `SimplePseudos`\n\n Plain pseudos e.g. `:hover` that can only be **one** variation.\n\n## Generics\n\nAll interfaces has two optional generic argument to define length and time: `CSS.Properties<TLength = string | 0, TTime = string>`\n\n- **Length** is the first generic parameter and defaults to `string | 0` because `0` is the only [length where the unit identifier is optional](https://drafts.csswg.org/css-values-3/#lengths). You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.\n ```tsx\n const style: CSS.Properties<string | number> = {\n width: 100,\n };\n ```\n- **Time** is the second generic argument and defaults to `string`. You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.\n ```tsx\n const style: CSS.Properties<string | number, number> = {\n transitionDuration: 1000,\n };\n ```\n\n## Usage\n\n```ts\nimport type * as CSS from 'csstype';\n\nconst style: CSS.Properties = {\n width: '10px',\n margin: '1em',\n};\n```\n\nIn some cases, like for CSS-in-JS libraries, an array of values is a way to provide fallback values in CSS. Using `CSS.PropertiesFallback` instead of `CSS.Properties` will add the possibility to use any property value as an array of values.\n\n```ts\nimport type * as CSS from 'csstype';\n\nconst style: CSS.PropertiesFallback = {\n display: ['-webkit-flex', 'flex'],\n color: 'white',\n};\n```\n\nThere's even string literals for pseudo selectors and elements.\n\n```ts\nimport type * as CSS from 'csstype';\n\nconst pseudos: { [P in CSS.SimplePseudos]?: CSS.Properties } = {\n ':hover': {\n display: 'flex',\n },\n};\n```\n\nHyphen cased (kebab cased) properties are provided in `CSS.PropertiesHyphen` and `CSS.PropertiesHyphenFallback`. It's not **not** added by default in `CSS.Properties`. To allow both of them, you can simply extend with `CSS.PropertiesHyphen` or/and `CSS.PropertiesHyphenFallback`.\n\n```ts\nimport type * as CSS from 'csstype';\n\ninterface Style extends CSS.Properties, CSS.PropertiesHyphen {}\n\nconst style: Style = {\n 'flex-grow': 1,\n 'flex-shrink': 0,\n 'font-weight': 'normal',\n backgroundColor: 'white',\n};\n```\n\nAdding type checked CSS properties to a `HTMLElement`.\n\n```ts\nimport type * as CSS from 'csstype';\n\nconst style: CSS.Properties = {\n color: 'red',\n margin: '1em',\n};\n\nlet button = document.createElement('button');\n\nObject.assign(button.style, style);\n```\n\n## What should I do when I get type errors?\n\nThe goal is to have as perfect types as possible and we're trying to do our best. But with CSS Custom Properties, the CSS specification changing frequently and vendors implementing their own specifications with new releases sometimes causes type errors even if it should work. Here's some steps you could take to get it fixed:\n\n_If you're using CSS Custom Properties you can step directly to step 3._\n\n1. **First of all, make sure you're doing it right.** A type error could also indicate that you're not :wink:\n\n - Some CSS specs that some vendors has implemented could have been officially rejected or haven't yet received any official acceptance and are therefor not included\n - If you're using TypeScript, [type widening](https://blog.mariusschulz.com/2017/02/04/TypeScript-2-1-literal-type-widening) could be the reason you get `Type 'string' is not assignable to...` errors\n\n2. **Have a look in [issues](https://github.com/frenic/csstype/issues) to see if an issue already has been filed. If not, create a new one.** To help us out, please refer to any information you have found.\n3. Fix the issue locally with **TypeScript** (Flow further down):\n\n - The recommended way is to use **module augmentation**. Here's a few examples:\n\n ```ts\n // My css.d.ts file\n import type * as CSS from 'csstype';\n\n declare module 'csstype' {\n interface Properties {\n // Add a missing property\n WebkitRocketLauncher?: string;\n\n // Add a CSS Custom Property\n '--theme-color'?: 'black' | 'white';\n\n // ...or allow any other property\n [index: string]: any;\n }\n }\n ```\n\n - The alternative way is to use **type assertion**. Here's a few examples:\n\n ```ts\n const style: CSS.Properties = {\n // Add a missing property\n ['WebkitRocketLauncher' as any]: 'launching',\n\n // Add a CSS Custom Property\n ['--theme-color' as any]: 'black',\n };\n ```\n\n Fix the issue locally with **Flow**:\n\n - Use **type assertion**. Here's a few examples:\n\n ```js\n const style: $Exact<CSS.Properties<*>> = {\n // Add a missing property\n [('WebkitRocketLauncher': any)]: 'launching',\n\n // Add a CSS Custom Property\n [('--theme-color': any)]: 'black',\n };\n ```\n\n## Version 3.0\n\n- **All property types are exposed with namespace** \n TypeScript: `Property.AlignContent` (was `AlignContentProperty` before) \n Flow: `Property$AlignContent`\n- **All at-rules are exposed with namespace** \n TypeScript: `AtRule.FontFace` (was `FontFace` before) \n Flow: `AtRule$FontFace`\n- **Data types are NOT exposed** \n E.g. `Color` and `Box`. Because the generation of data types may suddenly be removed or renamed.\n- **TypeScript hack for autocompletion** \n Uses `(string & {})` for literal string unions and `(number & {})` for literal number unions ([related issue](https://github.com/microsoft/TypeScript/issues/29729)). Utilize `PropertyValue<T>` to unpack types from e.g. `(string & {})` to `string`.\n- **New generic for time** \n Read more on the [\"Generics\"](#generics) section.\n- **Flow types improvements** \n Flow Strict enabled and exact types are used.\n\n## Contributing\n\n**Never modify `index.d.ts` and `index.js.flow` directly. They are generated automatically and committed so that we can easily follow any change it results in.** Therefor it's important that you run `$ git config merge.ours.driver true` after you've forked and cloned. That setting prevents merge conflicts when doing rebase.\n\n### Commands\n\n- `npm run build` Generates typings and type checks them\n- `npm run watch` Runs build on each save\n- `npm run test` Runs the tests\n- `npm run lazy` Type checks, lints and formats everything\n","author":{"name":"Fredrik Nicol","email":"fredrik.nicol@gmail.com"},"license":"MIT","readmeFilename":"README.md","repository":{"type":"git","url":"git+https://github.com/frenic/csstype.git"},"homepage":"https://github.com/frenic/csstype#readme","bugs":{"url":"https://github.com/frenic/csstype/issues"}}
+{
+ "name": "csstype",
+ "description": "Strict TypeScript and Flow types for style based on MDN data",
+ "dist-tags": {
+ "latest": "2.6.20",
+ "version-2": "2.6.20"
+ },
+ "versions": {
+ "2.6.20": {
+ "name": "csstype",
+ "version": "2.6.20",
+ "main": "",
+ "types": "index.d.ts",
+ "description": "Strict TypeScript and Flow types for style based on MDN data",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/frenic/csstype.git"
+ },
+ "author": {
+ "name": "Fredrik Nicol",
+ "email": "fredrik.nicol@gmail.com"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@types/chokidar": "^2.1.3",
+ "@types/jest": "^24.0.21",
+ "@types/jsdom": "^12.2.4",
+ "@types/node": "^12.12.3",
+ "@types/prettier": "^1.18.3",
+ "chalk": "^2.4.2",
+ "chokidar": "^3.2.3",
+ "fast-glob": "^3.1.0",
+ "flow-bin": "^0.110.1",
+ "jest": "^24.9.0",
+ "jsdom": "^15.2.0",
+ "mdn-browser-compat-data": "git+https://github.com/mdn/browser-compat-data.git#92bf4cb8c5594edb314995e53a9cde79d5fb1b1e",
+ "mdn-data": "git+https://github.com/mdn/data.git#cad93443ab28ee08b1ba490b13cf45eafd1f008d",
+ "prettier": "^1.18.2",
+ "sync-request": "^6.1.0",
+ "ts-node": "^8.4.1",
+ "tslint": "^5.20.0",
+ "tslint-config-prettier": "^1.18.0",
+ "turndown": "^5.0.3",
+ "typescript": "~3.6.4"
+ },
+ "scripts": {
+ "update": "ts-node --files update.ts",
+ "build": "ts-node --files build.ts --start",
+ "watch": "ts-node --files build.ts --watch",
+ "lint": "tslint --exclude node_modules/**/* --exclude **/*.d.ts --fix **/*.ts",
+ "pretty": "prettier --write build.ts **/*.{ts,js,json,md}",
+ "lazy": "tsc && npm run lint && npm run pretty",
+ "test": "jest --no-cache",
+ "typecheck": "tsc typecheck.ts --noEmit --pretty & flow check typecheck.js",
+ "prepublish": "tsc && npm run test && npm run build && npm run typecheck",
+ "rebase-build": "git rebase --exec \"yarn --ignore-scripts && yarn build && git commit -a --amend --no-verify --no-edit --allow-empty\""
+ },
+ "readme": "# CSSType\r\n\r\n[![npm](https://img.shields.io/npm/v/csstype.svg)](https://www.npmjs.com/package/csstype)\r\n\r\nTypeScript and Flow definitions for CSS, generated by [data from MDN](https://github.com/mdn/data). It provides autocompletion and type checking for CSS properties and values.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.Properties = {\r\n colour: 'white', // Type error on property\r\n textAlign: 'middle', // Type error on value\r\n};\r\n```\r\n\r\n## Getting started\r\n\r\n```sh\r\n$ npm install csstype\r\n$ # or\r\n$ yarn add csstype\r\n```\r\n\r\n## Table of content\r\n\r\n- [Style types](#style-types)\r\n- [At-rule types](#at-rule-types)\r\n- [Pseudo types](#pseudo-types)\r\n- [Usage](#usage)\r\n- [What should I do when I get type errors?](#what-should-i-do-when-i-get-type-errors)\r\n- [Version 2.0](#version-20)\r\n- [Contributing](#contributing)\r\n - [Commands](#commands)\r\n\r\n## Style types\r\n\r\nProperties are categorized in different uses and in several technical variations to provide typings that suits as many as possible.\r\n\r\nAll interfaces has one optional generic argument to define length. It defaults to `string | 0` because `0` is the only [length where the unit identifier is optional](https://drafts.csswg.org/css-values-3/#lengths). You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.\r\n\r\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\r\n| -------------- | -------------------- | -------------------------- | ---------------------------- | ---------------------------------- |\r\n| **All** | `Properties` | `PropertiesHyphen` | `PropertiesFallback` | `PropertiesHyphenFallback` |\r\n| **`Standard`** | `StandardProperties` | `StandardPropertiesHyphen` | `StandardPropertiesFallback` | `StandardPropertiesHyphenFallback` |\r\n| **`Vendor`** | `VendorProperties` | `VendorPropertiesHyphen` | `VendorPropertiesFallback` | `VendorPropertiesHyphenFallback` |\r\n| **`Obsolete`** | `ObsoleteProperties` | `ObsoletePropertiesHyphen` | `ObsoletePropertiesFallback` | `ObsoletePropertiesHyphenFallback` |\r\n| **`Svg`** | `SvgProperties` | `SvgPropertiesHyphen` | `SvgPropertiesFallback` | `SvgPropertiesHyphenFallback` |\r\n\r\nCategories:\r\n\r\n- **All** - Includes `Standard`, `Vendor`, `Obsolete` and `Svg`\r\n- **`Standard`** - Current properties and extends subcategories `StandardLonghand` and `StandardShorthand` _(e.g. `StandardShorthandProperties`)_\r\n- **`Vendor`** - Vendor prefixed properties and extends subcategories `VendorLonghand` and `VendorShorthand` _(e.g. `VendorShorthandProperties`)_\r\n- **`Obsolete`** - Removed or deprecated properties\r\n- **`Svg`** - SVG-specific properties\r\n\r\nVariations:\r\n\r\n- **Default** - JavaScript (camel) cased property names\r\n- **`Hyphen`** - CSS (kebab) cased property names\r\n- **`Fallback`** - Also accepts array of values e.g. `string | string[]`\r\n\r\n## At-rule types\r\n\r\nAt-rule interfaces with descriptors.\r\n\r\n| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |\r\n| -------------------- | -------------- | -------------------- | ---------------------- | ---------------------------- |\r\n| **`@counter-style`** | `CounterStyle` | `CounterStyleHyphen` | `CounterStyleFallback` | `CounterStyleHyphenFallback` |\r\n| **`@font-face`** | `FontFace` | `FontFaceHyphen` | `FontFaceFallback` | `FontFaceHyphenFallback` |\r\n| **`@page`** | `Page` | `PageHyphen` | `PageFallback` | `PageHyphenFallback` |\r\n| **`@viewport`** | `Viewport` | `ViewportHyphen` | `ViewportFallback` | `ViewportHyphenFallback` |\r\n\r\n## Pseudo types\r\n\r\nString literals of pseudo classes and pseudo elements\r\n\r\n- `Pseudos`\r\n\r\n Extends:\r\n\r\n - `AdvancedPseudos`\r\n\r\n Function-like pseudos e.g. `:not(:first-child)`. The string literal contains the value excluding the parenthesis: `:not`. These are separated because they require an argument that results in infinite number of variations.\r\n\r\n - `SimplePseudos`\r\n\r\n Plain pseudos e.g. `:hover` that can only be **one** variation.\r\n\r\n## Usage\r\n\r\nLength defaults to `string | 0`. But it's possible to override it using generics.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.Properties<string | number> = {\r\n padding: 10,\r\n margin: '1rem',\r\n};\r\n```\r\n\r\nIn some cases, like for CSS-in-JS libraries, an array of values is a way to provide fallback values in CSS. Using `CSS.PropertiesFallback` instead of `CSS.Properties` will add the possibility to use any property value as an array of values.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst style: CSS.PropertiesFallback = {\r\n display: ['-webkit-flex', 'flex'],\r\n color: 'white',\r\n};\r\n```\r\n\r\nThere's even string literals for pseudo selectors and elements.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\nconst pseudos: { [P in CSS.SimplePseudos]?: CSS.Properties } = {\r\n ':hover': {\r\n display: 'flex',\r\n },\r\n};\r\n```\r\n\r\nHyphen cased (kebab cased) properties are provided in `CSS.PropertiesHyphen` and `CSS.PropertiesHyphenFallback`. It's not **not** added by default in `CSS.Properties`. To allow both of them, you can simply extend with `CSS.PropertiesHyphen` or/and `CSS.PropertiesHyphenFallback`.\r\n\r\n```ts\r\nimport * as CSS from 'csstype';\r\n\r\ninterface Style extends CSS.Properties, CSS.PropertiesHyphen {}\r\n\r\nconst style: Style = {\r\n 'flex-grow': 1,\r\n 'flex-shrink': 0,\r\n 'font-weight': 'normal',\r\n backgroundColor: 'white',\r\n};\r\n```\r\n\r\n## What should I do when I get type errors?\r\n\r\nThe goal is to have as perfect types as possible and we're trying to do our best. But with CSS Custom Properties, the CSS specification changing frequently and vendors implementing their own specifications with new releases sometimes causes type errors even if it should work. Here's some steps you could take to get it fixed:\r\n\r\n_If you're using CSS Custom Properties you can step directly to step 3._\r\n\r\n1. **First of all, make sure you're doing it right.** A type error could also indicate that you're not :wink:\r\n\r\n - Some CSS specs that some vendors has implemented could have been officially rejected or haven't yet received any official acceptance and are therefor not included\r\n - If you're using TypeScript, [type widening](https://blog.mariusschulz.com/2017/02/04/typescript-2-1-literal-type-widening) could be the reason you get `Type 'string' is not assignable to...` errors\r\n\r\n2. **Have a look in [issues](https://github.com/frenic/csstype/issues) to see if an issue already has been filed. If not, create a new one.** To help us out, please refer to any information you have found.\r\n3. Fix the issue locally with **TypeScript** (Flow further down):\r\n\r\n - The recommended way is to use **module augmentation**. Here's a few examples:\r\n\r\n ```ts\r\n // My css.d.ts file\r\n import * as CSS from 'csstype';\r\n\r\n declare module 'csstype' {\r\n interface Properties {\r\n // Add a missing property\r\n WebkitRocketLauncher?: string;\r\n\r\n // Add a CSS Custom Property\r\n '--theme-color'?: 'black' | 'white';\r\n\r\n // ...or allow any other property\r\n [index: string]: any;\r\n }\r\n }\r\n ```\r\n\r\n - The alternative way is to use **type assertion**. Here's a few examples:\r\n\r\n ```ts\r\n const style: CSS.Properties = {\r\n // Add a missing property\r\n ['WebkitRocketLauncher' as any]: 'launching',\r\n\r\n // Add a CSS Custom Property\r\n ['--theme-color' as any]: 'black',\r\n };\r\n ```\r\n\r\n Fix the issue locally with **Flow**:\r\n\r\n - Use **type assertion**. Here's a few examples:\r\n\r\n ```js\r\n const style: $Exact<CSS.Properties<*>> = {\r\n // Add a missing property\r\n [('WebkitRocketLauncher': any)]: 'launching',\r\n\r\n // Add a CSS Custom Property\r\n [('--theme-color': any)]: 'black',\r\n };\r\n ```\r\n\r\n## Version 2.0\r\n\r\nThe casing of CSS vendor properties are changed matching the casing of prefixes in Javascript. So all of them are capitalized except for `ms`.\r\n\r\n- `msOverflowStyle` is still `msOverflowStyle`\r\n- `mozAppearance` is now `MozAppearance`\r\n- `webkitOverflowScrolling` is now `WebkitOverflowScrolling`\r\n\r\nMore info: https://www.andismith.com/blogs/2012/02/modernizr-prefixed/\r\n\r\n## Contributing\r\n\r\n**Never modify `index.d.ts` and `index.js.flow` directly. They are generated automatically and committed so that we can easily follow any change it results in.** Therefor it's important that you run `$ git config merge.ours.driver true` after you've forked and cloned. That setting prevents merge conflicts when doing rebase.\r\n\r\n### Commands\r\n\r\n- `yarn build` Generates typings and type checks them\r\n- `yarn watch` Runs build on each save\r\n- `yarn test` Runs the tests\r\n- `yarn lazy` Type checks, lints and formats everything\r\n",
+ "readmeFilename": "README.md",
+ "gitHead": "451d62da7ef1b5e73907bb12fbcc1d2a0106993f",
+ "bugs": {
+ "url": "https://github.com/frenic/csstype/issues"
+ },
+ "_id": "csstype@2.6.20",
+ "_nodeVersion": "16.6.2",
+ "_npmVersion": "8.5.0",
+ "dist": {
+ "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+ "shasum": "9229c65ea0b260cf4d3d997cb06288e36a8d6dda",
+ "tarball": "http://localhost:4260/csstype/csstype-2.6.20.tgz",
+ "fileCount": 5,
+ "unpackedSize": 1953772
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Fredrik Nicol",
+ "email": "fredrik.nicol@gmail.com"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/frenic/csstype.git"
+ },
+ "homepage": "https://github.com/frenic/csstype#readme",
+ "bugs": {
+ "url": "https://github.com/frenic/csstype/issues"
+ }
+}
diff --git a/tests/registry/npm/debug/registry.json b/tests/registry/npm/debug/registry.json
index b2fd3d044..c6b9ab7ae 100644
--- a/tests/registry/npm/debug/registry.json
+++ b/tests/registry/npm/debug/registry.json
@@ -1 +1,87 @@
-{"name":"debug","description":"Lightweight debugging utility for Node.js and the browser","dist-tags":{"latest":"4.3.5"},"versions":{"4.3.5":{"name":"debug","version":"4.3.5","author":{"url":"https://github.com/qix-","name":"Josh Junon"},"license":"MIT","_id":"debug@4.3.5","bugs":{"url":"https://github.com/debug-js/debug/issues"},"dist":{"shasum":"e83444eceb9fedd4a1da56d671ae2446a01a6e1e","tarball":"http://localhost:4260/debug/debug-4.3.5.tgz","fileCount":7,"integrity":"sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==","signatures":[{"sig":"MEUCIQD2eFpf3p60i2+rFrwBiP8ctewWXYfqZxZvMEU/XyX/xAIgJXRFOrWWj+tLfHrd400HHT/bz+yV4Edh8cAmQFDP3Jw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42430},"main":"./src/index.js","browser":"./src/browser.js","engines":{"node":">=6.0"},"gitHead":"5464bdddbc6f91b2aef2ad20650d3a6cfd9fcc3a","scripts":{"lint":"xo","test":"npm run test:node && npm run test:browser && npm run lint","test:node":"istanbul cover _mocha -- test.js test.node.js","test:browser":"karma start --single-run","test:coverage":"cat ./coverage/lcov.info | coveralls"},"repository":{"url":"git://github.com/debug-js/debug.git","type":"git"},"_npmVersion":"10.2.4","description":"Lightweight debugging utility for Node.js and the browser","directories":{},"_nodeVersion":"21.3.0","dependencies":{"ms":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"xo":"^0.23.0","brfs":"^2.0.1","karma":"^3.1.4","mocha":"^5.2.0","sinon":"^14.0.0","istanbul":"^0.4.5","coveralls":"^3.0.2","browserify":"^16.2.3","karma-mocha":"^1.3.0","karma-browserify":"^6.0.0","mocha-lcov-reporter":"^1.2.0","karma-chrome-launcher":"^2.2.0"},"peerDependenciesMeta":{"supports-color":{"optional":true}}}},"author":{"url":"https://github.com/qix-","name":"Josh Junon"},"repository":{"url":"git://github.com/debug-js/debug.git","type":"git"},"license":"MIT","homepage":"https://github.com/debug-js/debug#readme","bugs":{"url":"https://github.com/debug-js/debug/issues"},"readme":"# debug\n[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)\n[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png\">\n\nA tiny JavaScript debugging utility modelled after Node.js core's debugging\ntechnique. Works in Node.js and web browsers.\n\n## Installation\n\n```bash\n$ npm install debug\n```\n\n## Usage\n\n`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.\n\nExample [_app.js_](./examples/node/app.js):\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %o', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample [_worker.js_](./examples/node/worker.js):\n\n```js\nvar a = require('debug')('worker:a')\n , b = require('debug')('worker:b');\n\nfunction work() {\n a('doing lots of uninteresting work');\n setTimeout(work, Math.random() * 1000);\n}\n\nwork();\n\nfunction workb() {\n b('doing some work');\n setTimeout(workb, Math.random() * 2000);\n}\n\nworkb();\n```\n\nThe `DEBUG` environment variable is then used to enable these based on space or\ncomma-delimited names.\n\nHere are some examples:\n\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 04 pm\" src=\"https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png\">\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 38 pm\" src=\"https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png\">\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 25 pm\" src=\"https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png\">\n\n#### Windows command prompt notes\n\n##### CMD\n\nOn Windows the environment variable is set using the `set` command.\n\n```cmd\nset DEBUG=*,-not_this\n```\n\nExample:\n\n```cmd\nset DEBUG=* & node app.js\n```\n\n##### PowerShell (VS Code default)\n\nPowerShell uses different syntax to set environment variables.\n\n```cmd\n$env:DEBUG = \"*,-not_this\"\n```\n\nExample:\n\n```cmd\n$env:DEBUG='app';node app.js\n```\n\nThen, run the program to be debugged as usual.\n\nnpm script example:\n```js\n \"windowsDebug\": \"@powershell -Command $env:DEBUG='*';node app.js\",\n```\n\n## Namespace Colors\n\nEvery debug instance has a color generated for it based on its namespace name.\nThis helps when visually parsing the debug output to identify which debug instance\na debug line belongs to.\n\n#### Node.js\n\nIn Node.js, colors are enabled when stderr is a TTY. You also _should_ install\nthe [`supports-color`](https://npmjs.org/supports-color) module alongside debug,\notherwise debug will only use a small handful of basic colors.\n\n<img width=\"521\" src=\"https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png\">\n\n#### Web Browser\n\nColors are also enabled on \"Web Inspectors\" that understand the `%c` formatting\noption. These are WebKit web inspectors, Firefox ([since version\n31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))\nand the Firebug plugin for Firefox (any version).\n\n<img width=\"524\" src=\"https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png\">\n\n\n## Millisecond diff\n\nWhen actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png\">\n\nWhen stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png\">\n\n\n## Conventions\n\nIf you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". If you append a \"*\" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output.\n\n## Wildcards\n\nThe `*` character may be used as a wildcard. Suppose for example your library has\ndebuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\",\ninstead of listing all three with\n`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do\n`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\nYou can also exclude specific debuggers by prefixing them with a \"-\" character.\nFor example, `DEBUG=*,-connect:*` would include all debuggers except those\nstarting with \"connect:\".\n\n## Environment Variables\n\nWhen running through Node.js, you can set a few environment variables that will\nchange the behavior of the debug logging:\n\n| Name | Purpose |\n|-----------|-------------------------------------------------|\n| `DEBUG` | Enables/disables specific debugging namespaces. |\n| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). |\n| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |\n| `DEBUG_DEPTH` | Object inspection depth. |\n| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |\n\n\n__Note:__ The environment variables beginning with `DEBUG_` end up being\nconverted into an Options object that gets used with `%o`/`%O` formatters.\nSee the Node.js documentation for\n[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)\nfor the complete list.\n\n## Formatters\n\nDebug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.\nBelow are the officially supported formatters:\n\n| Formatter | Representation |\n|-----------|----------------|\n| `%O` | Pretty-print an Object on multiple lines. |\n| `%o` | Pretty-print an Object all on a single line. |\n| `%s` | String. |\n| `%d` | Number (both integer and float). |\n| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |\n| `%%` | Single percent sign ('%'). This does not consume an argument. |\n\n\n### Custom formatters\n\nYou can add custom formatters by extending the `debug.formatters` object.\nFor example, if you wanted to add support for rendering a Buffer as hex with\n`%h`, you could do something like:\n\n```js\nconst createDebug = require('debug')\ncreateDebug.formatters.h = (v) => {\n return v.toString('hex')\n}\n\n// …elsewhere\nconst debug = createDebug('foo')\ndebug('this is hex: %h', new Buffer('hello world'))\n// foo this is hex: 68656c6c6f20776f726c6421 +0ms\n```\n\n\n## Browser Support\n\nYou can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),\nor just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),\nif you don't want to build it yourself.\n\nDebug's enable state is currently persisted by `localStorage`.\nConsider the situation shown below where you have `worker:a` and `worker:b`,\nand wish to debug both. You can enable this using `localStorage.debug`:\n\n```js\nlocalStorage.debug = 'worker:*'\n```\n\nAnd then refresh the page.\n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n b('doing some work');\n}, 1200);\n```\n\nIn Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the \"Verbose\" log level is _enabled_.\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.png\">\n\n## Output streams\n\n By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:\n\nExample [_stdout.js_](./examples/node/stdout.js):\n\n```js\nvar debug = require('debug');\nvar error = debug('app:error');\n\n// by default stderr is used\nerror('goes to stderr!');\n\nvar log = debug('app:log');\n// set this namespace to log via console.log\nlog.log = console.log.bind(console); // don't forget to bind to console!\nlog('goes to stdout');\nerror('still goes to stderr!');\n\n// set all output to go via console.info\n// overrides all per-namespace log settings\ndebug.log = console.info.bind(console);\nerror('now goes to stdout via console.info');\nlog('still goes to stdout, but via console.info now');\n```\n\n## Extend\nYou can simply extend debugger \n```js\nconst log = require('debug')('auth');\n\n//creates new debug instance with extended namespace\nconst logSign = log.extend('sign');\nconst logLogin = log.extend('login');\n\nlog('hello'); // auth hello\nlogSign('hello'); //auth:sign hello\nlogLogin('hello'); //auth:login hello\n```\n\n## Set dynamically\n\nYou can also enable debug dynamically by calling the `enable()` method :\n\n```js\nlet debug = require('debug');\n\nconsole.log(1, debug.enabled('test'));\n\ndebug.enable('test');\nconsole.log(2, debug.enabled('test'));\n\ndebug.disable();\nconsole.log(3, debug.enabled('test'));\n\n```\n\nprint : \n```\n1 false\n2 true\n3 false\n```\n\nUsage : \n`enable(namespaces)` \n`namespaces` can include modes separated by a colon and wildcards.\n \nNote that calling `enable()` completely overrides previously set DEBUG variable : \n\n```\n$ DEBUG=foo node -e 'var dbg = require(\"debug\"); dbg.enable(\"bar\"); console.log(dbg.enabled(\"foo\"))'\n=> false\n```\n\n`disable()`\n\nWill disable all namespaces. The functions returns the namespaces currently\nenabled (and skipped). This can be useful if you want to disable debugging\ntemporarily without knowing what was enabled to begin with.\n\nFor example:\n\n```js\nlet debug = require('debug');\ndebug.enable('foo:*,-foo:bar');\nlet namespaces = debug.disable();\ndebug.enable(namespaces);\n```\n\nNote: There is no guarantee that the string will be identical to the initial\nenable string, but semantically they will be identical.\n\n## Checking whether a debug target is enabled\n\nAfter you've created a debug instance, you can determine whether or not it is\nenabled by checking the `enabled` property:\n\n```javascript\nconst debug = require('debug')('http');\n\nif (debug.enabled) {\n // do stuff...\n}\n```\n\nYou can also manually toggle this property to force the debug instance to be\nenabled or disabled.\n\n## Usage in child processes\n\nDue to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process. \nFor example:\n\n```javascript\nworker = fork(WORKER_WRAP_PATH, [workerPath], {\n stdio: [\n /* stdin: */ 0,\n /* stdout: */ 'pipe',\n /* stderr: */ 'pipe',\n 'ipc',\n ],\n env: Object.assign({}, process.env, {\n DEBUG_COLORS: 1 // without this settings, colors won't be shown\n }),\n});\n\nworker.stderr.pipe(process.stderr, { end: false });\n```\n\n\n## Authors\n\n - TJ Holowaychuk\n - Nathan Rajlich\n - Andrew Rhyne\n - Josh Junon\n\n## Backers\n\nSupport us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]\n\n<a href=\"https://opencollective.com/debug/backer/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/29/avatar.svg\"></a>\n\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]\n\n<a href=\"https://opencollective.com/debug/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/29/avatar.svg\"></a>\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\nCopyright (c) 2018-2021 Josh Junon\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md"}
+{
+ "name": "debug",
+ "description": "Lightweight debugging utility for Node.js and the browser",
+ "dist-tags": {
+ "latest": "4.3.5"
+ },
+ "versions": {
+ "4.3.5": {
+ "name": "debug",
+ "version": "4.3.5",
+ "author": {
+ "url": "https://github.com/qix-",
+ "name": "Josh Junon"
+ },
+ "license": "MIT",
+ "_id": "debug@4.3.5",
+ "bugs": {
+ "url": "https://github.com/debug-js/debug/issues"
+ },
+ "dist": {
+ "shasum": "e83444eceb9fedd4a1da56d671ae2446a01a6e1e",
+ "tarball": "http://localhost:4260/debug/debug-4.3.5.tgz",
+ "fileCount": 7,
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+ "unpackedSize": 42430
+ },
+ "main": "./src/index.js",
+ "browser": "./src/browser.js",
+ "engines": {
+ "node": ">=6.0"
+ },
+ "gitHead": "5464bdddbc6f91b2aef2ad20650d3a6cfd9fcc3a",
+ "scripts": {
+ "lint": "xo",
+ "test": "npm run test:node && npm run test:browser && npm run lint",
+ "test:node": "istanbul cover _mocha -- test.js test.node.js",
+ "test:browser": "karma start --single-run",
+ "test:coverage": "cat ./coverage/lcov.info | coveralls"
+ },
+ "repository": {
+ "url": "git://github.com/debug-js/debug.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.2.4",
+ "description": "Lightweight debugging utility for Node.js and the browser",
+ "directories": {},
+ "_nodeVersion": "21.3.0",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "xo": "^0.23.0",
+ "brfs": "^2.0.1",
+ "karma": "^3.1.4",
+ "mocha": "^5.2.0",
+ "sinon": "^14.0.0",
+ "istanbul": "^0.4.5",
+ "coveralls": "^3.0.2",
+ "browserify": "^16.2.3",
+ "karma-mocha": "^1.3.0",
+ "karma-browserify": "^6.0.0",
+ "mocha-lcov-reporter": "^1.2.0",
+ "karma-chrome-launcher": "^2.2.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ }
+ },
+ "author": {
+ "url": "https://github.com/qix-",
+ "name": "Josh Junon"
+ },
+ "repository": {
+ "url": "git://github.com/debug-js/debug.git",
+ "type": "git"
+ },
+ "license": "MIT",
+ "homepage": "https://github.com/debug-js/debug#readme",
+ "bugs": {
+ "url": "https://github.com/debug-js/debug/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/decamelize/registry.json b/tests/registry/npm/decamelize/registry.json
index fccd0c0c6..a8621a206 100644
--- a/tests/registry/npm/decamelize/registry.json
+++ b/tests/registry/npm/decamelize/registry.json
@@ -1 +1,67 @@
-{"name":"decamelize","description":"Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow","dist-tags":{"latest":"1.2.0"},"versions":{"1.2.0":{"name":"decamelize","version":"1.2.0","description":"Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/decamelize.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=0.10.0"},"scripts":{"test":"xo && ava"},"files":["index.js"],"devDependencies":{"ava":"*","xo":"*"},"gitHead":"95980ab6fb44c40eaca7792bdf93aff7c210c805","bugs":{"url":"https://github.com/sindresorhus/decamelize/issues"},"_id":"decamelize@1.2.0","_shasum":"f6534d15148269b20352e7bee26f501f9a191290","_from":".","_npmVersion":"3.8.0","_nodeVersion":"4.3.0","dist":{"shasum":"f6534d15148269b20352e7bee26f501f9a191290","tarball":"http://localhost:4260/decamelize/decamelize-1.2.0.tgz","integrity":"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQhUezVI1PCerbzo58z6jDX/QX65VXwwlK0MtuP/qWmQIgPE3vDVmsT4Hjv8yxBjhumH7ME0jtXibtktOC235S6X4="}]},"directories":{}}},"readme":"# decamelize\n\n> Convert a camelized string into a lowercased one with a custom separator\\\n> Example: `unicornRainbow` → `unicorn_rainbow`\n\nIf you use this on untrusted user input, don't forget to limit the length to something reasonable.\n\n## Install\n\n```sh\nnpm install decamelize\n```\n\n## Usage\n\n```js\nimport decamelize from 'decamelize';\n\ndecamelize('unicornRainbow');\n//=> 'unicorn_rainbow'\n\ndecamelize('unicornRainbow', {separator: '-'});\n//=> 'unicorn-rainbow'\n\ndecamelize('testGUILabel', {preserveConsecutiveUppercase: true});\n//=> 'test_GUI_label'\n\ndecamelize('testGUILabel', {preserveConsecutiveUppercase: false});\n//=> 'test_gui_label'\n```\n\n## API\n\n### decamelize(input, options?)\n\n#### input\n\nType: `string`\n\n#### options\n\nType: `object`\n\n##### separator\n\nType: `string`\\\nDefault: `'_'`\n\nCharacter or string inserted to separate words in `string`.\n\n```js\nimport decamelize from 'decamelize';\n\ndecamelize('unicornRainbow');\n//=> 'unicorn_rainbow'\n\ndecamelize('unicornRainbow', {separator: '-'});\n//=> 'unicorn-rainbow'\n```\n\n##### preserveConsecutiveUppercase\n\nType: `boolean`\\\nDefault: `false`\n\nPreserve sequences of uppercase characters.\n\n```js\nimport decamelize from 'decamelize';\n\ndecamelize('testGUILabel');\n//=> 'test_gui_label'\n\ndecamelize('testGUILabel', {preserveConsecutiveUppercase: true});\n//=> 'test_GUI_label'\n```\n\n## Related\n\nSee [`camelcase`](https://github.com/sindresorhus/camelcase) for the inverse.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-decamelize?utm_source=npm-decamelize&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/decamelize#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/decamelize.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/decamelize/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "decamelize",
+ "description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow",
+ "dist-tags": {
+ "latest": "1.2.0"
+ },
+ "versions": {
+ "1.2.0": {
+ "name": "decamelize",
+ "version": "1.2.0",
+ "description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/decamelize.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "gitHead": "95980ab6fb44c40eaca7792bdf93aff7c210c805",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/decamelize/issues"
+ },
+ "_id": "decamelize@1.2.0",
+ "_shasum": "f6534d15148269b20352e7bee26f501f9a191290",
+ "_from": ".",
+ "_npmVersion": "3.8.0",
+ "_nodeVersion": "4.3.0",
+ "dist": {
+ "shasum": "f6534d15148269b20352e7bee26f501f9a191290",
+ "tarball": "http://localhost:4260/decamelize/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+ },
+ "directories": {}
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/decamelize#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/decamelize.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/decamelize/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/deep-eql/registry.json b/tests/registry/npm/deep-eql/registry.json
index f521fda79..a15fd57fe 100644
--- a/tests/registry/npm/deep-eql/registry.json
+++ b/tests/registry/npm/deep-eql/registry.json
@@ -1 +1,118 @@
-{"name":"deep-eql","description":"Improved deep equality testing for Node.js and the browser.","dist-tags":{"latest":"3.0.1"},"versions":{"3.0.1":{"name":"deep-eql","description":"Improved deep equality testing for Node.js and the browser.","license":"MIT","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"main":"./index","files":["index.js","deep-eql.js"],"repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/deep-eql.git"},"scripts":{"bench":"node bench","build":"browserify $npm_package_main --standalone deepEqual -o deep-eql.js","lint":"eslint --ignore-path .gitignore .","prepublish":"npm run build","semantic-release":"semantic-release pre && npm publish && semantic-release post","pretest":"npm run lint","test":"npm run test:node && npm run test:browser","test:node":"istanbul cover _mocha","test:browser":"karma start --singleRun=true","watch":"karma start --auto-watch --singleRun=false","upload-coverage":"lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg"}},"eslintConfig":{"extends":["strict/es5"],"rules":{"complexity":0,"spaced-comment":0,"no-underscore-dangle":0,"no-use-before-define":0}},"dependencies":{"type-detect":"^4.0.0"},"devDependencies":{"benchmark":"^2.1.0","browserify":"^13.0.0","browserify-istanbul":"^1.0.0","component":"*","coveralls":"2.11.8","eslint":"^2.4.0","eslint-config-strict":"^8.5.0","eslint-plugin-filenames":"^0.2.0","ghooks":"^1.0.1","istanbul":"^0.4.2","karma":"^0.13.22","karma-browserify":"^5.0.2","karma-coverage":"^0.5.5","karma-mocha":"^0.2.2","karma-phantomjs-launcher":"^1.0.0","karma-sauce-launcher":"^0.3.1","kewlr":"^0.3.1","lcov-result-merger":"^1.0.2","lodash.isequal":"^4.4.0","mocha":"^3.1.2","phantomjs-prebuilt":"^2.1.5","semantic-release":"^4.3.5","simple-assert":"^1.0.0","travis-after-all":"^1.4.4","validate-commit-msg":"^2.3.1","watchify":"^3.7.0"},"engines":{"node":">=0.12"},"version":"3.0.1","gitHead":"04d6da6518f8ddc288638ca42503752028810120","bugs":{"url":"https://github.com/chaijs/deep-eql/issues"},"_id":"deep-eql@3.0.1","_npmVersion":"5.4.0","_nodeVersion":"4.8.4","dist":{"integrity":"sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==","shasum":"dfc9404400ad1c8fe023e7da1df1c147c4b444df","tarball":"http://localhost:4260/deep-eql/deep-eql-3.0.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA2Guc+Zr2++fpu1HORRISQsk11kiAUxrDzV8xdJtCwvAiBEz45k8/VAewT+AIlg5CPaJ3gB2t17o0CIetQyvSPPcw=="}]},"directories":{}}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"deep-eql\" src=\"https://raw.githubusercontent.com/chaijs/deep-eql/main/deep-eql-logo.svg\"/>\n </a>\n</h1>\n\n<p align=center>\n Improved deep equality testing for <a href=\"http://nodejs.org/\">node</a> and the browser.\n</p>\n\n<p align=center>\n <a href=\"https://github.com/chaijs/deep-eql/actions\">\n <img\n alt=\"build:?\"\n src=\"https://github.com/chaijs/deep-eql/workflows/Build/badge.svg\"\n />\n </a><a href=\"https://coveralls.io/r/chaijs/deep-eql\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/coveralls/chaijs/deep-eql/master.svg?style=flat-square\"\n />\n </a><a href=\"https://www.npmjs.com/packages/deep-eql\">\n <img\n alt=\"dependencies:?\"\n src=\"https://img.shields.io/npm/dm/deep-eql.svg?style=flat-square\"\n />\n </a><a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/deep-eql.svg?style=flat-square\"\n />\n </a>\n <br>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/deep-eql\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n</p>\n\n## What is Deep-Eql?\n\nDeep Eql is a module which you can use to determine if two objects are \"deeply\" equal - that is, rather than having referential equality (`a === b`), this module checks an object's keys recursively, until it finds primitives to check for referential equality. For more on equality in JavaScript, read [the comparison operators article on mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators).\n\nAs an example, take the following:\n\n```js\n1 === 1 // These are primitives, they hold the same reference - they are strictly equal\n1 == '1' // These are two different primitives, through type coercion they hold the same value - they are loosely equal\n{ a: 1 } !== { a: 1 } // These are two different objects, they hold different references and so are not strictly equal - even though they hold the same values inside\n{ a: 1 } != { a: 1 } // They have the same type, meaning loose equality performs the same check as strict equality - they are still not equal.\n\nvar deepEql = require(\"deep-eql\");\ndeepEql({ a: 1 }, { a: 1 }) === true // deepEql can determine that they share the same keys and those keys share the same values, therefore they are deeply equal!\n```\n\n## Installation\n\n### Node.js\n\n`deep-eql` is available on [npm](http://npmjs.org).\n\n $ npm install deep-eql\n\n## Usage\n\nThe primary export of `deep-eql` is function that can be given two objects to compare. It will always return a boolean which can be used to determine if two objects are deeply equal.\n\n### Rules\n\n- Strict equality for non-traversable nodes according to [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is):\n - `eql(NaN, NaN).should.be.true;`\n - `eql(-0, +0).should.be.false;`\n- All own and inherited enumerable properties are considered:\n - `eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 1 } })).should.be.true;`\n - `eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 2 } })).should.be.false;`\n- When comparing `Error` objects, only `name`, `message`, and `code` properties are considered, regardless of enumerability:\n - `eql(Error('foo'), Error('foo')).should.be.true;`\n - `eql(Error('foo'), Error('bar')).should.be.false;`\n - `eql(Error('foo'), TypeError('foo')).should.be.false;`\n - `eql(Object.assign(Error('foo'), { code: 42 }), Object.assign(Error('foo'), { code: 42 })).should.be.true;`\n - `eql(Object.assign(Error('foo'), { code: 42 }), Object.assign(Error('foo'), { code: 13 })).should.be.false;`\n - `eql(Object.assign(Error('foo'), { otherProp: 42 }), Object.assign(Error('foo'), { otherProp: 13 })).should.be.true;`\n- Arguments are not Arrays:\n - `eql([], arguments).should.be.false;`\n - `eql([], Array.prototype.slice.call(arguments)).should.be.true;`\n","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/deep-eql.git"},"bugs":{"url":"https://github.com/chaijs/deep-eql/issues"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/chaijs/deep-eql#readme"}
+{
+ "name": "deep-eql",
+ "description": "Improved deep equality testing for Node.js and the browser.",
+ "dist-tags": {
+ "latest": "3.0.1"
+ },
+ "versions": {
+ "3.0.1": {
+ "name": "deep-eql",
+ "description": "Improved deep equality testing for Node.js and the browser.",
+ "license": "MIT",
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com"
+ },
+ "main": "./index",
+ "files": [
+ "index.js",
+ "deep-eql.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/deep-eql.git"
+ },
+ "scripts": {
+ "bench": "node bench",
+ "build": "browserify $npm_package_main --standalone deepEqual -o deep-eql.js",
+ "lint": "eslint --ignore-path .gitignore .",
+ "prepublish": "npm run build",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "pretest": "npm run lint",
+ "test": "npm run test:node && npm run test:browser",
+ "test:node": "istanbul cover _mocha",
+ "test:browser": "karma start --singleRun=true",
+ "watch": "karma start --auto-watch --singleRun=false",
+ "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"
+ },
+ "config": {
+ "ghooks": {
+ "commit-msg": "validate-commit-msg"
+ }
+ },
+ "eslintConfig": {
+ "extends": [
+ "strict/es5"
+ ],
+ "rules": {
+ "complexity": 0,
+ "spaced-comment": 0,
+ "no-underscore-dangle": 0,
+ "no-use-before-define": 0
+ }
+ },
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "devDependencies": {
+ "benchmark": "^2.1.0",
+ "browserify": "^13.0.0",
+ "browserify-istanbul": "^1.0.0",
+ "component": "*",
+ "coveralls": "2.11.8",
+ "eslint": "^2.4.0",
+ "eslint-config-strict": "^8.5.0",
+ "eslint-plugin-filenames": "^0.2.0",
+ "ghooks": "^1.0.1",
+ "istanbul": "^0.4.2",
+ "karma": "^0.13.22",
+ "karma-browserify": "^5.0.2",
+ "karma-coverage": "^0.5.5",
+ "karma-mocha": "^0.2.2",
+ "karma-phantomjs-launcher": "^1.0.0",
+ "karma-sauce-launcher": "^0.3.1",
+ "kewlr": "^0.3.1",
+ "lcov-result-merger": "^1.0.2",
+ "lodash.isequal": "^4.4.0",
+ "mocha": "^3.1.2",
+ "phantomjs-prebuilt": "^2.1.5",
+ "semantic-release": "^4.3.5",
+ "simple-assert": "^1.0.0",
+ "travis-after-all": "^1.4.4",
+ "validate-commit-msg": "^2.3.1",
+ "watchify": "^3.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ },
+ "version": "3.0.1",
+ "gitHead": "04d6da6518f8ddc288638ca42503752028810120",
+ "bugs": {
+ "url": "https://github.com/chaijs/deep-eql/issues"
+ },
+ "_id": "deep-eql@3.0.1",
+ "_npmVersion": "5.4.0",
+ "_nodeVersion": "4.8.4",
+ "dist": {
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "shasum": "dfc9404400ad1c8fe023e7da1df1c147c4b444df",
+ "tarball": "http://localhost:4260/deep-eql/deep-eql-3.0.1.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/deep-eql.git"
+ },
+ "bugs": {
+ "url": "https://github.com/chaijs/deep-eql/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/chaijs/deep-eql#readme"
+}
diff --git a/tests/registry/npm/define-properties/registry.json b/tests/registry/npm/define-properties/registry.json
index 95ced24cb..d4a90167f 100644
--- a/tests/registry/npm/define-properties/registry.json
+++ b/tests/registry/npm/define-properties/registry.json
@@ -1 +1,120 @@
-{"name":"define-properties","description":"Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.","dist-tags":{"latest":"1.2.0"},"versions":{"1.2.0":{"name":"define-properties","version":"1.2.0","author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"funding":{"url":"https://github.com/sponsors/ljharb"},"description":"Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.","license":"MIT","main":"index.js","scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublish":"not-in-publish || npm run prepublishOnly","prepublishOnly":"safe-publish-latest","pretest":"npm run lint","test":"npm run tests-only","posttest":"aud --production","tests-only":"nyc tape 'test/**/*.js'","lint":"eslint --ext=js,mjs .","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"repository":{"type":"git","url":"git://github.com/ljharb/define-properties.git"},"dependencies":{"has-property-descriptors":"^1.0.0","object-keys":"^1.1.1"},"devDependencies":{"@ljharb/eslint-config":"^21.0.1","aud":"^2.0.2","auto-changelog":"^2.4.0","eslint":"=8.8.0","in-publish":"^2.0.1","npmignore":"^0.3.0","nyc":"^10.3.2","safe-publish-latest":"^2.0.0","tape":"^5.6.3"},"testling":{"files":"test/index.js","browsers":["iexplore/6.0..latest","firefox/3.0..6.0","firefox/15.0..latest","firefox/nightly","chrome/4.0..10.0","chrome/20.0..latest","chrome/canary","opera/10.0..latest","opera/next","safari/4.0..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2"]},"engines":{"node":">= 0.4"},"auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true,"startingVersion":"1.1.5"},"publishConfig":{"ignore":[".github/workflows","test/"]},"gitHead":"aa5afa274d736c1ebd59e403b5b3b5b404689a57","bugs":{"url":"https://github.com/ljharb/define-properties/issues"},"_id":"define-properties@1.2.0","_nodeVersion":"19.6.0","_npmVersion":"9.4.0","dist":{"integrity":"sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==","shasum":"52988570670c9eacedd8064f4a990f2405849bd5","tarball":"http://localhost:4260/define-properties/define-properties-1.2.0.tgz","fileCount":9,"unpackedSize":12453,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2R6SBVZWJCCg7Z1PkTr8TYLGBpk5aQNaXmqzjLJml2QIgJipbNCmGIXHgvp4vOv0L/SBkYkerCHZ2PyQBAVjAScQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5niKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcWBAAgCes8tVtZ6ORE3V+bO+EyPBU76QcCa52bvve/uQKu2DvcSJz\r\nnvnC1aIUlDkR8/ZHI8LC5ONJOos5nIvVwC9cjqjXekk9Y1pXtdmNmplQms04\r\njWnZGp23RWhR0RkghJT7c33Zt+6o0f0RokC/pXheR37qRTclwtx/QXHc3U15\r\nqWb8fQbotRHSnoo7bMAM6DVmEeGQD8KIPd5NtoLx6qL0IWP0kQzo1LUs8Cif\r\nE6Y6jkrknPhptz9aVOIj2H0AVtj7NzjSSxtk4qjg3v3Vw35dSj1vC5UuoT65\r\nn6bBMSk2uS7ISTcKJJsYvRHbfk06XQJdO0/LXPlzqLDjt34tA7M91l+Wmvbz\r\nJNuuoo0jmnMk0PLK4PCvAGLBnPUiBH+02iPwLL0EfrGSRaBIOEi+ZNrAqu2M\r\n8kb58GjN4qtfBwobdq2AIDSJKJ3tkss0KV7a8j54+sKyDHEoAXD/XziI4Q4v\r\nNtZCiFF4xtmphCOgj04j1Bp26gB0c6SRTXm7Glsw7vm4bpwsxxdL5GIoIQAA\r\np3laNAtXOOgVDguFoGHwfJTkL2d2lCpfiY66YpemYptsA0lQEEjvVhyrkHpO\r\nesbdlZi8EiZcZTNdto2Gj5iFr8Pqd764Z9+DLH/DaVGFcX+z6NgNRN1Ia49L\r\nLOetyEJ8/3fa4D+k3b531EH/iXJl8zQu9q0=\r\n=oqSW\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# define-properties <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nDefine multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.\nExisting properties are not overridden. Accepts a map of property names to a predicate that, when true, force-overrides.\n\n## Example\n\n```js\nvar define = require('define-properties');\nvar assert = require('assert');\n\nvar obj = define({ a: 1, b: 2 }, {\n\ta: 10,\n\tb: 20,\n\tc: 30\n});\nassert(obj.a === 1);\nassert(obj.b === 2);\nassert(obj.c === 30);\nif (define.supportsDescriptors) {\n\tassert.deepEqual(Object.keys(obj), ['a', 'b']);\n\tassert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'c'), {\n\t\tconfigurable: true,\n\t\tenumerable: false,\n\t\tvalue: 30,\n\t\twritable: false\n\t});\n}\n```\n\nThen, with predicates:\n```js\nvar define = require('define-properties');\nvar assert = require('assert');\n\nvar obj = define({ a: 1, b: 2, c: 3 }, {\n\ta: 10,\n\tb: 20,\n\tc: 30\n}, {\n\ta: function () { return false; },\n\tb: function () { return true; }\n});\nassert(obj.a === 1);\nassert(obj.b === 20);\nassert(obj.c === 3);\nif (define.supportsDescriptors) {\n\tassert.deepEqual(Object.keys(obj), ['a', 'c']);\n\tassert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'b'), {\n\t\tconfigurable: true,\n\t\tenumerable: false,\n\t\tvalue: 20,\n\t\twritable: false\n\t});\n}\n```\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n[package-url]: https://npmjs.org/package/define-properties\n[npm-version-svg]: https://versionbadg.es/ljharb/define-properties.svg\n[deps-svg]: https://david-dm.org/ljharb/define-properties.svg\n[deps-url]: https://david-dm.org/ljharb/define-properties\n[dev-deps-svg]: https://david-dm.org/ljharb/define-properties/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/define-properties#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/define-properties.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/define-properties.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/define-properties.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=define-properties\n[codecov-image]: https://codecov.io/gh/ljharb/define-properties/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/define-properties/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/define-properties\n[actions-url]: https://github.com/ljharb/define-properties/actions\n","homepage":"https://github.com/ljharb/define-properties#readme","repository":{"type":"git","url":"git://github.com/ljharb/define-properties.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"bugs":{"url":"https://github.com/ljharb/define-properties/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "define-properties",
+ "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
+ "dist-tags": {
+ "latest": "1.2.0"
+ },
+ "versions": {
+ "1.2.0": {
+ "name": "define-properties",
+ "version": "1.2.0",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
+ "license": "MIT",
+ "main": "index.js",
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "pretest": "npm run lint",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "lint": "eslint --ext=js,mjs .",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/define-properties.git"
+ },
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.0.1",
+ "aud": "^2.0.2",
+ "auto-changelog": "^2.4.0",
+ "eslint": "=8.8.0",
+ "in-publish": "^2.0.1",
+ "npmignore": "^0.3.0",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.6.3"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true,
+ "startingVersion": "1.1.5"
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows",
+ "test/"
+ ]
+ },
+ "gitHead": "aa5afa274d736c1ebd59e403b5b3b5b404689a57",
+ "bugs": {
+ "url": "https://github.com/ljharb/define-properties/issues"
+ },
+ "_id": "define-properties@1.2.0",
+ "_nodeVersion": "19.6.0",
+ "_npmVersion": "9.4.0",
+ "dist": {
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "shasum": "52988570670c9eacedd8064f4a990f2405849bd5",
+ "tarball": "http://localhost:4260/define-properties/define-properties-1.2.0.tgz",
+ "fileCount": 9,
+ "unpackedSize": 12453
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/ljharb/define-properties#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/define-properties.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/define-properties/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/eastasianwidth/registry.json b/tests/registry/npm/eastasianwidth/registry.json
index 280ee8039..b54a14058 100644
--- a/tests/registry/npm/eastasianwidth/registry.json
+++ b/tests/registry/npm/eastasianwidth/registry.json
@@ -1 +1,58 @@
-{"name":"eastasianwidth","description":"Get East Asian Width from a character.","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"eastasianwidth","version":"0.2.0","description":"Get East Asian Width from a character.","main":"eastasianwidth.js","files":["eastasianwidth.js"],"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git://github.com/komagata/eastasianwidth.git"},"author":{"name":"Masaki Komagata"},"license":"MIT","devDependencies":{"mocha":"~1.9.0"},"gitHead":"b89f04d44dc786885615e94cd6e2ba1ef7866fa4","bugs":{"url":"https://github.com/komagata/eastasianwidth/issues"},"_id":"eastasianwidth@0.2.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","dist":{"integrity":"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==","shasum":"696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb","tarball":"http://localhost:4260/eastasianwidth/eastasianwidth-0.2.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDNcp1SIwsuxLGmN5jJS4ZVTyfWVfHzoC3URtimwSMusAiEA4eLB2KCWmzEszVyewyStQBj4U38rvuXvf4AcXnx/IjM="}]},"directories":{}}},"readme":"# East Asian Width\n\nGet [East Asian Width](http://www.unicode.org/reports/tr11/) from a character.\n\n'F'(Fullwidth), 'H'(Halfwidth), 'W'(Wide), 'Na'(Narrow), 'A'(Ambiguous) or 'N'(Natural).\n\nOriginal Code is [東アジアの文字幅 (East Asian Width) の判定 - 中途](http://d.hatena.ne.jp/takenspc/20111126#1322252878).\n\n## Install\n\n $ npm install eastasianwidth\n\n## Usage\n\n var eaw = require('eastasianwidth');\n console.log(eaw.eastAsianWidth('₩')) // 'F'\n console.log(eaw.eastAsianWidth('。')) // 'H'\n console.log(eaw.eastAsianWidth('뀀')) // 'W'\n console.log(eaw.eastAsianWidth('a')) // 'Na'\n console.log(eaw.eastAsianWidth('①')) // 'A'\n console.log(eaw.eastAsianWidth('ف')) // 'N'\n\n console.log(eaw.characterLength('₩')) // 2\n console.log(eaw.characterLength('。')) // 1\n console.log(eaw.characterLength('뀀')) // 2\n console.log(eaw.characterLength('a')) // 1\n console.log(eaw.characterLength('①')) // 2\n console.log(eaw.characterLength('ف')) // 1\n\n console.log(eaw.length('あいうえお')) // 10\n console.log(eaw.length('abcdefg')) // 7\n console.log(eaw.length('¢₩。ᅵㄅ뀀¢⟭a⊙①بف')) // 19\n","author":{"name":"Masaki Komagata"},"repository":{"type":"git","url":"git://github.com/komagata/eastasianwidth.git"},"homepage":"https://github.com/komagata/eastasianwidth#readme","bugs":{"url":"https://github.com/komagata/eastasianwidth/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "eastasianwidth",
+ "description": "Get East Asian Width from a character.",
+ "dist-tags": {
+ "latest": "0.2.0"
+ },
+ "versions": {
+ "0.2.0": {
+ "name": "eastasianwidth",
+ "version": "0.2.0",
+ "description": "Get East Asian Width from a character.",
+ "main": "eastasianwidth.js",
+ "files": [
+ "eastasianwidth.js"
+ ],
+ "scripts": {
+ "test": "mocha"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/komagata/eastasianwidth.git"
+ },
+ "author": {
+ "name": "Masaki Komagata"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "mocha": "~1.9.0"
+ },
+ "gitHead": "b89f04d44dc786885615e94cd6e2ba1ef7866fa4",
+ "bugs": {
+ "url": "https://github.com/komagata/eastasianwidth/issues"
+ },
+ "_id": "eastasianwidth@0.2.0",
+ "_npmVersion": "5.5.1",
+ "_nodeVersion": "8.9.1",
+ "dist": {
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "shasum": "696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb",
+ "tarball": "http://localhost:4260/eastasianwidth/eastasianwidth-0.2.0.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Masaki Komagata"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/komagata/eastasianwidth.git"
+ },
+ "homepage": "https://github.com/komagata/eastasianwidth#readme",
+ "bugs": {
+ "url": "https://github.com/komagata/eastasianwidth/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/electron-to-chromium/registry.json b/tests/registry/npm/electron-to-chromium/registry.json
index 17f648793..e7f039b65 100644
--- a/tests/registry/npm/electron-to-chromium/registry.json
+++ b/tests/registry/npm/electron-to-chromium/registry.json
@@ -1 +1,28 @@
-{"name":"electron-to-chromium","dist-tags":{"latest":"1.4.348"},"versions":{"1.4.348":{"name":"electron-to-chromium","version":"1.4.348","devDependencies":{"ava":"^5.1.1","codecov":"^3.8.2","compare-versions":"^6.0.0-rc.1","node-fetch":"^3.3.0","nyc":"^15.1.0","shelljs":"^0.8.5"},"dist":{"integrity":"sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==","shasum":"f49379dc212d79f39112dd026f53e371279e433d","tarball":"http://localhost:4260/electron-to-chromium/electron-to-chromium-1.4.348.tgz","fileCount":13,"unpackedSize":220360,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtvgYU0V5ouubVjwFi7ZDbnEBFHYth5G1cL9WKEqROXAIhAJtURudPmp9RdxlQ2Jzky5HTTgAOzHKxKR+8/1Czx2eA"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJyAuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrH/A/+OuAxaWO3izkzoueEpJeBFnu0wQPztTMNwZBNlaCWOmB/WRhl\r\n4EIHw9C39sUI3w1xUGzeJbnREwT5qE6JccM53W2KXzEt2lZiBUK8UtDg/ktb\r\nrz58aHFlWICWp/PUjL1xL2nhQ0CEye7Xd8yw/l78t77pgsrPk1Eo+8GBdvDM\r\nAMFtTSKxe8BnJn6I/n5qXq0GiZvGF/M9fotReuwXsGZ0L2Tdg9MmBYuk/BaA\r\nOgCn8ZeA6NJVZ7srbUBurpWS5MMvbbBQqnAmfBo2S9cVMLoMwnlllI5BOqsu\r\n+W3V6H2rqIuTWRt8n7smvjuxOlvIyZVU+dFSfAuV4YvZ34wNJ9j4tsm2bdPJ\r\nzEuznk6mj/mGUSGGdSE+z3Z/kYhKQnRmw4Mlj2l7mLfLnq7Lc9FEihiisrBC\r\ng1RRywDI6ilt8bJgN55EzQVazmKp2KMi8buChWewRRrx2tPYf7swICvD4IwH\r\nOoWkvmLq0ENVS7fQDygfridS/G3u8OCdmbGlWdQd2dCVptghOEFjRjy7kzCK\r\nt/QhnBI9oAXwX2kuIZ7ui2WvIaRw6gntsifC/t5XScl3fIlW5GDGN+Gaujv9\r\nKSifhD7oxKE6BkSCaVWl+LlAgbO+lVvAH5CP2UUra0bUfwTDNV2ifxkn0kJ3\r\nPlyuFGIMsFY4dS5UXa+a5w1wAvxAspuaJwA=\r\n=Fkx0\r\n-----END PGP SIGNATURE-----\r\n"}}},"modified":"2023-03-31T18:02:22.694Z"}
+{
+ "name": "electron-to-chromium",
+ "dist-tags": {
+ "latest": "1.4.348"
+ },
+ "versions": {
+ "1.4.348": {
+ "name": "electron-to-chromium",
+ "version": "1.4.348",
+ "devDependencies": {
+ "ava": "^5.1.1",
+ "codecov": "^3.8.2",
+ "compare-versions": "^6.0.0-rc.1",
+ "node-fetch": "^3.3.0",
+ "nyc": "^15.1.0",
+ "shelljs": "^0.8.5"
+ },
+ "dist": {
+ "integrity": "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==",
+ "shasum": "f49379dc212d79f39112dd026f53e371279e433d",
+ "tarball": "http://localhost:4260/electron-to-chromium/electron-to-chromium-1.4.348.tgz",
+ "fileCount": 13,
+ "unpackedSize": 220360
+ }
+ }
+ },
+ "modified": "2023-03-31T18:02:22.694Z"
+}
diff --git a/tests/registry/npm/emoji-regex/registry.json b/tests/registry/npm/emoji-regex/registry.json
index b9e087604..f879deb2d 100644
--- a/tests/registry/npm/emoji-regex/registry.json
+++ b/tests/registry/npm/emoji-regex/registry.json
@@ -1 +1,115 @@
-{"name":"emoji-regex","description":"A regular expression to match all Emoji-only symbols as per the Unicode Standard.","dist-tags":{"latest":"9.2.2"},"versions":{"8.0.0":{"name":"emoji-regex","version":"8.0.0","description":"A regular expression to match all Emoji-only symbols as per the Unicode Standard.","main":"index.js","types":"index.d.ts","license":"MIT","author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"repository":{"type":"git","url":"git+https://github.com/mathiasbynens/emoji-regex.git"},"bugs":{"url":"https://github.com/mathiasbynens/emoji-regex/issues"},"scripts":{"build":"rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src -d ./es2015; node script/inject-sequences.js","test":"mocha","test:watch":"npm run test -- --watch"},"devDependencies":{"@babel/cli":"^7.2.3","@babel/core":"^7.3.4","@babel/plugin-proposal-unicode-property-regex":"^7.2.0","@babel/preset-env":"^7.3.4","mocha":"^6.0.2","regexgen":"^1.3.0","unicode-12.0.0":"^0.7.9"},"gitHead":"a9f2e514523d4c0931974aff5059052da10c52c5","_id":"emoji-regex@8.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.14.1","dist":{"integrity":"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==","shasum":"e818fd69ce5ccfcb404594f842963bf53164cc37","tarball":"http://localhost:4260/emoji-regex/emoji-regex-8.0.0.tgz","fileCount":8,"unpackedSize":48255,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcfsbPCRA9TVsSAnZWagAAr8oP/1XbIqEdVhX0sTGbaxsq\n2McAMLM6oAIrjkBXrNdMgP9fX5kEUfAE45JTbpZU6RprIM8GnhPAyJKauwmj\nIUFKvwSMdwxUPOsYljPiWYRrjsqn1rDENI/q9vwISwOJuqTg/h+Y6V5PQj8b\nQbSnzFDkuDlAgmp4BPPtNFZdpSQNtaylpC08GkKZneQXfCuV2uOB3PTTelIV\nYnANLh09gEmrKeCEKp2WYhc1wANK1Bae04GEr+8tsoKoDDhiMktEzhuhCs/8\nvl9pQPa2xuNa3SbZF3bZtyiuF8CJUJin9R5sooqjBOHKw58taxfu5A5GwGNx\n9Uss9ysWTfuKKRJTmSG5OaRF49/bmIXPSpt4uwIywFtaWCdPgfeOorBUHeun\n1v4EhksSXggKIW1i1KbNQT6b0OIqEV7GQI5XWWlxhZ5vSFXSjTtasLyf/NtY\nJVOBlb8+fGFygQvzb1QjVDuKtEnnILTGbCVDIYx8yDiTW7z2Qt7Id3Sp+Whr\naRHjVE1mSB3tQrAyBvIw3650stwxMnS++c+qJbCaR/90JKahD3vM40Zt6aAO\nn31zq6N00oUefhd+2YwpUbmDqWQiROZCBKbRcYB1gDiIcu9PaenCeJkvgNId\nVoB6Mb3DYZggjjQcOGtdcS2ZcYaY2UexGuItbYqoMTvdmIcWqjEMq+oOaAjw\n/TqM\r\n=NmDr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC+waQdufSheUTEjvna3EaQZWs+5GUI/0/r9f5VSiZIAAiEA9mR+WzssFvsrqZPJ7zzRTzWZRyOxn1ZaJlSRNglwMlk="}]},"directories":{},"_hasShrinkwrap":false},"9.2.2":{"name":"emoji-regex","version":"9.2.2","description":"A regular expression to match all Emoji-only symbols as per the Unicode Standard.","main":"index.js","types":"index.d.ts","license":"MIT","author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"repository":{"type":"git","url":"git+https://github.com/mathiasbynens/emoji-regex.git"},"bugs":{"url":"https://github.com/mathiasbynens/emoji-regex/issues"},"scripts":{"build":"rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src es2015_types -D -d ./es2015; node script/inject-sequences.js","test":"mocha","test:watch":"npm run test -- --watch"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/plugin-proposal-unicode-property-regex":"^7.4.4","@babel/preset-env":"^7.4.4","@unicode/unicode-13.0.0":"^1.0.3","mocha":"^6.1.4","regexgen":"^1.3.0"},"gitHead":"0ffa466d7ab65af304d03dddd3a92a2d8268e7ce","_id":"emoji-regex@9.2.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==","shasum":"840c8803b0d8047f4ff0cf963176b32d4ef3ed72","tarball":"http://localhost:4260/emoji-regex/emoji-regex-9.2.2.tgz","fileCount":15,"unpackedSize":97916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPhpBCRA9TVsSAnZWagAA1/YQAJ00Flm0hn1THHoKTG0t\nylutoznvVmXBkTi8RRd7sUoXWfWYTTYYd0kZy1sFqlBdqYSvafkt5gMvednF\nnbhYuFyYM+xhVaLJNiWspc2uMuUHwlivQYrCqH4Sak3YPzhk0hBuj5sgAk4U\nYcGYf4gKOVp/jwcmXVZWWFrn+Rm07/OHZzhIsBnWzBh99UWzFwFom/nGaoCe\nVZxx2OOrWmWFNVDKtubMnJADaHug7oo0o0S4YyMHQU6Rn69flvafdA5f076m\nnn9NVUO/h8He4xrLXoAnUybphaSNJPnFENqK1gN26e5nOzzsAxwRY5DKG9zA\n7czAXBGNAGYkjV8wOC+suYGgwvmfnKqf8h5Teerdo9Gcycn7sHIdsU+qAV2D\n+KqNJ8ql6nI0xrIf8lYtmxZjYjOPhUaKEer/sfxZUUqNzO0LdAkBOpK7Rga3\nFQyB0Pvg3VEFjmL78eDj3/D5GY1VYXogFXJY2lWrd02kPM6IlMjBQH9X9jx6\nwq84cFdGvDmW37dAtJdfuplkPNDd4I3Ivv8ASBphxqPjbSPCgn2vMueKIwHv\nEf8h8QUy9y/qo1QrVjo7kHrdFcjx73zgLZMElrlN9ax1KsgPxXTUmTZoN0K6\ntkC5T6h2LAnyxyi+x2/8XMnFTuzG20ExspSMVWBI4kHQtDWjua9YlCbIccgi\n81rc\r\n=B/lZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHcrGCbwiwzFWONg4AI9JKPLHIGCCljRRyA4x8QCMhWDAiEA22sFAR+MgR75takXx5jHHB1cLnhXUYIoWF5xMrMD5ds="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# emoji-regex [![Build status](https://github.com/mathiasbynens/emoji-regex/actions/workflows/main.yml/badge.svg)](https://github.com/mathiasbynens/emoji-regex/actions/workflows/main.yml) [![emoji-regex on npm](https://img.shields.io/npm/v/emoji-regex)](https://www.npmjs.com/package/emoji-regex)\n\n_emoji-regex_ offers a regular expression to match all emoji symbols and sequences (including textual representations of emoji) as per the Unicode Standard. It’s based on [_emoji-test-regex-pattern_](https://github.com/mathiasbynens/emoji-test-regex-pattern), which generates (at build time) the regular expression pattern based on the Unicode Standard. As a result, _emoji-regex_ can easily be updated whenever new emoji are added to Unicode.\n\n## Installation\n\nVia [npm](https://www.npmjs.com/):\n\n```bash\nnpm install emoji-regex\n```\n\nIn [Node.js](https://nodejs.org/):\n\n```js\nconst emojiRegex = require('emoji-regex');\n// Note: because the regular expression has the global flag set, this module\n// exports a function that returns the regex rather than exporting the regular\n// expression itself, to make it impossible to (accidentally) mutate the\n// original regular expression.\n\nconst text = `\n\\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation)\n\\u{2194}\\u{FE0F}: ↔️ default text presentation character rendered as emoji\n\\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base)\n\\u{1F469}\\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier\n`;\n\nconst regex = emojiRegex();\nfor (const match of text.matchAll(regex)) {\n const emoji = match[0];\n console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`);\n}\n```\n\nConsole output:\n\n```\nMatched sequence ⌚ — code points: 1\nMatched sequence ⌚ — code points: 1\nMatched sequence ↔️ — code points: 2\nMatched sequence ↔️ — code points: 2\nMatched sequence 👩 — code points: 1\nMatched sequence 👩 — code points: 1\nMatched sequence 👩🏿 — code points: 2\nMatched sequence 👩🏿 — code points: 2\n```\n\n## For maintainers\n\n### How to update emoji-regex after new Unicode Standard releases\n\n1. [Update _emoji-test-regex-pattern_ as described in its repository](https://github.com/mathiasbynens/emoji-test-regex-pattern#how-to-update-emoji-test-regex-pattern-after-new-uts51-releases).\n\n1. Bump the _emoji-test-regex-pattern_ dependency to the latest version.\n\n1. Update the Unicode data dependency in `package.json` by running the following commands:\n\n ```sh\n # Example: updating from Unicode v13 to Unicode v14.\n npm uninstall @unicode/unicode-13.0.0\n npm install @unicode/unicode-14.0.0 --save-dev\n ````\n\n 1. Generate the new output:\n\n ```sh\n npm run build\n ```\n\n 1. Verify that tests still pass:\n\n ```sh\n npm test\n ```\n\n### How to publish a new release\n\n1. On the `main` branch, bump the emoji-regex version number in `package.json`:\n\n ```sh\n npm version patch -m 'Release v%s'\n ```\n\n Instead of `patch`, use `minor` or `major` [as needed](https://semver.org/).\n\n Note that this produces a Git commit + tag.\n\n1. Push the release commit and tag:\n\n ```sh\n git push && git push --tags\n ```\n\n Our CI then automatically publishes the new release to npm.\n\n## Author\n\n| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|\n| [Mathias Bynens](https://mathiasbynens.be/) |\n\n## License\n\n_emoji-regex_ is available under the [MIT](https://mths.be/mit) license.\n","homepage":"https://mths.be/emoji-regex","repository":{"type":"git","url":"git+https://github.com/mathiasbynens/emoji-regex.git"},"author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"bugs":{"url":"https://github.com/mathiasbynens/emoji-regex/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "emoji-regex",
+ "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
+ "dist-tags": {
+ "latest": "9.2.2"
+ },
+ "versions": {
+ "8.0.0": {
+ "name": "emoji-regex",
+ "version": "8.0.0",
+ "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "license": "MIT",
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mathiasbynens/emoji-regex.git"
+ },
+ "bugs": {
+ "url": "https://github.com/mathiasbynens/emoji-regex/issues"
+ },
+ "scripts": {
+ "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src -d ./es2015; node script/inject-sequences.js",
+ "test": "mocha",
+ "test:watch": "npm run test -- --watch"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.2.3",
+ "@babel/core": "^7.3.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
+ "@babel/preset-env": "^7.3.4",
+ "mocha": "^6.0.2",
+ "regexgen": "^1.3.0",
+ "unicode-12.0.0": "^0.7.9"
+ },
+ "gitHead": "a9f2e514523d4c0931974aff5059052da10c52c5",
+ "_id": "emoji-regex@8.0.0",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "10.14.1",
+ "dist": {
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "shasum": "e818fd69ce5ccfcb404594f842963bf53164cc37",
+ "tarball": "http://localhost:4260/emoji-regex/emoji-regex-8.0.0.tgz",
+ "fileCount": 8,
+ "unpackedSize": 48255
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "9.2.2": {
+ "name": "emoji-regex",
+ "version": "9.2.2",
+ "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "license": "MIT",
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mathiasbynens/emoji-regex.git"
+ },
+ "bugs": {
+ "url": "https://github.com/mathiasbynens/emoji-regex/issues"
+ },
+ "scripts": {
+ "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src es2015_types -D -d ./es2015; node script/inject-sequences.js",
+ "test": "mocha",
+ "test:watch": "npm run test -- --watch"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.4.4",
+ "@babel/core": "^7.4.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/preset-env": "^7.4.4",
+ "@unicode/unicode-13.0.0": "^1.0.3",
+ "mocha": "^6.1.4",
+ "regexgen": "^1.3.0"
+ },
+ "gitHead": "0ffa466d7ab65af304d03dddd3a92a2d8268e7ce",
+ "_id": "emoji-regex@9.2.2",
+ "_nodeVersion": "14.15.5",
+ "_npmVersion": "6.14.11",
+ "dist": {
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "shasum": "840c8803b0d8047f4ff0cf963176b32d4ef3ed72",
+ "tarball": "http://localhost:4260/emoji-regex/emoji-regex-9.2.2.tgz",
+ "fileCount": 15,
+ "unpackedSize": 97916
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://mths.be/emoji-regex",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mathiasbynens/emoji-regex.git"
+ },
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "bugs": {
+ "url": "https://github.com/mathiasbynens/emoji-regex/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/encoding/registry.json b/tests/registry/npm/encoding/registry.json
index 8cded6439..59ac150db 100644
--- a/tests/registry/npm/encoding/registry.json
+++ b/tests/registry/npm/encoding/registry.json
@@ -1 +1,61 @@
-{"name":"encoding","description":"Convert encodings, uses iconv-lite","dist-tags":{"latest":"0.1.13"},"versions":{"0.1.13":{"name":"encoding","version":"0.1.13","description":"Convert encodings, uses iconv-lite","main":"lib/encoding.js","scripts":{"test":"nodeunit test"},"repository":{"type":"git","url":"git+https://github.com/andris9/encoding.git"},"author":{"name":"Andris Reinman"},"license":"MIT","dependencies":{"iconv-lite":"^0.6.2"},"devDependencies":{"nodeunit":"0.11.3"},"gitHead":"a7554ca9083bab4847705d562d02f0924271cbaa","bugs":{"url":"https://github.com/andris9/encoding/issues"},"_id":"encoding@0.1.13","_nodeVersion":"14.5.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==","shasum":"56574afdd791f54a8e9b2785c0582a2d26210fa9","tarball":"http://localhost:4260/encoding/encoding-0.1.13.tgz","fileCount":7,"unpackedSize":7123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCBJzCRA9TVsSAnZWagAANNcP/i1TY309HKXYl74I0RJz\noqFuwSxgoWXNnJ3ugBuNbz7U9DjcEhbbaYEHuc26lwkYV0HMiDZGgVDKaZzy\nWPxU6cO+Cm1/Dy9UrevCe78O34+Koaymhi69i9MWHlcAIfbCcp/qcm2EOdeI\nJ2usvmzGXxnwWQQVb+Sw7H9/eQFuYUlSXAbE/1kSDZyDq5McCdMBySEIE0fa\niS+dQBVdLJl2sFwL7DgoT+QWt2v53svwJbR1ZQbfySaLJVVMvoFrs21pt3Td\nlwJ8j1lz2ADxI/9WX0faYxKCJNtVDXDpnBA4hnYzDPFbmX8skKXLabus2mUZ\nO9Mh7zTRzvIOm0c8meKLq/RVIYODOX/eEvegvJcdNTpCd3K/GWOqF/28+vCH\nD45K6J/vTcwku1cZdX+MO1GBX5A8iV1JISKzjXyycjV50PfB8dZ2YanKQGjA\nmkmYzBPssaA+/dVtrdlpl2L03sUae9YUPI8x2dwHstZ+BlMZ/or9/EIH5rOj\nCxqc0KeUDsMD/mtzjCeWdxA4POamYNMJsU0ewluzKYZrSH9L1yccCULVUuJn\nh1XL2H8EOABR7A0PnZhGfIsL2K+TpT47ieOHragZ2c7LnO9kVfKetdAhoR4L\nQVNHr6zLnA5scWfk68sBNXgWKJvdPnCz4vZLQhDzhfx5PAL/OSHm7WHGOhH0\nsLJK\r\n=Xp+Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjEJ8zoQO4Tth6hxEHL+G4uUHRf5vm6GQ6WPo4LxbWXwIgJqM+w7XPr2CJSxOqTYe4/A6Xo4a64Oius0PaOi/0M08="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# Encoding\n\n**encoding** is a simple wrapper around [iconv-lite](https://github.com/ashtuchkin/iconv-lite/) to convert strings from one encoding to another.\n\n[![Build Status](https://secure.travis-ci.org/andris9/encoding.svg)](http://travis-ci.org/andris9/Nodemailer)\n[![npm version](https://badge.fury.io/js/encoding.svg)](http://badge.fury.io/js/encoding)\n\nInitially _encoding_ was a wrapper around _node-iconv_ (main) and _iconv-lite_ (fallback) and was used as the encoding layer for Nodemailer/mailparser. Somehow it also ended up as a dependency for a bunch of other project, none of these actually using _node-iconv_. The loading mechanics caused issues for front-end projects and Nodemailer/malparser had moved on, so _node-iconv_ was removed.\n\n## Install\n\nInstall through npm\n\n npm install encoding\n\n## Usage\n\nRequire the module\n\n var encoding = require(\"encoding\");\n\nConvert with encoding.convert()\n\n var resultBuffer = encoding.convert(text, toCharset, fromCharset);\n\nWhere\n\n- **text** is either a Buffer or a String to be converted\n- **toCharset** is the characterset to convert the string\n- **fromCharset** (_optional_, defaults to UTF-8) is the source charset\n\nOutput of the conversion is always a Buffer object.\n\nExample\n\n var result = encoding.convert(\"ÕÄÖÜ\", \"Latin_1\");\n console.log(result); //<Buffer d5 c4 d6 dc>\n\n## License\n\n**MIT**\n","author":{"name":"Andris Reinman"},"repository":{"type":"git","url":"git+https://github.com/andris9/encoding.git"},"homepage":"https://github.com/andris9/encoding#readme","bugs":{"url":"https://github.com/andris9/encoding/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "encoding",
+ "description": "Convert encodings, uses iconv-lite",
+ "dist-tags": {
+ "latest": "0.1.13"
+ },
+ "versions": {
+ "0.1.13": {
+ "name": "encoding",
+ "version": "0.1.13",
+ "description": "Convert encodings, uses iconv-lite",
+ "main": "lib/encoding.js",
+ "scripts": {
+ "test": "nodeunit test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/andris9/encoding.git"
+ },
+ "author": {
+ "name": "Andris Reinman"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ },
+ "devDependencies": {
+ "nodeunit": "0.11.3"
+ },
+ "gitHead": "a7554ca9083bab4847705d562d02f0924271cbaa",
+ "bugs": {
+ "url": "https://github.com/andris9/encoding/issues"
+ },
+ "_id": "encoding@0.1.13",
+ "_nodeVersion": "14.5.0",
+ "_npmVersion": "6.14.5",
+ "dist": {
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "shasum": "56574afdd791f54a8e9b2785c0582a2d26210fa9",
+ "tarball": "http://localhost:4260/encoding/encoding-0.1.13.tgz",
+ "fileCount": 7,
+ "unpackedSize": 7123
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Andris Reinman"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/andris9/encoding.git"
+ },
+ "homepage": "https://github.com/andris9/encoding#readme",
+ "bugs": {
+ "url": "https://github.com/andris9/encoding/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/env-paths/registry.json b/tests/registry/npm/env-paths/registry.json
index 6df494c69..e60ab9702 100644
--- a/tests/registry/npm/env-paths/registry.json
+++ b/tests/registry/npm/env-paths/registry.json
@@ -1 +1,66 @@
-{"name":"env-paths","description":"Get paths for storing things like data, config, cache, etc","dist-tags":{"latest":"2.2.1"},"versions":{"2.2.1":{"name":"env-paths","version":"2.2.1","description":"Get paths for storing things like data, config, cache, etc","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/env-paths.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.1","xo":"^0.24.0"},"gitHead":"62d4ec8cd42f1a419e00856fab949ca8286773f6","bugs":{"url":"https://github.com/sindresorhus/env-paths/issues"},"_id":"env-paths@2.2.1","_nodeVersion":"14.16.0","_npmVersion":"6.14.10","dist":{"integrity":"sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==","shasum":"420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2","tarball":"http://localhost:4260/env-paths/env-paths-2.2.1.tgz","fileCount":5,"unpackedSize":10163,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgRhkLCRA9TVsSAnZWagAAzIQP/2Nmbs5q/06VvU/UEGn8\nZxcOoMA7tGLWbSvcUSAIfmtu74DSqoEyMJJLKLsAKG6CeVxf/wvv+IW98luL\nfLSPrIcUbEKEECKnRvgC1/lJx0H7x8daWFhEn5V/qT3/Tq+YQxxxxV6eBgE2\nSg2Cm0YFYj+4fv13Et/N0jr5lX5RjUiBRwYKisM0X/wTntBmrmWuJ+r3G9yn\nfpButg2CG8FhqS8PIvxFMjpfl5Kzx+4fskZlbzWXjl437YVMnOddVfE4d+4b\ncsl9IiRVfRQun7Mma2krUdsyv7/Cv7MeJcktjgUjOK1IfSsR6DyAw4oJtMMS\nbfOYjv6tRPZA4UPO/c+ZSNMkIvcueZLH+1Pufv2tQ99CgY5ZYz0zWOn7SOQ9\n1NA3URMsoeHs1UDbtQmk5ZPHV3/GuXUBDBAwD5Y1gPnUP44hdsguV6VONJEG\nFjsLltGVjSDdvDgxTaSorSKNk3uqiLxSquX/D0qtMy71mcqJ2dIuYhcpgsFE\n/9w0sQkCKDlaCBCr4dQ9ziWnCr38Jut+rWKQkSXYsWdlFnhBYZlPDYhEl2Bb\ng28SPiHvPLoL7soXHz372VZpl36Kc8kDQHOpiz7UACKqYJifgboyC3+o/LzE\nWb6yHm9Tg04MUrq2MisG3VlCZjc5DuHDSwNFpaCUyxv/NX5n6mEDOxP+FW9e\nJoEn\r\n=qhG9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC58s8SpFZdII3DGJV28/aC5XN31PJjPaBnax5dqZPg3AIgC8/GVwDk0mrXqqsjqNe7O6gSNDqVOFt5XJ/bQPVB6lI="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# env-paths\n\n> Get paths for storing things like data, config, cache, etc\n\nUses the correct OS-specific paths. Most developers get this wrong.\n\n## Install\n\n```\n$ npm install env-paths\n```\n\n## Usage\n\n```js\nimport envPaths from 'env-paths';\n\nconst paths = envPaths('MyApp');\n\npaths.data;\n//=> '/home/sindresorhus/.local/share/MyApp-nodejs'\n\npaths.config\n//=> '/home/sindresorhus/.config/MyApp-nodejs'\n```\n\n## API\n\n### paths = envPaths(name, options?)\n\nNote: It only generates the path strings. It doesn't create the directories for you. You could use [`make-dir`](https://github.com/sindresorhus/make-dir) to create the directories.\n\n#### name\n\nType: `string`\n\nThe name of your project. Used to generate the paths.\n\n#### options\n\nType: `object`\n\n##### suffix\n\nType: `string`\\\nDefault: `'nodejs'`\n\n**Don't use this option unless you really have to!**\n\nSuffix appended to the project name to avoid name conflicts with native\napps. Pass an empty string to disable it.\n\n### paths.data\n\nDirectory for data files.\n\nExample locations (with the default `nodejs` [suffix](#suffix)):\n\n- macOS: `~/Library/Application Support/MyApp-nodejs`\n- Windows: `%LOCALAPPDATA%\\MyApp-nodejs\\Data` (for example, `C:\\Users\\USERNAME\\AppData\\Local\\MyApp-nodejs\\Data`)\n- Linux: `~/.local/share/MyApp-nodejs` (or `$XDG_DATA_HOME/MyApp-nodejs`)\n\n### paths.config\n\nDirectory for config files.\n\nExample locations (with the default `nodejs` [suffix](#suffix)):\n\n- macOS: `~/Library/Preferences/MyApp-nodejs`\n- Windows: `%APPDATA%\\MyApp-nodejs\\Config` (for example, `C:\\Users\\USERNAME\\AppData\\Roaming\\MyApp-nodejs\\Config`)\n- Linux: `~/.config/MyApp-nodejs` (or `$XDG_CONFIG_HOME/MyApp-nodejs`)\n\n### paths.cache\n\nDirectory for non-essential data files.\n\nExample locations (with the default `nodejs` [suffix](#suffix)):\n\n- macOS: `~/Library/Caches/MyApp-nodejs`\n- Windows: `%LOCALAPPDATA%\\MyApp-nodejs\\Cache` (for example, `C:\\Users\\USERNAME\\AppData\\Local\\MyApp-nodejs\\Cache`)\n- Linux: `~/.cache/MyApp-nodejs` (or `$XDG_CACHE_HOME/MyApp-nodejs`)\n\n### paths.log\n\nDirectory for log files.\n\nExample locations (with the default `nodejs` [suffix](#suffix)):\n\n- macOS: `~/Library/Logs/MyApp-nodejs`\n- Windows: `%LOCALAPPDATA%\\MyApp-nodejs\\Log` (for example, `C:\\Users\\USERNAME\\AppData\\Local\\MyApp-nodejs\\Log`)\n- Linux: `~/.local/state/MyApp-nodejs` (or `$XDG_STATE_HOME/MyApp-nodejs`)\n\n### paths.temp\n\nDirectory for temporary files.\n\nExample locations (with the default `nodejs` [suffix](#suffix)):\n\n- macOS: `/var/folders/jf/f2twvvvs5jl_m49tf034ffpw0000gn/T/MyApp-nodejs`\n- Windows: `%LOCALAPPDATA%\\Temp\\MyApp-nodejs` (for example, `C:\\Users\\USERNAME\\AppData\\Local\\Temp\\MyApp-nodejs`)\n- Linux: `/tmp/USERNAME/MyApp-nodejs`\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-env-paths?utm_source=npm-env-paths&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/env-paths#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/env-paths.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/env-paths/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "env-paths",
+ "description": "Get paths for storing things like data, config, cache, etc",
+ "dist-tags": {
+ "latest": "2.2.1"
+ },
+ "versions": {
+ "2.2.1": {
+ "name": "env-paths",
+ "version": "2.2.1",
+ "description": "Get paths for storing things like data, config, cache, etc",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/env-paths.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.1",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "62d4ec8cd42f1a419e00856fab949ca8286773f6",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/env-paths/issues"
+ },
+ "_id": "env-paths@2.2.1",
+ "_nodeVersion": "14.16.0",
+ "_npmVersion": "6.14.10",
+ "dist": {
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "shasum": "420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2",
+ "tarball": "http://localhost:4260/env-paths/env-paths-2.2.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 10163
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/env-paths#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/env-paths.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/env-paths/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/err-code/registry.json b/tests/registry/npm/err-code/registry.json
index 5af1aee65..a46e9bf78 100644
--- a/tests/registry/npm/err-code/registry.json
+++ b/tests/registry/npm/err-code/registry.json
@@ -1 +1,68 @@
-{"name":"err-code","description":"Create an error with a code","dist-tags":{"latest":"2.0.3"},"versions":{"2.0.3":{"name":"err-code","version":"2.0.3","description":"Create an error with a code","main":"index.js","scripts":{"lint":"eslint '{*.js,test/**/*.js}' --ignore-pattern *.umd.js","test":"mocha --bail","browserify":"browserify -s err-code index.js > index.umd.js"},"bugs":{"url":"https://github.com/IndigoUnited/js-err-code/issues/"},"repository":{"type":"git","url":"git://github.com/IndigoUnited/js-err-code.git"},"author":{"name":"IndigoUnited","email":"hello@indigounited.com","url":"http://indigounited.com"},"license":"MIT","devDependencies":{"@satazor/eslint-config":"^3.0.0","browserify":"^16.5.1","eslint":"^7.2.0","expect.js":"^0.3.1","mocha":"^8.0.1"},"gitHead":"92511d41a6a926c94c9d11493404867b1e92a77a","_id":"err-code@2.0.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.1","dist":{"integrity":"sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==","shasum":"23c2f3b756ffdfc608d30e27c9a941024807e7f9","tarball":"http://localhost:4260/err-code/err-code-2.0.3.tgz","fileCount":10,"unpackedSize":12280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe61mnCRA9TVsSAnZWagAAZukP/24MThzdq9aW1ODioe6b\nAaOi1DN5e8T5yCr5Yb3I8qlfpDk6K7+IWZF/kt/QuLJWJmHUVsVPvyhGIiK5\n4D/EqLaT3huH2EshVpK64vLHW6wC89oJZIM9glgUe8cHa5Baxkf0f0tDwy/C\nXJRuki3MRpZyRsDUf2eaIjFBRw0VsfFYLDvW4MfuiCpiVlrv1QPjcGiJSJyC\nqzTfCltj11+/rjgP2ULYodKzhO9FdTlXL3L6mdlm8gSrh+fXow5POVpoVPCQ\n9dGbqiY7rJ+dwlDXrhghhABJQjsdvtsUljJ4jxbo/bNMn9bjmWKdYjtMGfCC\nDAwh/YqBUXLVt9BQdpNY9gSLcahW609vtXvXY05cfI/TQf/c5qkQWtf6xiOv\n1Md3g41jbTXadXdoTgslRnNA9WPZipu2mJKrtwhit+3uzriX3IBi5lizpHrF\ngOS6Qlp6SRtDHOZ3hZ8dlkIRpOg0W9Zitv/32sHtsZKy+bhluOF5JaaYcM6J\nAouzYXLJj+CkfV+d5LMZqYgYSeI6lW77Y3ehf8aHGBea4rl15wQ+hVkysco6\nWesWSoi2l32CIwvxxAYDwwr7+EhTcUFqpxyuhioSOEfnNYMWlsGe34XicURE\nqXQPd+Bd/8iyimo3qAq5bhrcf0BidHz3w32Uo9KnIRAkA/PkTZ9igpo0uvs6\nr3bY\r\n=aGKM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICRiUUK/TTWx/VYm23/tdIENOaASLrdcGmkJxquGw5mHAiEAvZOTRTe4/VNtWPtA9tPX9/BJT78eBLBMHgVs3RFgC3I="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# err-code\n\n[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]\n\n[npm-url]:https://npmjs.org/package/err-code\n[downloads-image]:http://img.shields.io/npm/dm/err-code.svg\n[npm-image]:http://img.shields.io/npm/v/err-code.svg\n[travis-url]:https://travis-ci.org/IndigoUnited/js-err-code\n[travis-image]:http://img.shields.io/travis/IndigoUnited/js-err-code/master.svg\n[david-dm-url]:https://david-dm.org/IndigoUnited/js-err-code\n[david-dm-image]:https://img.shields.io/david/IndigoUnited/js-err-code.svg\n[david-dm-dev-url]:https://david-dm.org/IndigoUnited/js-err-code?type=dev\n[david-dm-dev-image]:https://img.shields.io/david/dev/IndigoUnited/js-err-code.svg\n[greenkeeper-image]:https://badges.greenkeeper.io/IndigoUnited/js-err-code.svg\n[greenkeeper-url]:https://greenkeeper.io/\n\nCreate new error instances with a code and additional properties.\n\n\n## Installation\n\n```console\n$ npm install err-code\n// or\n$ bower install err-code\n```\n\nThe browser file is named index.umd.js which supports CommonJS, AMD and globals (errCode).\n\n\n## Why\n\nI find myself doing this repeatedly:\n\n```js\nvar err = new Error('My message');\nerr.code = 'SOMECODE';\nerr.detail = 'Additional information about the error';\nthrow err;\n```\n\n\n## Usage\n\nSimple usage.\n\n```js\nvar errcode = require('err-code');\n\n// fill error with message + code\nthrow errcode(new Error('My message'), 'ESOMECODE');\n// fill error with message + code + props\nthrow errcode(new Error('My message'), 'ESOMECODE', { detail: 'Additional information about the error' });\n// fill error with message + props\nthrow errcode(new Error('My message'), { detail: 'Additional information about the error' });\n```\n\n## Pre-existing fields\n\nIf the passed `Error` already has a `.code` field, or fields specified in the third argument to `errcode` they will be overwritten, unless the fields are read only or otherwise throw during assignment in which case a new object will be created that shares a prototype chain with the original `Error`. The `.stack` and `.message` properties will be carried over from the original error and `.code` or any passed properties will be set on it.\n\n\n## Tests\n\n`$ npm test`\n\n\n## License\n\nReleased under the [MIT License](http://www.opensource.org/licenses/mit-license.php).\n","homepage":"https://github.com/IndigoUnited/js-err-code#readme","repository":{"type":"git","url":"git://github.com/IndigoUnited/js-err-code.git"},"author":{"name":"IndigoUnited","email":"hello@indigounited.com","url":"http://indigounited.com"},"bugs":{"url":"https://github.com/IndigoUnited/js-err-code/issues/"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "err-code",
+ "description": "Create an error with a code",
+ "dist-tags": {
+ "latest": "2.0.3"
+ },
+ "versions": {
+ "2.0.3": {
+ "name": "err-code",
+ "version": "2.0.3",
+ "description": "Create an error with a code",
+ "main": "index.js",
+ "scripts": {
+ "lint": "eslint '{*.js,test/**/*.js}' --ignore-pattern *.umd.js",
+ "test": "mocha --bail",
+ "browserify": "browserify -s err-code index.js > index.umd.js"
+ },
+ "bugs": {
+ "url": "https://github.com/IndigoUnited/js-err-code/issues/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/IndigoUnited/js-err-code.git"
+ },
+ "author": {
+ "name": "IndigoUnited",
+ "email": "hello@indigounited.com",
+ "url": "http://indigounited.com"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@satazor/eslint-config": "^3.0.0",
+ "browserify": "^16.5.1",
+ "eslint": "^7.2.0",
+ "expect.js": "^0.3.1",
+ "mocha": "^8.0.1"
+ },
+ "gitHead": "92511d41a6a926c94c9d11493404867b1e92a77a",
+ "_id": "err-code@2.0.3",
+ "_nodeVersion": "12.16.1",
+ "_npmVersion": "6.14.1",
+ "dist": {
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "shasum": "23c2f3b756ffdfc608d30e27c9a941024807e7f9",
+ "tarball": "http://localhost:4260/err-code/err-code-2.0.3.tgz",
+ "fileCount": 10,
+ "unpackedSize": 12280
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/IndigoUnited/js-err-code#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/IndigoUnited/js-err-code.git"
+ },
+ "author": {
+ "name": "IndigoUnited",
+ "email": "hello@indigounited.com",
+ "url": "http://indigounited.com"
+ },
+ "bugs": {
+ "url": "https://github.com/IndigoUnited/js-err-code/issues/"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/escalade/registry.json b/tests/registry/npm/escalade/registry.json
index f2104f34d..98d1d649a 100644
--- a/tests/registry/npm/escalade/registry.json
+++ b/tests/registry/npm/escalade/registry.json
@@ -1 +1,28 @@
-{"name":"escalade","dist-tags":{"latest":"3.1.1"},"versions":{"3.1.1":{"name":"escalade","version":"3.1.1","devDependencies":{"bundt":"1.1.1","esm":"3.2.25","uvu":"0.3.3"},"dist":{"integrity":"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==","shasum":"d8cfdc7000965c5a0174b4a82eaa5c0552742e40","tarball":"http://localhost:4260/escalade/escalade-3.1.1.tgz","fileCount":9,"unpackedSize":11434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhUNACRA9TVsSAnZWagAAxgUP/A8GPqV1Tm+m3shzqfBA\nHUKtBmVn7xCHFAm8sw1aHCPQHoV3cWZUR+zVJyXnVXg5w8Mw93733m7H3DSO\njol+uLlCeVTtgFVqgw6f5puC8+6vPaTwQav612Tk6uBc4RUL00pQf/Td9k0P\nyVpSudXUT2RnyRWOkJ7T9/kNS3tHsyl+AVhH2kO+QUqUe4N5go7D8juWO4H1\n/Jia3Mv7Eh8Ex9onDWavMVqudkWvioWkVQrrCqa+WHzEcp9thnd7iFhkoqM/\nVYDlEk41E+EDhOOvtRwhvQtklQJujBOPpIDsYNEmyc0w+HpNDkYAklWlP/Y6\nNB3jSh44XUvCF4Iq0lNMeNOi+dUFLyMQd8bxXbDMzVispLmmJTr043K9ZB/c\nChy0OV28fWpWA/iz5/5D9Al8tv3VUHSI0apRHkUS7hH18zosLfIOe1lG3XHm\n99pIdlPABgrRek4zSl9SVL3/kr5u8CCMYiqH10OBMm/3agFC4Ia0VU1k7Zm1\n6uvAbbCUhdLpUFbJyKjQJIloSWcyrWCDzQ7yPYB/eQMnBqWF51/nR0RuSBpQ\nRbRkhZd4g9Ndyot41ImqRz9FcOsOzEoJZumsav97JpDV0NXXP3ZtJaLrwHJ8\n2bcGDm6KaxpA9BpLzeYaKyZ1XeYSjwpsPa1RSJp2piZTqSmh2ZzTxvmEQkmL\noD/u\r\n=S3nB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBqbSV18IHNszA9TZQJ/C4u+AQ934CWMh5jwYlBr7MeqAiBe/LnFmB8tCqdBdsOhtK9AvRboHFs/Ikpf6yzhxAjbyA=="}]},"engines":{"node":">=6"}}},"modified":"2022-05-01T11:56:42.212Z"}
+{
+ "name": "escalade",
+ "dist-tags": {
+ "latest": "3.1.1"
+ },
+ "versions": {
+ "3.1.1": {
+ "name": "escalade",
+ "version": "3.1.1",
+ "devDependencies": {
+ "bundt": "1.1.1",
+ "esm": "3.2.25",
+ "uvu": "0.3.3"
+ },
+ "dist": {
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "shasum": "d8cfdc7000965c5a0174b4a82eaa5c0552742e40",
+ "tarball": "http://localhost:4260/escalade/escalade-3.1.1.tgz",
+ "fileCount": 9,
+ "unpackedSize": 11434
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ },
+ "modified": "2022-05-01T11:56:42.212Z"
+}
diff --git a/tests/registry/npm/estree-walker/registry.json b/tests/registry/npm/estree-walker/registry.json
index b87095657..7ab971e50 100644
--- a/tests/registry/npm/estree-walker/registry.json
+++ b/tests/registry/npm/estree-walker/registry.json
@@ -1 +1,71 @@
-{"name":"estree-walker","description":"Traverse an ESTree-compliant AST","dist-tags":{"latest":"2.0.2"},"versions":{"2.0.2":{"name":"estree-walker","description":"Traverse an ESTree-compliant AST","version":"2.0.2","private":false,"author":{"name":"Rich Harris"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Rich-Harris/estree-walker.git"},"type":"commonjs","main":"./dist/umd/estree-walker.js","module":"./dist/esm/estree-walker.js","exports":{"require":"./dist/umd/estree-walker.js","import":"./dist/esm/estree-walker.js"},"types":"types/index.d.ts","scripts":{"prepublishOnly":"npm run build && npm test","build":"tsc && rollup -c","test":"uvu test"},"devDependencies":{"@types/estree":"0.0.42","rollup":"^2.10.9","typescript":"^3.7.5","uvu":"^0.5.1"},"gitHead":"3ac96d685ddedb1701009945d9911fa41d60b0ce","bugs":{"url":"https://github.com/Rich-Harris/estree-walker/issues"},"_id":"estree-walker@2.0.2","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==","shasum":"52f010178c2a4c117a7757cfe942adb7d2da4cac","tarball":"http://localhost:4260/estree-walker/estree-walker-2.0.2.tgz","fileCount":17,"unpackedSize":50243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfz7LfCRA9TVsSAnZWagAAIHEP/3W5C8KLN5INJg2Zrvn/\ns1sQstVkA8NVw1f006STezOgzzLmH1WilQ17juF0f5OzY5JN+N14NhOnaxfV\ndC/+wSKiQKtEzyIjM/odxE1V4TJo3O08JdyFW8wJRD+AdcHmojLpbit5uN8i\ncI/gJZQKN44q28AGEtwjy8aMS+iOsH24WuA9VLJ62h4DVsjQYkMttRPGRgtF\nKPGnWsw2Ng43TPJqHy9Iqrk6Y3ukmLfssimVn4W1Yxc16RCg1z43B9w3Nmk6\n49UKiiYEO6+EqFsk6trDzwwtJOL1yhnB7dkreU1TQBkEhCB7rmmKQJin/LXm\nKisS9T60V9mB4bRtaDQVLylLSz6u9y93VAfkndcv5byt4EQiF5E6AEO4Jo0v\n7hoOWF1qxxvLH9u4KBJXPBw9eL/2oXYWwCfc/+ycUKISwv8vWbyHRRZgUstu\nspZpCLTUfWvK2sA1O0iy3VquX+bCWwTSagY4b5ZkwHb1CW8ADwU+piWELfZL\nuwI7gdRZuNjFmQko3YlkY+3icLae9osHNM34TqmakoSYicGp+ERgzeJGXO/O\nX95LDk1bJctUs64H7xv+MNQ7z4xWL43jfcBzEu93KsH3nMTi3Qh8+uV7mrtN\nWzobbyTErFKhS14YsGIgr3SEPbGxq4vHSWCCNzHMqh1+PKc4CqxrhJlEHjiI\nAjXr\r\n=0OBC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHTgIR8c6jabJ8AGPJD/b/bX5gFjDsPTspyhM1CukcRCAiEA71mt+FxZ8yX3AoQFDOmB3QcQ4MFR3+dKqKIsSYhavb8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# estree-walker\n\nSimple utility for walking an [ESTree](https://github.com/estree/estree)-compliant AST, such as one generated by [acorn](https://github.com/marijnh/acorn).\n\n\n## Installation\n\n```bash\nnpm i estree-walker\n```\n\n\n## Usage\n\n```js\nvar walk = require('estree-walker').walk;\nvar acorn = require('acorn');\n\nast = acorn.parse(sourceCode, options); // https://github.com/acornjs/acorn\n\nwalk(ast, {\n enter(node, parent, prop, index) {\n // some code happens\n },\n leave(node, parent, prop, index) {\n // some code happens\n }\n});\n```\n\nInside the `enter` function, calling `this.skip()` will prevent the node's children being walked, or the `leave` function (which is optional) being called.\n\nCall `this.replace(new_node)` in either `enter` or `leave` to replace the current node with a new one.\n\nCall `this.remove()` in either `enter` or `leave` to remove the current node.\n\n## Why not use estraverse?\n\nThe ESTree spec is evolving to accommodate ES6/7. I've had a couple of experiences where [estraverse](https://github.com/estools/estraverse) was unable to handle an AST generated by recent versions of acorn, because it hard-codes visitor keys.\n\nestree-walker, by contrast, simply enumerates a node's properties to find child nodes (and child lists of nodes), and is therefore resistant to spec changes. It's also much smaller. (The performance, if you're wondering, is basically identical.)\n\nNone of which should be taken as criticism of estraverse, which has more features and has been battle-tested in many more situations, and for which I'm very grateful.\n\n\n## License\n\nMIT\n","author":{"name":"Rich Harris"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/Rich-Harris/estree-walker#readme","repository":{"type":"git","url":"git+https://github.com/Rich-Harris/estree-walker.git"},"bugs":{"url":"https://github.com/Rich-Harris/estree-walker/issues"}}
+{
+ "name": "estree-walker",
+ "description": "Traverse an ESTree-compliant AST",
+ "dist-tags": {
+ "latest": "2.0.2"
+ },
+ "versions": {
+ "2.0.2": {
+ "name": "estree-walker",
+ "description": "Traverse an ESTree-compliant AST",
+ "version": "2.0.2",
+ "private": false,
+ "author": {
+ "name": "Rich Harris"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Rich-Harris/estree-walker.git"
+ },
+ "type": "commonjs",
+ "main": "./dist/umd/estree-walker.js",
+ "module": "./dist/esm/estree-walker.js",
+ "exports": {
+ "require": "./dist/umd/estree-walker.js",
+ "import": "./dist/esm/estree-walker.js"
+ },
+ "types": "types/index.d.ts",
+ "scripts": {
+ "prepublishOnly": "npm run build && npm test",
+ "build": "tsc && rollup -c",
+ "test": "uvu test"
+ },
+ "devDependencies": {
+ "@types/estree": "0.0.42",
+ "rollup": "^2.10.9",
+ "typescript": "^3.7.5",
+ "uvu": "^0.5.1"
+ },
+ "gitHead": "3ac96d685ddedb1701009945d9911fa41d60b0ce",
+ "bugs": {
+ "url": "https://github.com/Rich-Harris/estree-walker/issues"
+ },
+ "_id": "estree-walker@2.0.2",
+ "_nodeVersion": "12.18.3",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "shasum": "52f010178c2a4c117a7757cfe942adb7d2da4cac",
+ "tarball": "http://localhost:4260/estree-walker/estree-walker-2.0.2.tgz",
+ "fileCount": 17,
+ "unpackedSize": 50243
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Rich Harris"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/Rich-Harris/estree-walker#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Rich-Harris/estree-walker.git"
+ },
+ "bugs": {
+ "url": "https://github.com/Rich-Harris/estree-walker/issues"
+ }
+}
diff --git a/tests/registry/npm/exponential-backoff/registry.json b/tests/registry/npm/exponential-backoff/registry.json
index e8423eacb..6ac5011df 100644
--- a/tests/registry/npm/exponential-backoff/registry.json
+++ b/tests/registry/npm/exponential-backoff/registry.json
@@ -1 +1,89 @@
-{"name":"exponential-backoff","description":"A utility that allows retrying a function with an exponential delay between attempts.","dist-tags":{"latest":"3.1.1"},"versions":{"3.1.1":{"name":"exponential-backoff","version":"3.1.1","author":{"name":"Sami Sayegh"},"license":"Apache-2.0","_id":"exponential-backoff@3.1.1","bugs":{"url":"https://github.com/coveo/exponential-backoff/issues"},"dist":{"shasum":"64ac7526fe341ab18a39016cd22c787d01e00bf6","tarball":"http://localhost:4260/exponential-backoff/exponential-backoff-3.1.1.tgz","fileCount":33,"integrity":"sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==","signatures":[{"sig":"MEUCIQDr+out+uvlHUvEC7/599hD5V9fPzhl76LLZb+Kf1CkXQIgH5Jm+BY6CLJ+e6gJGBSYkBgV6twi6/0GhGZ4rfGLMyc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj87BBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIzw/9FJrP3q6G51DaBfQcrCOf7AyZjBdmdzLJ0Qj0SUPxFccR4slF\r\n9D0gc2T6MwccogbNSRoNBPnw6pyPcg4DvMIClmCocbpbBxXrIg3muIOY40sZ\r\nlbnnkWlGS4LixGOq2hv+EubRc/ye7InUwPO9/vO3m1vnGjOnzjAF30r8kmkV\r\nX+WVfhTYbH1gc6vCicK7lr+ydDmodjiI2pOMxD2V5chuV71KrDgxexnnfUEw\r\n0D0b98LAuBP1nV1O5tdvypS3l8LmF6s8hopm9C22ZGhWWk0RG/H+GJD+hQms\r\nkTenT3UnHqkZwb6GFF0jtne6wBkvXLiNRoVb9WDNdh8uglR96P0SKbB+OEDC\r\nDTV12NCOPgl5GJN+xmX85ZVJb4HMxbrg/OZEnGoZZf40eJFU/GFnf4Ez9C3D\r\nkoEut5cK8+nwpsqlDv3i9pqYpxg2xXsO2Z+uQe7BmEepHq7MxTTLfMpiEdeU\r\nhazeD3U2MR0U20ERuB3e/EOcVLpBFJzeMLWv7ROv0vQbB4BAB3RVX8VNPNS9\r\nRSh1bA3PdhpcJEL1ItxuSmWbB19BFXJVaKpX8VunoqRzCq9hiJVad5ykOMzH\r\n9L6nm32F2Dt8j1H4MrB0H0vJkMSOV8MS4CSgONR6P7k20NtzH5KVAkb07fSS\r\nIxMeNnzfsVnLRP8rQd5fAAm3TYupq4KSjLM=\r\n=7l6+\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"testRegex":"\\.spec\\.ts$","transform":{"^.+\\.ts$":"ts-jest"},"moduleFileExtensions":["ts","js"]},"main":"dist/backoff.js","husky":{"hooks":{"pre-commit":"lint-staged"}},"types":"dist/backoff.d.ts","gitHead":"47b552aa6007a1320e851118d638a476cf765516","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch"},"repository":{"url":"git+https://github.com/coveo/exponential-backoff.git","type":"git"},"_npmVersion":"9.3.1","description":"A utility that allows retrying a function with an exponential delay between attempts.","directories":{},"lint-staged":{"*.{ts,json,md}":["prettier --write","git add"]},"_nodeVersion":"18.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^24.9.0","husky":"^3.0.9","ts-jest":"^24.1.0","prettier":"^1.18.2","typescript":"^3.6.4","@types/jest":"^24.0.18","@types/node":"^10.14.21","lint-staged":"^9.4.2"}}},"author":{"name":"Sami Sayegh"},"repository":{"url":"git+https://github.com/coveo/exponential-backoff.git","type":"git"},"license":"Apache-2.0","homepage":"https://github.com/coveo/exponential-backoff#readme","bugs":{"url":"https://github.com/coveo/exponential-backoff/issues"},"readme":"# exponential-backoff\n\nA utility that allows retrying a function with an exponential delay between attempts.\n\n## Installation\n\n```\nnpm i exponential-backoff\n```\n\n## Usage\n\nThe `backOff<T>` function takes a promise-returning function to retry, and an optional `BackOffOptions` object. It returns a `Promise<T>`.\n\n```ts\nfunction backOff<T>(\n request: () => Promise<T>,\n options?: BackOffOptions\n): Promise<T>;\n```\n\nHere is an example retrying a function that calls a hypothetical weather endpoint:\n\n```js\nimport { backOff } from \"exponential-backoff\";\n\nfunction getWeather() {\n return fetch(\"weather-endpoint\");\n}\n\nasync function main() {\n try {\n const response = await backOff(() => getWeather());\n // process response\n } catch (e) {\n // handle error\n }\n}\n\nmain();\n```\n\nMigrating across major versions? Here are our [breaking changes](https://github.com/coveo/exponential-backoff/tree/master/doc/migration-guide.md).\n\n### `BackOffOptions`\n\n- `delayFirstAttempt?: boolean`\n\n Decides whether the `startingDelay` should be applied before the first call. If `false`, the first call will occur without a delay.\n\n Default value is `false`.\n\n- `jitter?: JitterType | string`\n\n Decides whether a [jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/) should be applied to the delay. Possible values are `full` and `none`.\n\n Default value is `none`.\n\n- `maxDelay?: number`\n\n The maximum delay, in milliseconds, between two consecutive attempts.\n\n Default value is `Infinity`.\n\n- `numOfAttempts?: number`\n\n The maximum number of times to attempt the function.\n\n Default value is `10`.\n\n Minimum value is `1`.\n\n- `retry?: (e: any, attemptNumber: number) => boolean | Promise<boolean>`\n\n The `retry` function can be used to run logic after every failed attempt (e.g. logging a message, assessing the last error, etc.). It is called with the last error and the upcoming attempt number. Returning `true` will retry the function as long as the `numOfAttempts` has not been exceeded. Returning `false` will end the execution.\n\n Default value is a function that always returns `true`.\n\n- `startingDelay?: number`\n\n The delay, in milliseconds, before executing the function for the first time.\n\n Default value is `100` ms.\n\n- `timeMultiple?: number`\n\n The `startingDelay` is multiplied by the `timeMultiple` to increase the delay between reattempts.\n\n Default value is `2`.\n","readmeFilename":"README.md"}
+{
+ "name": "exponential-backoff",
+ "description": "A utility that allows retrying a function with an exponential delay between attempts.",
+ "dist-tags": {
+ "latest": "3.1.1"
+ },
+ "versions": {
+ "3.1.1": {
+ "name": "exponential-backoff",
+ "version": "3.1.1",
+ "author": {
+ "name": "Sami Sayegh"
+ },
+ "license": "Apache-2.0",
+ "_id": "exponential-backoff@3.1.1",
+ "bugs": {
+ "url": "https://github.com/coveo/exponential-backoff/issues"
+ },
+ "dist": {
+ "shasum": "64ac7526fe341ab18a39016cd22c787d01e00bf6",
+ "tarball": "http://localhost:4260/exponential-backoff/exponential-backoff-3.1.1.tgz",
+ "fileCount": 33,
+ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
+ "unpackedSize": 37269
+ },
+ "jest": {
+ "testRegex": "\\.spec\\.ts$",
+ "transform": {
+ "^.+\\.ts$": "ts-jest"
+ },
+ "moduleFileExtensions": [
+ "ts",
+ "js"
+ ]
+ },
+ "main": "dist/backoff.js",
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "types": "dist/backoff.d.ts",
+ "gitHead": "47b552aa6007a1320e851118d638a476cf765516",
+ "scripts": {
+ "test": "jest",
+ "build": "tsc",
+ "test:watch": "jest --watch"
+ },
+ "repository": {
+ "url": "git+https://github.com/coveo/exponential-backoff.git",
+ "type": "git"
+ },
+ "_npmVersion": "9.3.1",
+ "description": "A utility that allows retrying a function with an exponential delay between attempts.",
+ "directories": {},
+ "lint-staged": {
+ "*.{ts,json,md}": [
+ "prettier --write",
+ "git add"
+ ]
+ },
+ "_nodeVersion": "18.14.0",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "jest": "^24.9.0",
+ "husky": "^3.0.9",
+ "ts-jest": "^24.1.0",
+ "prettier": "^1.18.2",
+ "typescript": "^3.6.4",
+ "@types/jest": "^24.0.18",
+ "@types/node": "^10.14.21",
+ "lint-staged": "^9.4.2"
+ }
+ }
+ },
+ "author": {
+ "name": "Sami Sayegh"
+ },
+ "repository": {
+ "url": "git+https://github.com/coveo/exponential-backoff.git",
+ "type": "git"
+ },
+ "license": "Apache-2.0",
+ "homepage": "https://github.com/coveo/exponential-backoff#readme",
+ "bugs": {
+ "url": "https://github.com/coveo/exponential-backoff/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/fast-deep-equal/registry.json b/tests/registry/npm/fast-deep-equal/registry.json
index 8a2b984d9..3e0305d43 100644
--- a/tests/registry/npm/fast-deep-equal/registry.json
+++ b/tests/registry/npm/fast-deep-equal/registry.json
@@ -1 +1,85 @@
-{"name":"fast-deep-equal","description":"Fast deep equal","dist-tags":{"latest":"3.1.3"},"versions":{"3.1.3":{"name":"fast-deep-equal","version":"3.1.3","description":"Fast deep equal","main":"index.js","scripts":{"eslint":"eslint *.js benchmark/*.js spec/*.js","build":"node build","benchmark":"npm i && npm run build && cd ./benchmark && npm i && node ./","test-spec":"mocha spec/*.spec.js -R spec","test-cov":"nyc npm run test-spec","test-ts":"tsc --target ES5 --noImplicitAny index.d.ts","test":"npm run build && npm run eslint && npm run test-ts && npm run test-cov","prepublish":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/epoberezkin/fast-deep-equal.git"},"author":{"name":"Evgeny Poberezkin"},"license":"MIT","bugs":{"url":"https://github.com/epoberezkin/fast-deep-equal/issues"},"devDependencies":{"coveralls":"^3.1.0","dot":"^1.1.2","eslint":"^7.2.0","mocha":"^7.2.0","nyc":"^15.1.0","pre-commit":"^1.2.2","react":"^16.12.0","react-test-renderer":"^16.12.0","sinon":"^9.0.2","typescript":"^3.9.5"},"nyc":{"exclude":["**/spec/**","node_modules"],"reporter":["lcov","text-summary"]},"types":"index.d.ts","gitHead":"d807ffc5013e710deb1c63d463a03f729bcd144d","_id":"fast-deep-equal@3.1.3","_nodeVersion":"14.0.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==","shasum":"3a7d56b559d6cbc3eb512325244e619a65c6c525","tarball":"http://localhost:4260/fast-deep-equal/fast-deep-equal-3.1.3.tgz","fileCount":11,"unpackedSize":12966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3ehgCRA9TVsSAnZWagAAXoEP/AmAr6hbgGqa2L7/95pm\nB+wX1GaxB/Ynk4kSU4xeP3TGu9L72sqNhCf8Vj/WLl1XYPyJ0xA9betwXSIa\n+eE+Bd07xJAmaCM4Se583zgv4lifprYoKSCaSgGcXZ0Ay4yDxAeHLmrvELah\nNBnVM0eAJ/YxeVpwEemrh28mT5XDdq1HrXcbRq5ZnjTfth1oPvmEvfEoEtCc\nx/6NrH0tfyhPlbCt7XqpmJPJIYi4KPaDuaLbAhE+yKVzXtCfKsjf/eJVwfi/\n79sIhtQn8lINhbwbk0gs5PmFsxVIFllV6RPROa+iLLSV+MupLCoTWrmzzpx3\nJimUwaSKt4iPxsM3a/jvn73mODmqL2w4NNmyOJYmNj4Jx/ps+QjDnWJ8Vtqz\n0HEC/RnvP0M7HpObaOMeb12+xJY1PGnJqSDygMxVg9xT6WMEIoE4D55V8HSL\nyEQB9gNWpKjX2NAjolidqAYBc3XFplQrVPsXm5eg+Uvd+sbwolho8mMv3J4B\n0BVwcCcrxLgFOBxt+ZALNkcAb8MxkgU7Ptbcg+BZtqJV7FxSIXgRZW94kLXn\nMg+OorbUoGHPyGpRc8L3RGkfdXztpGdyjXHC5VDbkZHlw+1lyAQzQq7g090S\nkbQNT9BvcHpKIPaNvZsY1VjenDW5hupOCdyTfjP0HidwJkMN7OPPTWRNBfaW\nWqbw\r\n=uuzF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDaDosp9IxEQRt2XkZPq/dpNlm0nhS0lCPdWBSWBZHcDAiEApfm2QlsgGUYm5sFGQYPVb97kIorp3Voeb7/UQRiSmKc="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# fast-deep-equal\nThe fastest deep equal with ES6 Map, Set and Typed arrays support.\n\n[![Build Status](https://travis-ci.org/epoberezkin/fast-deep-equal.svg?branch=master)](https://travis-ci.org/epoberezkin/fast-deep-equal)\n[![npm](https://img.shields.io/npm/v/fast-deep-equal.svg)](https://www.npmjs.com/package/fast-deep-equal)\n[![Coverage Status](https://coveralls.io/repos/github/epoberezkin/fast-deep-equal/badge.svg?branch=master)](https://coveralls.io/github/epoberezkin/fast-deep-equal?branch=master)\n\n\n## Install\n\n```bash\nnpm install fast-deep-equal\n```\n\n\n## Features\n\n- ES5 compatible\n- works in node.js (8+) and browsers (IE9+)\n- checks equality of Date and RegExp objects by value.\n\nES6 equal (`require('fast-deep-equal/es6')`) also supports:\n- Maps\n- Sets\n- Typed arrays\n\n\n## Usage\n\n```javascript\nvar equal = require('fast-deep-equal');\nconsole.log(equal({foo: 'bar'}, {foo: 'bar'})); // true\n```\n\nTo support ES6 Maps, Sets and Typed arrays equality use:\n\n```javascript\nvar equal = require('fast-deep-equal/es6');\nconsole.log(equal(Int16Array([1, 2]), Int16Array([1, 2]))); // true\n```\n\nTo use with React (avoiding the traversal of React elements' _owner\nproperty that contains circular references and is not needed when\ncomparing the elements - borrowed from [react-fast-compare](https://github.com/FormidableLabs/react-fast-compare)):\n\n```javascript\nvar equal = require('fast-deep-equal/react');\nvar equal = require('fast-deep-equal/es6/react');\n```\n\n\n## Performance benchmark\n\nNode.js v12.6.0:\n\n```\nfast-deep-equal x 261,950 ops/sec ±0.52% (89 runs sampled)\nfast-deep-equal/es6 x 212,991 ops/sec ±0.34% (92 runs sampled)\nfast-equals x 230,957 ops/sec ±0.83% (85 runs sampled)\nnano-equal x 187,995 ops/sec ±0.53% (88 runs sampled)\nshallow-equal-fuzzy x 138,302 ops/sec ±0.49% (90 runs sampled)\nunderscore.isEqual x 74,423 ops/sec ±0.38% (89 runs sampled)\nlodash.isEqual x 36,637 ops/sec ±0.72% (90 runs sampled)\ndeep-equal x 2,310 ops/sec ±0.37% (90 runs sampled)\ndeep-eql x 35,312 ops/sec ±0.67% (91 runs sampled)\nramda.equals x 12,054 ops/sec ±0.40% (91 runs sampled)\nutil.isDeepStrictEqual x 46,440 ops/sec ±0.43% (90 runs sampled)\nassert.deepStrictEqual x 456 ops/sec ±0.71% (88 runs sampled)\n\nThe fastest is fast-deep-equal\n```\n\nTo run benchmark (requires node.js 6+):\n\n```bash\nnpm run benchmark\n```\n\n__Please note__: this benchmark runs against the available test cases. To choose the most performant library for your application, it is recommended to benchmark against your data and to NOT expect this benchmark to reflect the performance difference in your application.\n\n\n## Enterprise support\n\nfast-deep-equal package is a part of [Tidelift enterprise subscription](https://tidelift.com/subscription/pkg/npm-fast-deep-equal?utm_source=npm-fast-deep-equal&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - it provides a centralised commercial support to open-source software users, in addition to the support provided by software maintainers.\n\n\n## Security contact\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerability via GitHub issues.\n\n\n## License\n\n[MIT](https://github.com/epoberezkin/fast-deep-equal/blob/master/LICENSE)\n","homepage":"https://github.com/epoberezkin/fast-deep-equal#readme","repository":{"type":"git","url":"git+https://github.com/epoberezkin/fast-deep-equal.git"},"author":{"name":"Evgeny Poberezkin"},"bugs":{"url":"https://github.com/epoberezkin/fast-deep-equal/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "fast-deep-equal",
+ "description": "Fast deep equal",
+ "dist-tags": {
+ "latest": "3.1.3"
+ },
+ "versions": {
+ "3.1.3": {
+ "name": "fast-deep-equal",
+ "version": "3.1.3",
+ "description": "Fast deep equal",
+ "main": "index.js",
+ "scripts": {
+ "eslint": "eslint *.js benchmark/*.js spec/*.js",
+ "build": "node build",
+ "benchmark": "npm i && npm run build && cd ./benchmark && npm i && node ./",
+ "test-spec": "mocha spec/*.spec.js -R spec",
+ "test-cov": "nyc npm run test-spec",
+ "test-ts": "tsc --target ES5 --noImplicitAny index.d.ts",
+ "test": "npm run build && npm run eslint && npm run test-ts && npm run test-cov",
+ "prepublish": "npm run build"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/epoberezkin/fast-deep-equal.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/epoberezkin/fast-deep-equal/issues"
+ },
+ "devDependencies": {
+ "coveralls": "^3.1.0",
+ "dot": "^1.1.2",
+ "eslint": "^7.2.0",
+ "mocha": "^7.2.0",
+ "nyc": "^15.1.0",
+ "pre-commit": "^1.2.2",
+ "react": "^16.12.0",
+ "react-test-renderer": "^16.12.0",
+ "sinon": "^9.0.2",
+ "typescript": "^3.9.5"
+ },
+ "nyc": {
+ "exclude": [
+ "**/spec/**",
+ "node_modules"
+ ],
+ "reporter": [
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "types": "index.d.ts",
+ "gitHead": "d807ffc5013e710deb1c63d463a03f729bcd144d",
+ "_id": "fast-deep-equal@3.1.3",
+ "_nodeVersion": "14.0.0",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "shasum": "3a7d56b559d6cbc3eb512325244e619a65c6c525",
+ "tarball": "http://localhost:4260/fast-deep-equal/fast-deep-equal-3.1.3.tgz",
+ "fileCount": 11,
+ "unpackedSize": 12966
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/epoberezkin/fast-deep-equal#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/epoberezkin/fast-deep-equal.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "bugs": {
+ "url": "https://github.com/epoberezkin/fast-deep-equal/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/find-up/registry.json b/tests/registry/npm/find-up/registry.json
index e852e7173..0304c60a2 100644
--- a/tests/registry/npm/find-up/registry.json
+++ b/tests/registry/npm/find-up/registry.json
@@ -1 +1,72 @@
-{"name":"find-up","description":"Find a file or directory by walking up parent directories","dist-tags":{"latest":"4.1.0"},"versions":{"4.1.0":{"name":"find-up","version":"4.1.0","description":"Find a file or directory by walking up parent directories","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/find-up.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"locate-path":"^5.0.0","path-exists":"^4.0.0"},"devDependencies":{"ava":"^2.1.0","is-path-inside":"^2.1.0","tempy":"^0.3.0","tsd":"^0.7.3","xo":"^0.24.0"},"gitHead":"6c32f0caed1684ef778053b6f79b13a772e22ba4","bugs":{"url":"https://github.com/sindresorhus/find-up/issues"},"_id":"find-up@4.1.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==","shasum":"97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19","tarball":"http://localhost:4260/find-up/find-up-4.1.0.tgz","fileCount":5,"unpackedSize":11611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBzEzCRA9TVsSAnZWagAA7ZwQAJUrXCf9gkIYlisJcBE6\n2Wzq80Qhyy1k36PLbZPOIgwJsRyN81OGxhQQ5dlzvSIdyvXmJveNSm85+9pC\naN+th01evbkcCVLo6hoPwZyjv/CxWPjdKKqbF0dTBJwY8zCW+g0zDm/TUdlW\nZvlIncpN/AUSOjBpnmd8jYSC+wbedQ3JBCJi0ETSBYIVOuNwKUr14F0wl25+\nCZIAZB2D9VUMP+ZgT+F5z64OiUz1/+Q+U4VtXU0ivJ7OQfX3obNRqRx33KS7\nvBDHgVpeCh5ryMXNEGMZFblzR1qUOewik9/YdQ9e848SbhNu9oSfh4FaEg5X\n6ybitbPf7oOBQudM+LdJofhFkqJgUM8E+/eKtUxWZx6S2FmxbHltrjchAliW\n8JARBCQ2g0OqqyPPFOyWtQlImWr9BYcm2nyZqjA5Tj6jbGTsxkMaPK0YS89g\nAwXxJA5bXn3Xp8KTxFmxJUNJ0zDf5eRhWaZEIX/Tm2qpdEB2+kYbE9QfdOtV\nTo+Y7ZIg5mE44sDi5oN6LLmic+eHlTqtUaqaRS36Lecx65NbCBQY8fkxPNQp\ndJE/qYMRNOWMiNpA8yXqxpaXTtBUopFCpZ1ahTBUpQVP5pKVxX3uoPAbTT2Q\nzUvs1S2b0zo1sFAt3LpCgs24gyTu0WJTyMTFEKrTsk5nALPCpU93o5rUnJ0L\nSUUW\r\n=2E9L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHBGxf/EBWSrVAFVhJNToCIC1Kea1biltBR/pXbgCD5YAiAQx1O3FKsgP0EMKJKabUF+1z6isUPkSNEaWr0iaFeSvw=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# find-up\n\n> Find a file or directory by walking up parent directories\n\n## Install\n\n```\n$ npm install find-up\n```\n\n## Usage\n\n```\n/\n└── Users\n └── sindresorhus\n ├── unicorn.png\n └── foo\n └── bar\n ├── baz\n └── example.js\n```\n\n`example.js`\n\n```js\nimport path from 'node:path';\nimport {findUp, pathExists} from 'find-up';\n\nconsole.log(await findUp('unicorn.png'));\n//=> '/Users/sindresorhus/unicorn.png'\n\nconsole.log(await findUp(['rainbow.png', 'unicorn.png']));\n//=> '/Users/sindresorhus/unicorn.png'\n\nconsole.log(await findUp(async directory => {\n\tconst hasUnicorns = await pathExists(path.join(directory, 'unicorn.png'));\n\treturn hasUnicorns && directory;\n}, {type: 'directory'}));\n//=> '/Users/sindresorhus'\n```\n\n## API\n\n### findUp(name, options?)\n### findUp(matcher, options?)\n\nReturns a `Promise` for either the path or `undefined` if it couldn't be found.\n\n### findUp([...name], options?)\n\nReturns a `Promise` for either the first path found (by respecting the order of the array) or `undefined` if none could be found.\n\n### findUpMultiple(name, options?)\n### findUpMultiple(matcher, options?)\n\nReturns a `Promise` for either an array of paths or an empty array if none could be found.\n\n### findUpMultiple([...name], options?)\n\nReturns a `Promise` for either an array of the first paths found (by respecting the order of the array) or an empty array if none could be found.\n\n### findUpSync(name, options?)\n### findUpSync(matcher, options?)\n\nReturns a path or `undefined` if it couldn't be found.\n\n### findUpSync([...name], options?)\n\nReturns the first path found (by respecting the order of the array) or `undefined` if none could be found.\n\n### findUpMultipleSync(name, options?)\n### findUpMultipleSync(matcher, options?)\n\nReturns an array of paths or an empty array if none could be found.\n\n### findUpMultipleSync([...name], options?)\n\nReturns an array of the first paths found (by respecting the order of the array) or an empty array if none could be found.\n\n#### name\n\nType: `string`\n\nThe name of the file or directory to find.\n\n#### matcher\n\nType: `Function`\n\nA function that will be called with each directory until it returns a `string` with the path, which stops the search, or the root directory has been reached and nothing was found. Useful if you want to match files with certain patterns, set of permissions, or other advanced use-cases.\n\nWhen using async mode, the `matcher` may optionally be an async or promise-returning function that returns the path.\n\n#### options\n\nType: `object`\n\n##### cwd\n\nType: `URL | string`\\\nDefault: `process.cwd()`\n\nThe directory to start from.\n\n##### type\n\nType: `string`\\\nDefault: `'file'`\\\nValues: `'file'` `'directory'`\n\nThe type of paths that can match.\n\n##### allowSymlinks\n\nType: `boolean`\\\nDefault: `true`\n\nAllow symbolic links to match if they point to the chosen path type.\n\n##### stopAt\n\nType: `string`\\\nDefault: `path.parse(cwd).root`\n\nThe path to the directory to stop the search before reaching root if there were no matches before the `stopAt` directory.\n\n### pathExists(path)\n\nReturns a `Promise<boolean>` of whether the path exists.\n\n### pathExistsSync(path)\n\nReturns a `boolean` of whether the path exists.\n\n#### path\n\nType: `string`\n\nThe path to a file or directory.\n\n### findUpStop\n\nA [`Symbol`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) that can be returned by a `matcher` function to stop the search and cause `findUp` to immediately return `undefined`. Useful as a performance optimization in case the current working directory is deeply nested in the filesystem.\n\n```js\nimport path from 'node:path';\nimport {findUp, findUpStop} from 'find-up';\n\nawait findUp(directory => {\n\treturn path.basename(directory) === 'work' ? findUpStop : 'logo.png';\n});\n```\n\n## Related\n\n- [find-up-cli](https://github.com/sindresorhus/find-up-cli) - CLI for this module\n- [pkg-up](https://github.com/sindresorhus/pkg-up) - Find the closest package.json file\n- [pkg-dir](https://github.com/sindresorhus/pkg-dir) - Find the root directory of an npm package\n- [resolve-from](https://github.com/sindresorhus/resolve-from) - Resolve the path of a module like `require.resolve()` but from a given path\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-find-up?utm_source=npm-find-up&utm_medium=referral&utm_campaign=readme\">Get professional support for 'find-up' with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/find-up#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/find-up.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/find-up/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "find-up",
+ "description": "Find a file or directory by walking up parent directories",
+ "dist-tags": {
+ "latest": "4.1.0"
+ },
+ "versions": {
+ "4.1.0": {
+ "name": "find-up",
+ "version": "4.1.0",
+ "description": "Find a file or directory by walking up parent directories",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/find-up.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.1.0",
+ "is-path-inside": "^2.1.0",
+ "tempy": "^0.3.0",
+ "tsd": "^0.7.3",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "6c32f0caed1684ef778053b6f79b13a772e22ba4",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/find-up/issues"
+ },
+ "_id": "find-up@4.1.0",
+ "_nodeVersion": "8.16.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "shasum": "97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19",
+ "tarball": "http://localhost:4260/find-up/find-up-4.1.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 11611
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/find-up#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/find-up.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/find-up/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/foreground-child/registry.json b/tests/registry/npm/foreground-child/registry.json
index 4036ae0ed..ceac08a33 100644
--- a/tests/registry/npm/foreground-child/registry.json
+++ b/tests/registry/npm/foreground-child/registry.json
@@ -1 +1,152 @@
-{"name":"foreground-child","description":"Run a child as if it's the foreground process. Give it stdio. Exit when it exits.","dist-tags":{"latest":"3.2.1"},"versions":{"3.2.1":{"name":"foreground-child","version":"3.2.1","description":"Run a child as if it's the foreground process. Give it stdio. Exit when it exits.","main":"./dist/commonjs/index.js","types":"./dist/commonjs/index.d.ts","exports":{"./watchdog":{"import":{"source":"./src/watchdog.ts","types":"./dist/esm/watchdog.d.ts","default":"./dist/esm/watchdog.js"},"require":{"source":"./src/watchdog.ts","types":"./dist/commonjs/watchdog.d.ts","default":"./dist/commonjs/watchdog.js"}},"./proxy-signals":{"import":{"source":"./src/proxy-signals.ts","types":"./dist/esm/proxy-signals.d.ts","default":"./dist/esm/proxy-signals.js"},"require":{"source":"./src/proxy-signals.ts","types":"./dist/commonjs/proxy-signals.d.ts","default":"./dist/commonjs/proxy-signals.js"}},"./package.json":"./package.json",".":{"import":{"source":"./src/index.ts","types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"source":"./src/index.ts","types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}}},"engines":{"node":">=14"},"dependencies":{"cross-spawn":"^7.0.0","signal-exit":"^4.0.1"},"scripts":{"preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","prepare":"tshy","pretest":"npm run prepare","presnap":"npm run prepare","test":"tap","snap":"tap","format":"prettier --write . --log-level warn","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts"},"prettier":{"experimentalTernaries":true,"semi":false,"printWidth":75,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"tap":{"typecheck":true},"repository":{"type":"git","url":"git+https://github.com/tapjs/foreground-child.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","devDependencies":{"@types/cross-spawn":"^6.0.2","@types/node":"^18.15.11","@types/tap":"^15.0.8","prettier":"^3.3.2","tap":"^19.2.5","tshy":"^1.15.1","typedoc":"^0.24.2","typescript":"^5.0.2"},"funding":{"url":"https://github.com/sponsors/isaacs"},"tshy":{"exports":{"./watchdog":"./src/watchdog.ts","./proxy-signals":"./src/proxy-signals.ts","./package.json":"./package.json",".":"./src/index.ts"}},"type":"module","_id":"foreground-child@3.2.1","gitHead":"132a0178990aa4f53a6208bc3bdb90369b35e434","bugs":{"url":"https://github.com/tapjs/foreground-child/issues"},"_nodeVersion":"20.13.1","_npmVersion":"10.7.0","dist":{"integrity":"sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==","shasum":"767004ccf3a5b30df39bed90718bab43fe0a59f7","tarball":"http://localhost:4260/foreground-child/foreground-child-3.2.1.tgz","fileCount":37,"unpackedSize":68184,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICh3UF+VAJBE3PR4nCLEMutI04CojoFdJIieW6ffZVutAiBpPfgu74fUsaEfaA39HHpkoMqf9ICY3vOGIdNkiz3TWw=="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"type":"git","url":"git+https://github.com/tapjs/foreground-child.git"},"license":"ISC","homepage":"https://github.com/tapjs/foreground-child#readme","bugs":{"url":"https://github.com/tapjs/foreground-child/issues"},"readme":"# foreground-child\n\nRun a child as if it's the foreground process. Give it stdio. Exit\nwhen it exits.\n\nMostly this module is here to support some use cases around\nwrapping child processes for test coverage and such. But it's\nalso generally useful any time you want one program to execute\nanother as if it's the \"main\" process, for example, if a program\ntakes a `--cmd` argument to execute in some way.\n\n## USAGE\n\n```js\nimport { foregroundChild } from 'foreground-child'\n// hybrid module, this also works:\n// const { foregroundChild } = require('foreground-child')\n\n// cats out this file\nconst child = foregroundChild('cat', [__filename])\n\n// At this point, it's best to just do nothing else.\n// return or whatever.\n// If the child gets a signal, or just exits, then this\n// parent process will exit in the same way.\n```\n\nYou can provide custom spawn options by passing an object after\nthe program and arguments:\n\n```js\nconst child = foregroundChild(`cat ${__filename}`, { shell: true })\n```\n\nA callback can optionally be provided, if you want to perform an\naction before your foreground-child exits:\n\n```js\nconst child = foregroundChild('cat', [__filename], spawnOptions, () => {\n doSomeActions()\n})\n```\n\nThe callback can return a Promise in order to perform\nasynchronous actions. If the callback does not return a promise,\nthen it must complete its actions within a single JavaScript\ntick.\n\n```js\nconst child = foregroundChild('cat', [__filename], async () => {\n await doSomeAsyncActions()\n})\n```\n\nIf the callback throws or rejects, then it will be unhandled, and\nnode will exit in error.\n\nIf the callback returns a string value, then that will be used as\nthe signal to exit the parent process. If it returns a number,\nthen that number will be used as the parent exit status code. If\nit returns boolean `false`, then the parent process will not be\nterminated. If it returns `undefined`, then it will exit with the\nsame signal/code as the child process.\n\n## Caveats\n\nThe \"normal\" standard IO file descriptors (0, 1, and 2 for stdin,\nstdout, and stderr respectively) are shared with the child process.\nAdditionally, if there is an IPC channel set up in the parent, then\nmessages are proxied to the child on file descriptor 3.\n\nIn Node, it's possible to also map arbitrary file descriptors\ninto a child process. In these cases, foreground-child will not\nmap the file descriptors into the child. If file descriptors 0,\n1, or 2 are used for the IPC channel, then strange behavior may\nhappen (like printing IPC messages to stderr, for example).\n\nNote that a SIGKILL will always kill the parent process, but\nwill not proxy the signal to the child process, because SIGKILL\ncannot be caught. In order to address this, a special \"watchdog\"\nchild process is spawned which will send a SIGKILL to the child\nprocess if it does not terminate within half a second after the\nwatchdog receives a SIGHUP due to its parent terminating.\n\nOn Windows, issuing a `process.kill(process.pid, signal)` with a\nfatal termination signal may cause the process to exit with a `1`\nstatus code rather than reporting the signal properly. This\nmodule tries to do the right thing, but on Windows systems, you\nmay see that incorrect result. There is as far as I'm aware no\nworkaround for this.\n\n## util: `foreground-child/proxy-signals`\n\nIf you just want to proxy the signals to a child process that the\nmain process receives, you can use the `proxy-signals` export\nfrom this package.\n\n```js\nimport { proxySignals } from 'foreground-child/proxy-signals'\n\nconst childProcess = spawn('command', ['some', 'args'])\nproxySignals(childProcess)\n```\n\nNow, any fatal signal received by the current process will be\nproxied to the child process.\n\nIt doesn't go in the other direction; ie, signals sent to the\nchild process will not affect the parent. For that, listen to the\nchild `exit` or `close` events, and handle them appropriately.\n\n## util: `foreground-child/watchdog`\n\nIf you are spawning a child process, and want to ensure that it\nisn't left dangling if the parent process exits, you can use the\nwatchdog utility exported by this module.\n\n```js\nimport { watchdog } from 'foreground-child/watchdog'\n\nconst childProcess = spawn('command', ['some', 'args'])\nconst watchdogProcess = watchdog(childProcess)\n\n// watchdogProcess is a reference to the process monitoring the\n// parent and child. There's usually no reason to do anything\n// with it, as it's silent and will terminate\n// automatically when it's no longer needed.\n```\n","readmeFilename":"README.md"}
+{
+ "name": "foreground-child",
+ "description": "Run a child as if it's the foreground process. Give it stdio. Exit when it exits.",
+ "dist-tags": {
+ "latest": "3.2.1"
+ },
+ "versions": {
+ "3.2.1": {
+ "name": "foreground-child",
+ "version": "3.2.1",
+ "description": "Run a child as if it's the foreground process. Give it stdio. Exit when it exits.",
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "exports": {
+ "./watchdog": {
+ "import": {
+ "source": "./src/watchdog.ts",
+ "types": "./dist/esm/watchdog.d.ts",
+ "default": "./dist/esm/watchdog.js"
+ },
+ "require": {
+ "source": "./src/watchdog.ts",
+ "types": "./dist/commonjs/watchdog.d.ts",
+ "default": "./dist/commonjs/watchdog.js"
+ }
+ },
+ "./proxy-signals": {
+ "import": {
+ "source": "./src/proxy-signals.ts",
+ "types": "./dist/esm/proxy-signals.d.ts",
+ "default": "./dist/esm/proxy-signals.js"
+ },
+ "require": {
+ "source": "./src/proxy-signals.ts",
+ "types": "./dist/commonjs/proxy-signals.d.ts",
+ "default": "./dist/commonjs/proxy-signals.js"
+ }
+ },
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "source": "./src/index.ts",
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "source": "./src/index.ts",
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --log-level warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "experimentalTernaries": true,
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "tap": {
+ "typecheck": true
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tapjs/foreground-child.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "@types/cross-spawn": "^6.0.2",
+ "@types/node": "^18.15.11",
+ "@types/tap": "^15.0.8",
+ "prettier": "^3.3.2",
+ "tap": "^19.2.5",
+ "tshy": "^1.15.1",
+ "typedoc": "^0.24.2",
+ "typescript": "^5.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "tshy": {
+ "exports": {
+ "./watchdog": "./src/watchdog.ts",
+ "./proxy-signals": "./src/proxy-signals.ts",
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "type": "module",
+ "_id": "foreground-child@3.2.1",
+ "gitHead": "132a0178990aa4f53a6208bc3bdb90369b35e434",
+ "bugs": {
+ "url": "https://github.com/tapjs/foreground-child/issues"
+ },
+ "_nodeVersion": "20.13.1",
+ "_npmVersion": "10.7.0",
+ "dist": {
+ "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+ "shasum": "767004ccf3a5b30df39bed90718bab43fe0a59f7",
+ "tarball": "http://localhost:4260/foreground-child/foreground-child-3.2.1.tgz",
+ "fileCount": 37,
+ "unpackedSize": 68184
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tapjs/foreground-child.git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/tapjs/foreground-child#readme",
+ "bugs": {
+ "url": "https://github.com/tapjs/foreground-child/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/fraction.js/registry.json b/tests/registry/npm/fraction.js/registry.json
index c5ce073d6..833db93a1 100644
--- a/tests/registry/npm/fraction.js/registry.json
+++ b/tests/registry/npm/fraction.js/registry.json
@@ -1 +1,33 @@
-{"name":"fraction.js","dist-tags":{"latest":"4.2.0"},"versions":{"4.2.0":{"name":"fraction.js","version":"4.2.0","devDependencies":{"mocha":"*"},"directories":{"example":"examples"},"dist":{"integrity":"sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==","shasum":"448e5109a313a3527f5a3ab2119ec4cf0e0e2950","tarball":"http://localhost:4260/fraction.js/fraction.js-4.2.0.tgz","fileCount":7,"unpackedSize":67397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiI9ecACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp/lBAAjC2oc8YCaLNzAdSTT98eVqKdnbSgx1dUPqi3VegopgfFE5Mk\r\nMxkCPTYR9XO0kC/kyoRbl8om9kCu8VjjrywVQSCcr+j4DF1B38Rkgqj+cWum\r\nm0Y+maMgjVfcpzwJhePQCeF/2WKVWu/FSLXQJpWs4fXtcVGvfbUj33xSwVA/\r\nrMrr/8OjPEEnK+GsyzsS+XZdDOHz0FyYku4zsuLgsvXWhCF4NRTTey2RxiHM\r\n+5QkQ3JyqU/nuMvqI077mlsXkfOtkSJhlB/Mib65BH9JGVWu+LriSP4jMH34\r\nT7/DHhgYeEzgIDT6jdHT1FjqxUNQIspBwkIRuq5KtAvT+EkYsneeBlDI6cx1\r\n/4DDKGRjhkWlM4ejEvwtRPeAo3GhuwMFJ/Ewza9ePycVtY37/CCq7aYCzr9b\r\nID5ebur19E9stwIfgK+jns7DZTcOiNqsWbqkTKDDGb+FiXIV75ApzxXEE1az\r\n0+3n84ZmdPW2RVlRHS1YwMH0ubTim6iPOlL9xQ1LFR+P5pbEqAcqwWA9+CvQ\r\n+xuBKSXm0zv45pOGUGvkMtEvHMlNqGii/Uzj6bAj/D8QlUomGg8Viy56/jjp\r\nlEHDmrwpDVShKbb/FmOsTMH/Vp4GXs/QcbvgMNkc41kBsQ6pakDTckH8Ap0p\r\n/456rQi3dV+zyejXidHP9/NqH8EcsQKacjI=\r\n=xBZv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXoZEcz1Sd45YDbgGpXTvSRRZaQKI6bCZgbUBbsafdVgIhAIEaYpbVDppED48LWFEqLLz/yb+5uxhO2c4FnCxNw6cu"}]},"engines":{"node":"*"},"funding":{"type":"patreon","url":"https://www.patreon.com/infusion"}}},"modified":"2022-06-18T03:25:30.477Z"}
+{
+ "name": "fraction.js",
+ "dist-tags": {
+ "latest": "4.2.0"
+ },
+ "versions": {
+ "4.2.0": {
+ "name": "fraction.js",
+ "version": "4.2.0",
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "directories": {
+ "example": "examples"
+ },
+ "dist": {
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "shasum": "448e5109a313a3527f5a3ab2119ec4cf0e0e2950",
+ "tarball": "http://localhost:4260/fraction.js/fraction.js-4.2.0.tgz",
+ "fileCount": 7,
+ "unpackedSize": 67397
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ }
+ },
+ "modified": "2022-06-18T03:25:30.477Z"
+}
diff --git a/tests/registry/npm/fs-extra/registry.json b/tests/registry/npm/fs-extra/registry.json
index fcff09de6..886ae53d4 100644
--- a/tests/registry/npm/fs-extra/registry.json
+++ b/tests/registry/npm/fs-extra/registry.json
@@ -1 +1,80 @@
-{"name":"fs-extra","description":"fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.","dist-tags":{"latest":"10.1.0"},"versions":{"10.1.0":{"name":"fs-extra","version":"10.1.0","description":"fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.","engines":{"node":">=12"},"repository":{"type":"git","url":"git+https://github.com/jprichardson/node-fs-extra.git"},"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"license":"MIT","dependencies":{"graceful-fs":"^4.2.0","jsonfile":"^6.0.1","universalify":"^2.0.0"},"devDependencies":{"at-least-node":"^1.0.0","klaw":"^2.1.1","klaw-sync":"^3.0.2","minimist":"^1.1.1","mocha":"^5.0.5","nyc":"^15.0.0","proxyquire":"^2.0.1","read-dir-files":"^0.1.1","standard":"^16.0.3"},"main":"./lib/index.js","scripts":{"lint":"standard","test-find":"find ./lib/**/__tests__ -name *.test.js | xargs mocha","test":"npm run lint && npm run unit","unit":"nyc node test.js"},"sideEffects":false,"gitHead":"0220eac966d7d6b9a595d69b1242ab8a397fba7f","bugs":{"url":"https://github.com/jprichardson/node-fs-extra/issues"},"_id":"fs-extra@10.1.0","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==","shasum":"02873cfbc4084dde127eaa5f9905eef2325d1abf","tarball":"http://localhost:4260/fs-extra/fs-extra-10.1.0.tgz","fileCount":31,"unpackedSize":63278,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD21YYPPgkB2LOeQWvg8lrG4HDMrcyGDuHGzHSgb4C7JQIgFvAy28pTBl3wREOhOiLoYEyQzj6nz63aExuHO6pZiH8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWxA2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqPvQ//amNoBcS9NyvKrd0yF+0y7J+Gli5ei+B3cxmsB8XvtId4ZpOj\r\n/uvQmMvyKe6/jx/WnGyiSDRC+51WEPnMr1hxaxwhsik+lefDR7cCrjjdRaB6\r\nTE50qqcXzHIcgOWWY9jmOjbcyvmMUj2BECmSKkJHZu7xYAwZgLakphXul8tL\r\nLoCSYEolCIwsbYjrUdcrTTNnpkBIr8a+Xrr3H85yhnPG0itZhiYfFzNIUabq\r\nP0ztUOSW6MvfObUWX5dMU9XeykTFRhCgsp7zEWIVlXENpErkFoPSNxMKxDte\r\nu55LF7wBpK2fhtsjurNvEN3KN41uI+xeCs/ilWn1lYDWXBAzmNZckn+qLxb/\r\nLinE2yGykmRdqF3l73EcxcU91Y+riUEA8nuH4KNQLHnkvZM+Vh+cWVM8knek\r\nfgPAy0Tg6W1oh/Il8W2TIFrcMar6AWNrsUt4TJEfYRpLrDNLvjP7afTZNF0i\r\nyPGbNVO8J9UFUk2eTrMwcm2107HdVcb+5rVxdptFeh5o9nLqznzetia4WNCY\r\n9tfgeTLhhEiv5igA3lqQTrOPE8YUJ1IQLzuFscy0QEWwdJTCmGAbWDP6xhfd\r\nbjkN0ArzH8T1vdlKBZmmdWDeq1jq0q9JPIGqcXKAT659smnMhCrw8rWRidTE\r\nsVCOU4zwwfjWMOwXAxyyDwk6lOHXIFRnRQg=\r\n=dBd9\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"Node.js: fs-extra\n=================\n\n`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.\n\n[![npm Package](https://img.shields.io/npm/v/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)\n[![License](https://img.shields.io/npm/l/fs-extra.svg)](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)\n[![build status](https://img.shields.io/github/workflow/status/jprichardson/node-fs-extra/Node.js%20CI/master)](https://github.com/jprichardson/node-fs-extra/actions/workflows/ci.yml?query=branch%3Amaster)\n[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)\n[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\nWhy?\n----\n\nI got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.\n\n\n\n\nInstallation\n------------\n\n npm install fs-extra\n\n\n\nUsage\n-----\n\n`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.\n\nYou don't ever need to include the original `fs` module again:\n\n```js\nconst fs = require('fs') // this is no longer necessary\n```\n\nyou can now do this:\n\n```js\nconst fs = require('fs-extra')\n```\n\nor if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want\nto name your `fs` variable `fse` like so:\n\n```js\nconst fse = require('fs-extra')\n```\n\nyou can also keep both, but it's redundant:\n\n```js\nconst fs = require('fs')\nconst fse = require('fs-extra')\n```\n\nSync vs Async vs Async/Await\n-------------\nMost methods are async by default. All async methods will return a promise if the callback isn't passed.\n\nSync methods on the other hand will throw if an error occurs.\n\nAlso Async/Await will throw an error if one occurs.\n\nExample:\n\n```js\nconst fs = require('fs-extra')\n\n// Async with promises:\nfs.copy('/tmp/myfile', '/tmp/mynewfile')\n .then(() => console.log('success!'))\n .catch(err => console.error(err))\n\n// Async with callbacks:\nfs.copy('/tmp/myfile', '/tmp/mynewfile', err => {\n if (err) return console.error(err)\n console.log('success!')\n})\n\n// Sync:\ntry {\n fs.copySync('/tmp/myfile', '/tmp/mynewfile')\n console.log('success!')\n} catch (err) {\n console.error(err)\n}\n\n// Async/Await:\nasync function copyFiles () {\n try {\n await fs.copy('/tmp/myfile', '/tmp/mynewfile')\n console.log('success!')\n } catch (err) {\n console.error(err)\n }\n}\n\ncopyFiles()\n```\n\n\nMethods\n-------\n\n### Async\n\n- [copy](docs/copy.md)\n- [emptyDir](docs/emptyDir.md)\n- [ensureFile](docs/ensureFile.md)\n- [ensureDir](docs/ensureDir.md)\n- [ensureLink](docs/ensureLink.md)\n- [ensureSymlink](docs/ensureSymlink.md)\n- [mkdirp](docs/ensureDir.md)\n- [mkdirs](docs/ensureDir.md)\n- [move](docs/move.md)\n- [outputFile](docs/outputFile.md)\n- [outputJson](docs/outputJson.md)\n- [pathExists](docs/pathExists.md)\n- [readJson](docs/readJson.md)\n- [remove](docs/remove.md)\n- [writeJson](docs/writeJson.md)\n\n### Sync\n\n- [copySync](docs/copy-sync.md)\n- [emptyDirSync](docs/emptyDir-sync.md)\n- [ensureFileSync](docs/ensureFile-sync.md)\n- [ensureDirSync](docs/ensureDir-sync.md)\n- [ensureLinkSync](docs/ensureLink-sync.md)\n- [ensureSymlinkSync](docs/ensureSymlink-sync.md)\n- [mkdirpSync](docs/ensureDir-sync.md)\n- [mkdirsSync](docs/ensureDir-sync.md)\n- [moveSync](docs/move-sync.md)\n- [outputFileSync](docs/outputFile-sync.md)\n- [outputJsonSync](docs/outputJson-sync.md)\n- [pathExistsSync](docs/pathExists-sync.md)\n- [readJsonSync](docs/readJson-sync.md)\n- [removeSync](docs/remove-sync.md)\n- [writeJsonSync](docs/writeJson-sync.md)\n\n\n**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)\n\n### What happened to `walk()` and `walkSync()`?\n\nThey were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).\n\n\nThird Party\n-----------\n\n### CLI\n\n[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.\n\n### TypeScript\n\nIf you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra\n\n\n### File / Directory Watching\n\nIf you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).\n\n### Obtain Filesystem (Devices, Partitions) Information\n\n[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.\n\n### Misc.\n\n- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).\n- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.\n\n\n\nHacking on fs-extra\n-------------------\n\nWanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project\nuses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,\nyou're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.\n\n[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)\n\nWhat's needed?\n- First, take a look at existing issues. Those are probably going to be where the priority lies.\n- More tests for edge cases. Specifically on different platforms. There can never be enough tests.\n- Improve test coverage.\n\nNote: If you make any big changes, **you should definitely file an issue for discussion first.**\n\n### Running the Test Suite\n\nfs-extra contains hundreds of tests.\n\n- `npm run lint`: runs the linter ([standard](http://standardjs.com/))\n- `npm run unit`: runs the unit tests\n- `npm test`: runs both the linter and the tests\n\n\n### Windows\n\nIf you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's\nbecause on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's\naccount by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7\nHowever, I didn't have much luck doing this.\n\nSince I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.\nI open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:\n\n net use z: \"\\\\vmware-host\\Shared Folders\"\n\nI can then navigate to my `fs-extra` directory and run the tests.\n\n\nNaming\n------\n\nI put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:\n\n* https://github.com/jprichardson/node-fs-extra/issues/2\n* https://github.com/flatiron/utile/issues/11\n* https://github.com/ryanmcgrath/wrench-js/issues/29\n* https://github.com/substack/node-mkdirp/issues/17\n\nFirst, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.\n\nFor example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.\n\nWe have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?\n\nMy perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.\n\nSo, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.\n\n\nCredit\n------\n\n`fs-extra` wouldn't be possible without using the modules from the following authors:\n\n- [Isaac Shlueter](https://github.com/isaacs)\n- [Charlie McConnel](https://github.com/avianflu)\n- [James Halliday](https://github.com/substack)\n- [Andrew Kelley](https://github.com/andrewrk)\n\n\n\n\nLicense\n-------\n\nLicensed under MIT\n\nCopyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)\n\n[1]: http://nodejs.org/docs/latest/api/fs.html\n\n\n[jsonfile]: https://github.com/jprichardson/node-jsonfile\n","author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/jprichardson/node-fs-extra.git"},"homepage":"https://github.com/jprichardson/node-fs-extra","bugs":{"url":"https://github.com/jprichardson/node-fs-extra/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "fs-extra",
+ "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+ "dist-tags": {
+ "latest": "10.1.0"
+ },
+ "versions": {
+ "10.1.0": {
+ "name": "fs-extra",
+ "version": "10.1.0",
+ "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+ "engines": {
+ "node": ">=12"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jprichardson/node-fs-extra.git"
+ },
+ "author": {
+ "name": "JP Richardson",
+ "email": "jprichardson@gmail.com"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "devDependencies": {
+ "at-least-node": "^1.0.0",
+ "klaw": "^2.1.1",
+ "klaw-sync": "^3.0.2",
+ "minimist": "^1.1.1",
+ "mocha": "^5.0.5",
+ "nyc": "^15.0.0",
+ "proxyquire": "^2.0.1",
+ "read-dir-files": "^0.1.1",
+ "standard": "^16.0.3"
+ },
+ "main": "./lib/index.js",
+ "scripts": {
+ "lint": "standard",
+ "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
+ "test": "npm run lint && npm run unit",
+ "unit": "nyc node test.js"
+ },
+ "sideEffects": false,
+ "gitHead": "0220eac966d7d6b9a595d69b1242ab8a397fba7f",
+ "bugs": {
+ "url": "https://github.com/jprichardson/node-fs-extra/issues"
+ },
+ "_id": "fs-extra@10.1.0",
+ "_nodeVersion": "16.9.1",
+ "_npmVersion": "7.21.1",
+ "dist": {
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "shasum": "02873cfbc4084dde127eaa5f9905eef2325d1abf",
+ "tarball": "http://localhost:4260/fs-extra/fs-extra-10.1.0.tgz",
+ "fileCount": 31,
+ "unpackedSize": 63278
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "JP Richardson",
+ "email": "jprichardson@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jprichardson/node-fs-extra.git"
+ },
+ "homepage": "https://github.com/jprichardson/node-fs-extra",
+ "bugs": {
+ "url": "https://github.com/jprichardson/node-fs-extra/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/fs-minipass/registry.json b/tests/registry/npm/fs-minipass/registry.json
index a0e49a447..a09bfb236 100644
--- a/tests/registry/npm/fs-minipass/registry.json
+++ b/tests/registry/npm/fs-minipass/registry.json
@@ -1 +1,142 @@
-{"name":"fs-minipass","description":"fs read and write streams based on minipass","dist-tags":{"latest":"3.0.3"},"versions":{"2.1.0":{"name":"fs-minipass","version":"2.1.0","main":"index.js","scripts":{"test":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/npm/fs-minipass.git"},"bugs":{"url":"https://github.com/npm/fs-minipass/issues"},"description":"fs read and write streams based on minipass","dependencies":{"minipass":"^3.0.0"},"devDependencies":{"mutate-fs":"^2.0.1","tap":"^14.6.4"},"tap":{"check-coverage":true},"engines":{"node":">= 8"},"gitHead":"4995b5fd182fb95959ad5572dee5ccc2f31b5b21","_id":"fs-minipass@2.1.0","_nodeVersion":"13.4.0","_npmVersion":"6.13.6","dist":{"integrity":"sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==","shasum":"7f5036fdbf12c63c169190cbe4199c852271f9fb","tarball":"http://localhost:4260/fs-minipass/fs-minipass-2.1.0.tgz","fileCount":4,"unpackedSize":14089,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJzc8CRA9TVsSAnZWagAA394P/1iQTxpDUgo9PcXXEOf8\nzkw0nrrZ4dvg2FcBUePgJ6iDjY/e/p8wXBXBeCvaDVkULwjlMDMChv5aweS+\nS+hxZHpCe8f3QbTBlUGMQWgTrLrb3qXdHkBpv/uXuZD3eVzqJ8un/85aSc17\nnBJ6cTxbSft00ncApFRAh7fwZERBB8TWip+YSqjkv/5cSiiUwlRG/cCX3ogD\nMuqO083eOwdxonH/UgnGsI3Ijsdo0AqeEEjCYOCfFAnLtCdaDNC/7DqjnyrO\nwVAn0wuu0iAUXx3+3O/HgaAI6KR1qu16Zk9cB0vknd2SpxieqpV8vUNxfg8Y\n9fkdj5BkYenKsc5iqsdClYjnL533BEtd5+xu5/W8yXucQiiKedl06TGa39kj\nbXbXOY7C5LJiNe4BRQjVInBPhZytHQFl0StT9+A8SbCdFYjnZ6jFl4uKYVIe\nOHcjxfEx2gG40J5tRdL0YUM5L55ahgxS23l7hWL5sBOati7wWSP0IbnOa54i\n2qFnkek1tORJKneJ7g6p8XaZCNLY/5tV16Me+M0xJOxwhsNfJ+BvYode/B+/\nBm5uRXu/oW0k7WJ6s8n3GnzVCL8FiQdI7r7s74h745ftL5NXsVJo8d27kZEo\nIvumC4gilQ930J18VYtKlVEagVUOdXrU1zpAZ6tjCHmnMUB/VPE7FY4rFRXT\nHiAi\r\n=X3w7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIETjZE1EEDJqg6zfu44nfx6QmFlVznDQ3wnCJpEhn7eTAiAnIeoJR4uTnkUYIY8KLUi9riu9b41CCevmzEBz/hw71w=="}]},"directories":{},"_hasShrinkwrap":false},"3.0.3":{"name":"fs-minipass","version":"3.0.3","main":"lib/index.js","scripts":{"test":"tap","lint":"eslint \"**/*.js\"","postlint":"template-oss-check","template-oss-apply":"template-oss-apply --force","lintfix":"npm run lint -- --fix","snap":"tap","posttest":"npm run lint"},"author":{"name":"GitHub Inc."},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/npm/fs-minipass.git"},"bugs":{"url":"https://github.com/npm/fs-minipass/issues"},"description":"fs read and write streams based on minipass","dependencies":{"minipass":"^7.0.3"},"devDependencies":{"@npmcli/eslint-config":"^4.0.1","@npmcli/template-oss":"4.18.0","mutate-fs":"^2.1.1","tap":"^16.3.2"},"tap":{"check-coverage":true,"nyc-arg":["--exclude","tap-snapshots/**"]},"engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"templateOSS":{"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten.","version":"4.18.0","publish":"true"},"_id":"fs-minipass@3.0.3","gitHead":"8348d32797eadf1bad05fae1d8ba2af3da53cd44","_nodeVersion":"18.17.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==","shasum":"79a85981c4dc120065e96f62086bf6f9dc26cc54","tarball":"http://localhost:4260/fs-minipass/fs-minipass-3.0.3.tgz","fileCount":4,"unpackedSize":14413,"attestations":{"url":"http://localhost:4260/attestations/fs-minipass@3.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9zx1hl03IJIeWe9sdBFvux0IyXR6zf9Oguze7gejg5wIgTcY3Z3fPqn/3NAF6k5ixMQ1IssMYG446B4ZdiOMtTBA="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# fs-minipass\n\nFilesystem streams based on [minipass](http://npm.im/minipass).\n\n4 classes are exported:\n\n- ReadStream\n- ReadStreamSync\n- WriteStream\n- WriteStreamSync\n\nWhen using `ReadStreamSync`, all of the data is made available\nimmediately upon consuming the stream. Nothing is buffered in memory\nwhen the stream is constructed. If the stream is piped to a writer,\nthen it will synchronously `read()` and emit data into the writer as\nfast as the writer can consume it. (That is, it will respect\nbackpressure.) If you call `stream.read()` then it will read the\nentire file and return the contents.\n\nWhen using `WriteStreamSync`, every write is flushed to the file\nsynchronously. If your writes all come in a single tick, then it'll\nwrite it all out in a single tick. It's as synchronous as you are.\n\nThe async versions work much like their node builtin counterparts,\nwith the exception of introducing significantly less Stream machinery\noverhead.\n\n## USAGE\n\nIt's just streams, you pipe them or read() them or write() to them.\n\n```js\nconst fsm = require('fs-minipass')\nconst readStream = new fsm.ReadStream('file.txt')\nconst writeStream = new fsm.WriteStream('output.txt')\nwriteStream.write('some file header or whatever\\n')\nreadStream.pipe(writeStream)\n```\n\n## ReadStream(path, options)\n\nPath string is required, but somewhat irrelevant if an open file\ndescriptor is passed in as an option.\n\nOptions:\n\n- `fd` Pass in a numeric file descriptor, if the file is already open.\n- `readSize` The size of reads to do, defaults to 16MB\n- `size` The size of the file, if known. Prevents zero-byte read()\n call at the end.\n- `autoClose` Set to `false` to prevent the file descriptor from being\n closed when the file is done being read.\n\n## WriteStream(path, options)\n\nPath string is required, but somewhat irrelevant if an open file\ndescriptor is passed in as an option.\n\nOptions:\n\n- `fd` Pass in a numeric file descriptor, if the file is already open.\n- `mode` The mode to create the file with. Defaults to `0o666`.\n- `start` The position in the file to start reading. If not\n specified, then the file will start writing at position zero, and be\n truncated by default.\n- `autoClose` Set to `false` to prevent the file descriptor from being\n closed when the stream is ended.\n- `flags` Flags to use when opening the file. Irrelevant if `fd` is\n passed in, since file won't be opened in that case. Defaults to\n `'a'` if a `pos` is specified, or `'w'` otherwise.\n","homepage":"https://github.com/npm/fs-minipass#readme","repository":{"type":"git","url":"git+https://github.com/npm/fs-minipass.git"},"author":{"name":"GitHub Inc."},"bugs":{"url":"https://github.com/npm/fs-minipass/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "fs-minipass",
+ "description": "fs read and write streams based on minipass",
+ "dist-tags": {
+ "latest": "3.0.3"
+ },
+ "versions": {
+ "2.1.0": {
+ "name": "fs-minipass",
+ "version": "2.1.0",
+ "main": "index.js",
+ "scripts": {
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/fs-minipass.git"
+ },
+ "bugs": {
+ "url": "https://github.com/npm/fs-minipass/issues"
+ },
+ "description": "fs read and write streams based on minipass",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "devDependencies": {
+ "mutate-fs": "^2.0.1",
+ "tap": "^14.6.4"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "engines": {
+ "node": ">= 8"
+ },
+ "gitHead": "4995b5fd182fb95959ad5572dee5ccc2f31b5b21",
+ "_id": "fs-minipass@2.1.0",
+ "_nodeVersion": "13.4.0",
+ "_npmVersion": "6.13.6",
+ "dist": {
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "shasum": "7f5036fdbf12c63c169190cbe4199c852271f9fb",
+ "tarball": "http://localhost:4260/fs-minipass/fs-minipass-2.1.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 14089
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "3.0.3": {
+ "name": "fs-minipass",
+ "version": "3.0.3",
+ "main": "lib/index.js",
+ "scripts": {
+ "test": "tap",
+ "lint": "eslint \"**/*.js\"",
+ "postlint": "template-oss-check",
+ "template-oss-apply": "template-oss-apply --force",
+ "lintfix": "npm run lint -- --fix",
+ "snap": "tap",
+ "posttest": "npm run lint"
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/fs-minipass.git"
+ },
+ "bugs": {
+ "url": "https://github.com/npm/fs-minipass/issues"
+ },
+ "description": "fs read and write streams based on minipass",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "devDependencies": {
+ "@npmcli/eslint-config": "^4.0.1",
+ "@npmcli/template-oss": "4.18.0",
+ "mutate-fs": "^2.1.1",
+ "tap": "^16.3.2"
+ },
+ "tap": {
+ "check-coverage": true,
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "templateOSS": {
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
+ "version": "4.18.0",
+ "publish": "true"
+ },
+ "_id": "fs-minipass@3.0.3",
+ "gitHead": "8348d32797eadf1bad05fae1d8ba2af3da53cd44",
+ "_nodeVersion": "18.17.0",
+ "_npmVersion": "9.8.1",
+ "dist": {
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "shasum": "79a85981c4dc120065e96f62086bf6f9dc26cc54",
+ "tarball": "http://localhost:4260/fs-minipass/fs-minipass-3.0.3.tgz",
+ "fileCount": 4,
+ "unpackedSize": 14413,
+ "attestations": {
+ "url": "http://localhost:4260/attestations/fs-minipass@3.0.3",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ }
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/npm/fs-minipass#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/fs-minipass.git"
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "bugs": {
+ "url": "https://github.com/npm/fs-minipass/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/fsevents/registry.json b/tests/registry/npm/fsevents/registry.json
index 0b00d80e2..333d0e681 100644
--- a/tests/registry/npm/fsevents/registry.json
+++ b/tests/registry/npm/fsevents/registry.json
@@ -1 +1,64 @@
-{"name":"fsevents","description":"Native Access to MacOS FSEvents","dist-tags":{"latest":"2.3.3"},"versions":{"2.3.3":{"name":"fsevents","version":"2.3.3","description":"Native Access to MacOS FSEvents","main":"fsevents.js","types":"fsevents.d.ts","os":["darwin"],"engines":{"node":"^8.16.0 || ^10.6.0 || >=11.0.0"},"scripts":{"clean":"node-gyp clean && rm -f fsevents.node","build":"node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean","test":"/bin/bash ./test.sh 2>/dev/null","prepublishOnly":"npm run build","install":"node-gyp rebuild"},"repository":{"type":"git","url":"git+https://github.com/fsevents/fsevents.git"},"license":"MIT","bugs":{"url":"https://github.com/fsevents/fsevents/issues"},"devDependencies":{"node-gyp":"^9.4.0"},"gypfile":true,"gitHead":"2db891e51aa0f2975c5eaaf6aa30f13d720a830a","_id":"fsevents@2.3.3","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==","shasum":"cac6407785d03675a2a5e1a5305c697b347d90d6","tarball":"http://localhost:4260/fsevents/fsevents-2.3.3.tgz","fileCount":6,"unpackedSize":173224,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBqKmzRJwFJcSLXc/SdNTdFsUQvsS/tX+pFHr2JkniDbAiEAiTjoxV3W2IK2g8Udbes/ZP46+TtL40PX3IX/bxosfWs="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# fsevents\n\nNative access to MacOS FSEvents in [Node.js](https://nodejs.org/)\n\nThe FSEvents API in MacOS allows applications to register for notifications of\nchanges to a given directory tree. It is a very fast and lightweight alternative\nto kqueue.\n\nThis is a low-level library. For a cross-platform file watching module that\nuses fsevents, check out [Chokidar](https://github.com/paulmillr/chokidar).\n\n## Usage\n\n```sh\nnpm install fsevents\n```\n\nSupports only **Node.js v8.16 and higher**.\n\n```js\nconst fsevents = require('fsevents');\n\n// To start observation\nconst stop = fsevents.watch(__dirname, (path, flags, id) => {\n const info = fsevents.getInfo(path, flags);\n});\n\n// To end observation\nstop();\n```\n\n> **Important note:** The API behaviour is slightly different from typical JS APIs. The `stop` function **must** be\n> retrieved and stored somewhere, even if you don't plan to stop the watcher. If you forget it, the garbage collector\n> will eventually kick in, the watcher will be unregistered, and your callbacks won't be called anymore.\n\nThe callback passed as the second parameter to `.watch` get's called whenever the operating system detects a\na change in the file system. It takes three arguments:\n\n###### `fsevents.watch(dirname: string, (path: string, flags: number, id: string) => void): () => Promise<undefined>`\n\n * `path: string` - the item in the filesystem that have been changed\n * `flags: number` - a numeric value describing what the change was\n * `id: string` - an unique-id identifying this specific event\n\n Returns closer callback which when called returns a Promise resolving when the watcher process has been shut down.\n\n###### `fsevents.getInfo(path: string, flags: number, id: string): FsEventInfo`\n\nThe `getInfo` function takes the `path`, `flags` and `id` arguments and converts those parameters into a structure\nthat is easier to digest to determine what the change was.\n\nThe `FsEventsInfo` has the following shape:\n\n```js\n/**\n * @typedef {'created'|'modified'|'deleted'|'moved'|'root-changed'|'cloned'|'unknown'} FsEventsEvent\n * @typedef {'file'|'directory'|'symlink'} FsEventsType\n */\n{\n \"event\": \"created\", // {FsEventsEvent}\n \"path\": \"file.txt\",\n \"type\": \"file\", // {FsEventsType}\n \"changes\": {\n \"inode\": true, // Had iNode Meta-Information changed\n \"finder\": false, // Had Finder Meta-Data changed\n \"access\": false, // Had access permissions changed\n \"xattrs\": false // Had xAttributes changed\n },\n \"flags\": 0x100000000\n}\n```\n\n## Changelog\n\n- v2.3 supports Apple Silicon ARM CPUs\n- v2 supports node 8.16+ and reduces package size massively\n- v1.2.8 supports node 6+\n- v1.2.7 supports node 4+\n\n## Troubleshooting\n\n- I'm getting `EBADPLATFORM` `Unsupported platform for fsevents` error.\n- It's fine, nothing is broken. fsevents is macos-only. Other platforms are skipped. If you want to hide this warning, report a bug to NPM bugtracker asking them to hide ebadplatform warnings by default.\n\n## License\n\nThe MIT License Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller — see LICENSE file.\n\nVisit our [GitHub page](https://github.com/fsevents/fsevents) and [NPM Page](https://npmjs.org/package/fsevents)\n","repository":{"type":"git","url":"git+https://github.com/fsevents/fsevents.git"},"readmeFilename":"README.md","homepage":"https://github.com/fsevents/fsevents","bugs":{"url":"https://github.com/fsevents/fsevents/issues"},"license":"MIT"}
+{
+ "name": "fsevents",
+ "description": "Native Access to MacOS FSEvents",
+ "dist-tags": {
+ "latest": "2.3.3"
+ },
+ "versions": {
+ "2.3.3": {
+ "name": "fsevents",
+ "version": "2.3.3",
+ "description": "Native Access to MacOS FSEvents",
+ "main": "fsevents.js",
+ "types": "fsevents.d.ts",
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ },
+ "scripts": {
+ "clean": "node-gyp clean && rm -f fsevents.node",
+ "build": "node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean",
+ "test": "/bin/bash ./test.sh 2>/dev/null",
+ "prepublishOnly": "npm run build",
+ "install": "node-gyp rebuild"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/fsevents/fsevents.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/fsevents/fsevents/issues"
+ },
+ "devDependencies": {
+ "node-gyp": "^9.4.0"
+ },
+ "gypfile": true,
+ "gitHead": "2db891e51aa0f2975c5eaaf6aa30f13d720a830a",
+ "_id": "fsevents@2.3.3",
+ "_nodeVersion": "18.17.1",
+ "_npmVersion": "9.6.7",
+ "dist": {
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "shasum": "cac6407785d03675a2a5e1a5305c697b347d90d6",
+ "tarball": "http://localhost:4260/fsevents/fsevents-2.3.3.tgz",
+ "fileCount": 6,
+ "unpackedSize": 173224
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/fsevents/fsevents.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/fsevents/fsevents",
+ "bugs": {
+ "url": "https://github.com/fsevents/fsevents/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/function-bind/registry.json b/tests/registry/npm/function-bind/registry.json
index 5811486cb..37c9f5b3e 100644
--- a/tests/registry/npm/function-bind/registry.json
+++ b/tests/registry/npm/function-bind/registry.json
@@ -1 +1,86 @@
-{"name":"function-bind","description":"Implementation of Function.prototype.bind","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.1":{"name":"function-bind","version":"1.1.1","description":"Implementation of Function.prototype.bind","author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/function-bind.git"},"main":"index","bugs":{"url":"https://github.com/Raynos/function-bind/issues","email":"raynos2@gmail.com"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^12.2.1","covert":"^1.1.0","eslint":"^4.5.0","jscs":"^3.0.7","tape":"^4.8.0"},"license":"MIT","scripts":{"pretest":"npm run lint","test":"npm run tests-only","posttest":"npm run coverage -- --quiet","tests-only":"node test","coverage":"covert test/*.js","lint":"npm run jscs && npm run eslint","jscs":"jscs *.js */*.js","eslint":"eslint *.js */*.js"},"testling":{"files":"test/index.js","browsers":["ie/8..latest","firefox/16..latest","firefox/nightly","chrome/22..latest","chrome/canary","opera/12..latest","opera/next","safari/5.1..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2..latest"]},"gitHead":"1213f807066d1cb8d39a0592d5118f4b1f03de4a","_id":"function-bind@1.1.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","dist":{"integrity":"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==","shasum":"a56899d3ea3c9bab874bb9773b7c5ede92f4895d","tarball":"http://localhost:4260/function-bind/function-bind-1.1.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsVxPdBe+3LZpIF8YZMP7chLM+i5RVRwvtzCd5Yx7zigIgHw6sg2uwy+ItJamfc9+b+XTQOi93JrtZ+8F6YNq3Jz8="}]}}},"readme":"# function-bind\n\n<!--\n [![build status][travis-svg]][travis-url]\n [![NPM version][npm-badge-svg]][npm-url]\n [![Coverage Status][5]][6]\n [![gemnasium Dependency Status][7]][8]\n [![Dependency status][deps-svg]][deps-url]\n [![Dev Dependency status][dev-deps-svg]][dev-deps-url]\n-->\n\n<!-- [![browser support][11]][12] -->\n\nImplementation of function.prototype.bind\n\n## Example\n\nI mainly do this for unit tests I run on phantomjs.\nPhantomJS does not have Function.prototype.bind :(\n\n```js\nFunction.prototype.bind = require(\"function-bind\")\n```\n\n## Installation\n\n`npm install function-bind`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n [travis-svg]: https://travis-ci.org/Raynos/function-bind.svg\n [travis-url]: https://travis-ci.org/Raynos/function-bind\n [npm-badge-svg]: https://badge.fury.io/js/function-bind.svg\n [npm-url]: https://npmjs.org/package/function-bind\n [5]: https://coveralls.io/repos/Raynos/function-bind/badge.png\n [6]: https://coveralls.io/r/Raynos/function-bind\n [7]: https://gemnasium.com/Raynos/function-bind.png\n [8]: https://gemnasium.com/Raynos/function-bind\n [deps-svg]: https://david-dm.org/Raynos/function-bind.svg\n [deps-url]: https://david-dm.org/Raynos/function-bind\n [dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg\n [dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies\n [11]: https://ci.testling.com/Raynos/function-bind.png\n [12]: https://ci.testling.com/Raynos/function-bind\n","author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/function-bind.git"},"homepage":"https://github.com/Raynos/function-bind","bugs":{"url":"https://github.com/Raynos/function-bind/issues","email":"raynos2@gmail.com"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "function-bind",
+ "description": "Implementation of Function.prototype.bind",
+ "dist-tags": {
+ "latest": "1.1.1"
+ },
+ "versions": {
+ "1.1.1": {
+ "name": "function-bind",
+ "version": "1.1.1",
+ "description": "Implementation of Function.prototype.bind",
+ "author": {
+ "name": "Raynos",
+ "email": "raynos2@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/Raynos/function-bind.git"
+ },
+ "main": "index",
+ "bugs": {
+ "url": "https://github.com/Raynos/function-bind/issues",
+ "email": "raynos2@gmail.com"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@ljharb/eslint-config": "^12.2.1",
+ "covert": "^1.1.0",
+ "eslint": "^4.5.0",
+ "jscs": "^3.0.7",
+ "tape": "^4.8.0"
+ },
+ "license": "MIT",
+ "scripts": {
+ "pretest": "npm run lint",
+ "test": "npm run tests-only",
+ "posttest": "npm run coverage -- --quiet",
+ "tests-only": "node test",
+ "coverage": "covert test/*.js",
+ "lint": "npm run jscs && npm run eslint",
+ "jscs": "jscs *.js */*.js",
+ "eslint": "eslint *.js */*.js"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/16..latest",
+ "firefox/nightly",
+ "chrome/22..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "gitHead": "1213f807066d1cb8d39a0592d5118f4b1f03de4a",
+ "_id": "function-bind@1.1.1",
+ "_npmVersion": "5.3.0",
+ "_nodeVersion": "8.4.0",
+ "dist": {
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "shasum": "a56899d3ea3c9bab874bb9773b7c5ede92f4895d",
+ "tarball": "http://localhost:4260/function-bind/function-bind-1.1.1.tgz"
+ }
+ }
+ },
+ "author": {
+ "name": "Raynos",
+ "email": "raynos2@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/Raynos/function-bind.git"
+ },
+ "homepage": "https://github.com/Raynos/function-bind",
+ "bugs": {
+ "url": "https://github.com/Raynos/function-bind/issues",
+ "email": "raynos2@gmail.com"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/get-caller-file/registry.json b/tests/registry/npm/get-caller-file/registry.json
index a6bffcd8d..d3ac37ba8 100644
--- a/tests/registry/npm/get-caller-file/registry.json
+++ b/tests/registry/npm/get-caller-file/registry.json
@@ -1 +1,72 @@
-{"name":"get-caller-file","description":"[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) [![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.a","dist-tags":{"latest":"2.0.5"},"versions":{"2.0.5":{"name":"get-caller-file","version":"2.0.5","description":"[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) [![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.a","main":"index.js","directories":{"test":"tests"},"scripts":{"prepare":"tsc","test":"mocha test","test:debug":"mocha test"},"repository":{"type":"git","url":"git+https://github.com/stefanpenner/get-caller-file.git"},"author":{"name":"Stefan Penner"},"license":"ISC","bugs":{"url":"https://github.com/stefanpenner/get-caller-file/issues"},"devDependencies":{"@types/chai":"^4.1.7","@types/ensure-posix-path":"^1.0.0","@types/mocha":"^5.2.6","@types/node":"^11.10.5","chai":"^4.1.2","ensure-posix-path":"^1.0.1","mocha":"^5.2.0","typescript":"^3.3.3333"},"engines":{"node":"6.* || 8.* || >= 10.*"},"gitHead":"2383bf9e98ed3c568ff69d7586cf59c0f1dcb9d3","_id":"get-caller-file@2.0.5","_npmVersion":"6.2.0","_nodeVersion":"10.9.0","dist":{"integrity":"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==","shasum":"4f94412a82db32f36e3b0b9741f8a97feb031f7e","tarball":"http://localhost:4260/get-caller-file/get-caller-file-2.0.5.tgz","fileCount":6,"unpackedSize":4719,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchDSvCRA9TVsSAnZWagAA+fkP/2U1MPEJqJbpnldZojNu\n2nIJyOVpRXH0N89M8DLqJdG0WL91oWdxkKgPowueS6WSTazZidlvBW+mbVSV\nDR05kIMKl+FPSErdaJRCRia9n8KE5QMHswLou+gGp3B/ih8s+EtATgkbRjWJ\nBHSY1s/Kk7zfg9HN3AAZNnqgbbU7UkEA2CdIazeZ20Pdbv9FI4VeRU0pec03\nJhGy1rz9g84KtdWpd/v7zTHSAvzPNTPHEYAD1WwiiSs8k2V5F4PBGSp3ibE3\nnjSjbvxXq71GZOoL/wyPwoOMp6cnLsWejITymECCHzMh7FdXS7jvfNGP9tIR\nMYOzEekjfmzNKQqFKsEb/PGDZJ3glxdODZYssdNPy7adeHJgLzNyn7lJvlny\nbRtCHv0NaqldlrEP4b67Di/25K/Zm/gBBlz39rR/XwYz8WHAH+mm0CIiDGhG\nM6tRFxV2/FUAQDhOtp1jb+GM+kkCDUewuNyCQnyv7Yjijz/0q+0bPTCP/145\n/YQZctFMjfO7EJV9jZEDkBvuEfnuPUEPMAI5Asnqofvs0X3R1W1DoX5aZpoD\n1ZtfgZmHOj3c+Qg5TlucPjZ1BlR3mD0lCGElM9UwFMKCfza5J53xOjA4fY0T\n5rVVqbCOSM3tTYjaeL04N7xnHy2pikgplCfgZpRK7NmTVARih5Ri+m4jYr0s\nWucD\r\n=ppms\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG9u4KIkcDrP0Rl0wG1LBp0MZzbdp85Alg0IQbkB8jTEAiEA7/PnKH2QuHJAJlbfouS2tFzziPkSi6SMskyl0I6A9FI="}]},"_hasShrinkwrap":false}},"readme":"# get-caller-file\n\n[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file)\n[![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.appveyor.com/project/embercli/get-caller-file/branch/master)\n\nThis is a utility, which allows a function to figure out from which file it was invoked. It does so by inspecting v8's stack trace at the time it is invoked.\n\nInspired by http://stackoverflow.com/questions/13227489\n\n*note: this relies on Node/V8 specific APIs, as such other runtimes may not work*\n\n## Installation\n\n```bash\nyarn add get-caller-file\n```\n\n## Usage\n\nGiven:\n\n```js\n// ./foo.js\nconst getCallerFile = require('get-caller-file');\n\nmodule.exports = function() {\n return getCallerFile(); // figures out who called it\n};\n```\n\n```js\n// index.js\nconst foo = require('./foo');\n\nfoo() // => /full/path/to/this/file/index.js\n```\n\n\n## Options:\n\n* `getCallerFile(position = 2)`: where position is stack frame whos fileName we want.\n","homepage":"https://github.com/stefanpenner/get-caller-file#readme","repository":{"type":"git","url":"git+https://github.com/stefanpenner/get-caller-file.git"},"author":{"name":"Stefan Penner"},"bugs":{"url":"https://github.com/stefanpenner/get-caller-file/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "get-caller-file",
+ "description": "[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) [![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.a",
+ "dist-tags": {
+ "latest": "2.0.5"
+ },
+ "versions": {
+ "2.0.5": {
+ "name": "get-caller-file",
+ "version": "2.0.5",
+ "description": "[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) [![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.a",
+ "main": "index.js",
+ "directories": {
+ "test": "tests"
+ },
+ "scripts": {
+ "prepare": "tsc",
+ "test": "mocha test",
+ "test:debug": "mocha test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/stefanpenner/get-caller-file.git"
+ },
+ "author": {
+ "name": "Stefan Penner"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/stefanpenner/get-caller-file/issues"
+ },
+ "devDependencies": {
+ "@types/chai": "^4.1.7",
+ "@types/ensure-posix-path": "^1.0.0",
+ "@types/mocha": "^5.2.6",
+ "@types/node": "^11.10.5",
+ "chai": "^4.1.2",
+ "ensure-posix-path": "^1.0.1",
+ "mocha": "^5.2.0",
+ "typescript": "^3.3.3333"
+ },
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ },
+ "gitHead": "2383bf9e98ed3c568ff69d7586cf59c0f1dcb9d3",
+ "_id": "get-caller-file@2.0.5",
+ "_npmVersion": "6.2.0",
+ "_nodeVersion": "10.9.0",
+ "dist": {
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "shasum": "4f94412a82db32f36e3b0b9741f8a97feb031f7e",
+ "tarball": "http://localhost:4260/get-caller-file/get-caller-file-2.0.5.tgz",
+ "fileCount": 6,
+ "unpackedSize": 4719
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/stefanpenner/get-caller-file#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/stefanpenner/get-caller-file.git"
+ },
+ "author": {
+ "name": "Stefan Penner"
+ },
+ "bugs": {
+ "url": "https://github.com/stefanpenner/get-caller-file/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/get-func-name/registry.json b/tests/registry/npm/get-func-name/registry.json
index 03fb17861..359aee743 100644
--- a/tests/registry/npm/get-func-name/registry.json
+++ b/tests/registry/npm/get-func-name/registry.json
@@ -1 +1,116 @@
-{"name":"get-func-name","description":"Utility for getting a function's name for node and the browser","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"get-func-name","description":"Utility for getting a function's name for node and the browser","license":"MIT","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"files":["index.js","get-func-name.js"],"main":"./index.js","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/get-func-name.git"},"scripts":{"build":"browserify --bare $npm_package_main --standalone getFuncName -o get-func-name.js","lint":"eslint --ignore-path .gitignore .","prepublish":"npm run build","semantic-release":"semantic-release pre && npm publish && semantic-release post","pretest":"npm run lint","test":"npm run test:node && npm run test:browser && npm run upload-coverage","test:browser":"karma start --singleRun=true","test:node":"istanbul cover _mocha","upload-coverage":"lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg"}},"eslintConfig":{"extends":["strict/es5"],"env":{"es6":true},"globals":{"HTMLElement":false},"rules":{"complexity":0,"max-statements":0}},"dependencies":{},"devDependencies":{"browserify":"^13.0.0","browserify-istanbul":"^2.0.0","coveralls":"2.11.14","eslint":"^2.4.0","eslint-config-strict":"^9.1.0","eslint-plugin-filenames":"^1.1.0","ghooks":"^1.0.1","istanbul":"^0.4.2","karma":"^1.3.0","karma-browserify":"^5.0.2","karma-coverage":"^1.1.1","karma-mocha":"^1.2.0","karma-phantomjs-launcher":"^1.0.0","karma-sauce-launcher":"^1.0.0","lcov-result-merger":"^1.0.2","mocha":"^3.1.2","phantomjs-prebuilt":"^2.1.5","semantic-release":"^4.3.5","simple-assert":"^1.0.0","travis-after-all":"^1.4.4","validate-commit-msg":"^2.3.1"},"engines":{"node":"*"},"version":"2.0.0","gitHead":"fbd5eb57742d6e7669a857de85925559b9a830bb","bugs":{"url":"https://github.com/chaijs/get-func-name/issues"},"_id":"get-func-name@2.0.0","_shasum":"ead774abee72e20409433a066366023dd6887a41","_from":".","_npmVersion":"4.1.1","_nodeVersion":"0.10.48","dist":{"shasum":"ead774abee72e20409433a066366023dd6887a41","tarball":"http://localhost:4260/get-func-name/get-func-name-2.0.0.tgz","integrity":"sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICp7WV/4PxPCjSMc8LgR+WY3ZOyLdI5KXu2RVK8pQ47QAiBl8cB0Xa33Lh4CCx8VkCznbXVimvN6r4zv3UGsqbVorw=="}]}}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"ChaiJS\" src=\"http://chaijs.com/img/chai-logo.png\"/>\n <br>\n get-func-name\n </a>\n</h1>\n\n<p align=center>\n Utility for getting a function's name for <a href=\"http://nodejs.org\">node</a> and the browser.\n</p>\n\n<p align=center>\n <a href=\"./LICENSE\">\n <img\n alt=\"license:mit\"\n src=\"https://img.shields.io/badge/license-mit-green.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://github.com/chaijs/get-func-name/releases\">\n <img\n alt=\"tag:?\"\n src=\"https://img.shields.io/github/tag/chaijs/get-func-name.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://travis-ci.org/chaijs/get-func-name\">\n <img\n alt=\"build:?\"\n src=\"https://img.shields.io/travis/chaijs/get-func-name/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://coveralls.io/r/chaijs/get-func-name\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/coveralls/chaijs/get-func-name/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/get-func-name\">\n <img\n alt=\"npm:?\"\n src=\"https://img.shields.io/npm/v/get-func-name.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/get-func-name\">\n <img\n alt=\"dependencies:?\"\n src=\"https://img.shields.io/npm/dm/get-func-name.svg?style=flat-square\"\n />\n </a>\n <a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/get-func-name.svg?style=flat-square\"\n />\n </a>\n <br/>\n <a href=\"https://saucelabs.com/u/chaijs-get-func-name\">\n <img\n alt=\"Selenium Test Status\"\n src=\"https://saucelabs.com/browser-matrix/chaijs-get-func-name.svg\"\n />\n </a>\n <br>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/chai\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n</p>\n\n## What is get-func-name?\n\nThis is a module to retrieve a function's name securely and consistently both in NodeJS and the browser.\n\n## Installation\n\n### Node.js\n\n`get-func-name` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install get-func-name\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `get-func-name.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/get-func-name/get-func-name.js\"></script>\n```\n\n## Usage\n\nThe module `get-func-name` exports the following method:\n\n* `getFuncName(fn)` - Returns the name of a function.\n\n```js\nvar getFuncName = require('get-func-name');\n```\n\n#### .getFuncName(fun)\n\n```js\nvar getFuncName = require('get-func-name');\n\nvar unknownFunction = function myCoolFunction(word) {\n return word + 'is cool'; \n};\n\nvar anonymousFunction = (function () {\n return function () {};\n}());\n\ngetFuncName(unknownFunction) // 'myCoolFunction'\ngetFuncName(anonymousFunction) // ''\n```\n","homepage":"https://github.com/chaijs/get-func-name#readme","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/get-func-name.git"},"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"bugs":{"url":"https://github.com/chaijs/get-func-name/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "get-func-name",
+ "description": "Utility for getting a function's name for node and the browser",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "get-func-name",
+ "description": "Utility for getting a function's name for node and the browser",
+ "license": "MIT",
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "files": [
+ "index.js",
+ "get-func-name.js"
+ ],
+ "main": "./index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/get-func-name.git"
+ },
+ "scripts": {
+ "build": "browserify --bare $npm_package_main --standalone getFuncName -o get-func-name.js",
+ "lint": "eslint --ignore-path .gitignore .",
+ "prepublish": "npm run build",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "pretest": "npm run lint",
+ "test": "npm run test:node && npm run test:browser && npm run upload-coverage",
+ "test:browser": "karma start --singleRun=true",
+ "test:node": "istanbul cover _mocha",
+ "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"
+ },
+ "config": {
+ "ghooks": {
+ "commit-msg": "validate-commit-msg"
+ }
+ },
+ "eslintConfig": {
+ "extends": [
+ "strict/es5"
+ ],
+ "env": {
+ "es6": true
+ },
+ "globals": {
+ "HTMLElement": false
+ },
+ "rules": {
+ "complexity": 0,
+ "max-statements": 0
+ }
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "browserify": "^13.0.0",
+ "browserify-istanbul": "^2.0.0",
+ "coveralls": "2.11.14",
+ "eslint": "^2.4.0",
+ "eslint-config-strict": "^9.1.0",
+ "eslint-plugin-filenames": "^1.1.0",
+ "ghooks": "^1.0.1",
+ "istanbul": "^0.4.2",
+ "karma": "^1.3.0",
+ "karma-browserify": "^5.0.2",
+ "karma-coverage": "^1.1.1",
+ "karma-mocha": "^1.2.0",
+ "karma-phantomjs-launcher": "^1.0.0",
+ "karma-sauce-launcher": "^1.0.0",
+ "lcov-result-merger": "^1.0.2",
+ "mocha": "^3.1.2",
+ "phantomjs-prebuilt": "^2.1.5",
+ "semantic-release": "^4.3.5",
+ "simple-assert": "^1.0.0",
+ "travis-after-all": "^1.4.4",
+ "validate-commit-msg": "^2.3.1"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "version": "2.0.0",
+ "gitHead": "fbd5eb57742d6e7669a857de85925559b9a830bb",
+ "bugs": {
+ "url": "https://github.com/chaijs/get-func-name/issues"
+ },
+ "_id": "get-func-name@2.0.0",
+ "_shasum": "ead774abee72e20409433a066366023dd6887a41",
+ "_from": ".",
+ "_npmVersion": "4.1.1",
+ "_nodeVersion": "0.10.48",
+ "dist": {
+ "shasum": "ead774abee72e20409433a066366023dd6887a41",
+ "tarball": "http://localhost:4260/get-func-name/get-func-name-2.0.0.tgz",
+ "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig=="
+ }
+ }
+ },
+ "homepage": "https://github.com/chaijs/get-func-name#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/get-func-name.git"
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chaijs/get-func-name/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/get-intrinsic/registry.json b/tests/registry/npm/get-intrinsic/registry.json
index bb5c3f1e4..e2316a06c 100644
--- a/tests/registry/npm/get-intrinsic/registry.json
+++ b/tests/registry/npm/get-intrinsic/registry.json
@@ -1 +1,121 @@
-{"name":"get-intrinsic","dist-tags":{"latest":"1.2.0"},"versions":{"1.2.0":{"name":"get-intrinsic","version":"1.2.0","description":"Get and robustly cache all JS language-level intrinsics at first require time","main":"index.js","exports":{".":[{"default":"./index.js"},"./index.js"],"./package.json":"./package.json"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublish":"not-in-publish || npm run prepublishOnly","prepublishOnly":"safe-publish-latest","prelint":"evalmd README.md","lint":"eslint --ext=.js,.mjs .","pretest":"npm run lint","tests-only":"nyc tape 'test/**/*.js'","test":"npm run tests-only","posttest":"aud --production","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"repository":{"type":"git","url":"git+https://github.com/ljharb/get-intrinsic.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"funding":{"url":"https://github.com/sponsors/ljharb"},"license":"MIT","bugs":{"url":"https://github.com/ljharb/get-intrinsic/issues"},"devDependencies":{"@ljharb/eslint-config":"^21.0.1","aud":"^2.0.2","auto-changelog":"^2.4.0","call-bind":"^1.0.2","es-abstract":"^1.21.1","es-value-fixtures":"^1.4.2","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","gopd":"^1.0.1","make-async-function":"^1.0.0","make-async-generator-function":"^1.0.0","make-generator-function":"^2.0.0","mock-property":"^1.0.0","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.3","safe-publish-latest":"^2.0.0","tape":"^5.6.3"},"auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"dependencies":{"function-bind":"^1.1.1","has":"^1.0.3","has-symbols":"^1.0.3"},"testling":{"files":"test/GetIntrinsic.js"},"publishConfig":{"ignore":[".github/workflows"]},"gitHead":"0b60d7ac9d93e8824a36ddd52635be1fc13758d1","_id":"get-intrinsic@1.2.0","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==","shasum":"7ad1dc0535f3a2904bba075772763e5051f6d05f","tarball":"http://localhost:4260/get-intrinsic/get-intrinsic-1.2.0.tgz","fileCount":9,"unpackedSize":38691,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDb29OYVbJKfex+ljyYg1fRxZiHvAcbeMgBRIcq6cP6MgIhAMPAotqdPrJxkwnAeSq+RDK//aoFWESiSJuvWBmlhUAH"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjykKtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUEQ/+PfWdGnewUZa86B0H4haSxBRBlwuFGg7GpdoEhJ3Ll1A9p3Jb\r\nvU2+9RyeNp1p2LNrktOAenAcs7I3dLl0dAspHjjL3uLNhPkrlpeVqOktXs+H\r\n7l0VaAOrLZVi1f+akY117IO0OO6FwRLV42VdM7QIH2BcfXuCyDDke41rq5oS\r\nR9I+8C2SCW2/OxXcMG9nYOpW494hmHRRYh9mpovJUOpAerMUgy334rK72ArR\r\nNsgnAu4luu/7RmC5BNPS26Q7NVCVf7THdx2v3OSkgFvTrdS+wu0NhqkakppS\r\nfGTYkR1m+7vX9YLHIokoIDjHtHaNPMUb7e51OxegjtPEh7FBacfRs0bxfx7Z\r\nJLhYAbjSanGci/gfC2gT1YIPUgydWbx1Ejmol9j7QmA9BQuHSxHu+SiaRA46\r\n+F/Fzbkp1sC0gqo4qGN04Lw8+2g2DHGfBygd6vcUtnaHMz2coCF4rlvcW2fN\r\nz6tT4pcE/AWtC6l9yCWzAWDjEZjF2kBycuiY36IlhhPjtj3qiGQqnTPLL10d\r\nUWA9ZTqFH2k+o4tKhz8g1kQeBApgpRgr9FfukaNq/TZi2tguQ2MlHQ+0R0ZC\r\nZZRtnin4nEpjZ+GkAcfnm9QCrripiWwDtSgXsKvgSICOdp9urrSgfcEAuEvM\r\nrTjOosJAUVohG06+klaUIe6mIssavg3AgjU=\r\n=CxS4\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"Get and robustly cache all JS language-level intrinsics at first require time","homepage":"https://github.com/ljharb/get-intrinsic#readme","repository":{"type":"git","url":"git+https://github.com/ljharb/get-intrinsic.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"bugs":{"url":"https://github.com/ljharb/get-intrinsic/issues"},"license":"MIT","readme":"# get-intrinsic <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nGet and robustly cache all JS language-level intrinsics at first require time.\n\nSee the syntax described [in the JS spec](https://tc39.es/ecma262/#sec-well-known-intrinsic-objects) for reference.\n\n## Example\n\n```js\nvar GetIntrinsic = require('get-intrinsic');\nvar assert = require('assert');\n\n// static methods\nassert.equal(GetIntrinsic('%Math.pow%'), Math.pow);\nassert.equal(Math.pow(2, 3), 8);\nassert.equal(GetIntrinsic('%Math.pow%')(2, 3), 8);\ndelete Math.pow;\nassert.equal(GetIntrinsic('%Math.pow%')(2, 3), 8);\n\n// instance methods\nvar arr = [1];\nassert.equal(GetIntrinsic('%Array.prototype.push%'), Array.prototype.push);\nassert.deepEqual(arr, [1]);\n\narr.push(2);\nassert.deepEqual(arr, [1, 2]);\n\nGetIntrinsic('%Array.prototype.push%').call(arr, 3);\nassert.deepEqual(arr, [1, 2, 3]);\n\ndelete Array.prototype.push;\nGetIntrinsic('%Array.prototype.push%').call(arr, 4);\nassert.deepEqual(arr, [1, 2, 3, 4]);\n\n// missing features\ndelete JSON.parse; // to simulate a real intrinsic that is missing in the environment\nassert.throws(() => GetIntrinsic('%JSON.parse%'));\nassert.equal(undefined, GetIntrinsic('%JSON.parse%', true));\n```\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n[package-url]: https://npmjs.org/package/get-intrinsic\n[npm-version-svg]: https://versionbadg.es/ljharb/get-intrinsic.svg\n[deps-svg]: https://david-dm.org/ljharb/get-intrinsic.svg\n[deps-url]: https://david-dm.org/ljharb/get-intrinsic\n[dev-deps-svg]: https://david-dm.org/ljharb/get-intrinsic/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/get-intrinsic#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/get-intrinsic.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/get-intrinsic.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/get-intrinsic.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=get-intrinsic\n[codecov-image]: https://codecov.io/gh/ljharb/get-intrinsic/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/get-intrinsic/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/get-intrinsic\n[actions-url]: https://github.com/ljharb/get-intrinsic/actions\n","readmeFilename":"README.md"}
+{
+ "name": "get-intrinsic",
+ "dist-tags": {
+ "latest": "1.2.0"
+ },
+ "versions": {
+ "1.2.0": {
+ "name": "get-intrinsic",
+ "version": "1.2.0",
+ "description": "Get and robustly cache all JS language-level intrinsics at first require time",
+ "main": "index.js",
+ "exports": {
+ ".": [
+ {
+ "default": "./index.js"
+ },
+ "./index.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "prelint": "evalmd README.md",
+ "lint": "eslint --ext=.js,.mjs .",
+ "pretest": "npm run lint",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ljharb/get-intrinsic.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ljharb/get-intrinsic/issues"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.0.1",
+ "aud": "^2.0.2",
+ "auto-changelog": "^2.4.0",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.21.1",
+ "es-value-fixtures": "^1.4.2",
+ "eslint": "=8.8.0",
+ "evalmd": "^0.0.19",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "make-async-function": "^1.0.0",
+ "make-async-generator-function": "^1.0.0",
+ "make-generator-function": "^2.0.0",
+ "mock-property": "^1.0.0",
+ "npmignore": "^0.3.0",
+ "nyc": "^10.3.2",
+ "object-inspect": "^1.12.3",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.6.3"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ },
+ "testling": {
+ "files": "test/GetIntrinsic.js"
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows"
+ ]
+ },
+ "gitHead": "0b60d7ac9d93e8824a36ddd52635be1fc13758d1",
+ "_id": "get-intrinsic@1.2.0",
+ "_nodeVersion": "19.4.0",
+ "_npmVersion": "9.2.0",
+ "dist": {
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+ "shasum": "7ad1dc0535f3a2904bba075772763e5051f6d05f",
+ "tarball": "http://localhost:4260/get-intrinsic/get-intrinsic-1.2.0.tgz",
+ "fileCount": 9,
+ "unpackedSize": 38691
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Get and robustly cache all JS language-level intrinsics at first require time",
+ "homepage": "https://github.com/ljharb/get-intrinsic#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ljharb/get-intrinsic.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/get-intrinsic/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/get-stdin/registry.json b/tests/registry/npm/get-stdin/registry.json
index 27c63988e..9b8ab9a50 100644
--- a/tests/registry/npm/get-stdin/registry.json
+++ b/tests/registry/npm/get-stdin/registry.json
@@ -1 +1,69 @@
-{"name":"get-stdin","description":"Get stdin as a string or buffer","dist-tags":{"latest":"8.0.0"},"versions":{"8.0.0":{"name":"get-stdin","version":"8.0.0","description":"Get stdin as a string or buffer","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/get-stdin.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"engines":{"node":">=10"},"scripts":{"test":"xo && ava test.js test-buffer.js && echo unicorns | node test-real.js && tsd"},"devDependencies":{"@types/node":"^13.13.5","ava":"^2.4.0","delay":"^4.2.0","tsd":"^0.11.0","xo":"^0.24.0"},"gitHead":"07288e101242054df3c197abc5559458af6c78ba","bugs":{"url":"https://github.com/sindresorhus/get-stdin/issues"},"_id":"get-stdin@8.0.0","_nodeVersion":"10.20.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==","shasum":"cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53","tarball":"http://localhost:4260/get-stdin/get-stdin-8.0.0.tgz","fileCount":5,"unpackedSize":4706,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeum+fCRA9TVsSAnZWagAAcbEQAJJ3LNFhDyx27qf3mZI2\n6gyySUh4v+Yu7Hdn0ub7utiCGqBkXI5oDrFzuFij/VLj2IU7iqL8eEf0z8Jj\nE7kt6+sHP1aKznVb/nDRAEgN1fhqYDvgfPxPcDiHpSpnqbmgf0iJSGzc6DRz\nMO8HumeNlFp/qXEAXTHO22SHbT0uBFTPA5csekdmOWesBhxkbWrBlUHgQTsM\nq4U4ja8MRFn/p0/3NpUWsylcNqXeNpaYmAnCm8PJKxGah1MJ/FFrOaRRQFPM\nveWBbxYERdu1VrXsnvgWmvCvUuBjZcGJbeFP96ozbgJ6xKRgNcSEhi2aJTzB\ng4/0svekPJfiKN4RqobzOPZEhlgIjYLS0J4lQHz4fpOCwYME+SZze3nvhVlJ\nBU/+PuSu7aLb91+VZP5aWj5/Nd+piiKILUjdPS2DtUULrg5NOzJAdlslx3Qi\ny+cfdC6onNK3kSf0Wat68qUA1oXEHiAaQ7g0NI2PvPyvJqBNhsAh8L9pZGo7\nYVH3bJp9J7Vw2kcjtA/1jrXiRmrXyg45aX9XPzyk2TtyMFYjBr5yXNfdcaMn\nrXxgyULt6NUXVxNWTnCGG9U3UmyDMVjVAHrMWBtkTJNUF7pQBVrSFAO38lKw\nen1afewK4lKyoV3XF2HMJik8sLg4o9ADuSru+SgVtVxTM57+Lhy/FmTeAklv\nmlgx\r\n=39cJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDf37RkwpfJaLf7BKD2w2HnOBtZz58MdWM28Byt29r/pAIgYB747Ikc2emWSZFR4g3enzZvN0GTLkI5vkpI0rEhA1A="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# get-stdin\n\n> Get [stdin](https://nodejs.org/api/process.html#process_process_stdin) as a string or buffer\n\n## Install\n\n```\n$ npm install get-stdin\n```\n\n## Usage\n\n```js\n// example.js\nimport getStdin from 'get-stdin';\n\nconsole.log(await getStdin());\n//=> 'unicorns'\n```\n\n```\n$ echo unicorns | node example.js\nunicorns\n```\n\n## API\n\nBoth methods returns a promise that is resolved when the `end` event fires on the `stdin` stream, indicating that there is no more data to be read.\n\n### getStdin()\n\nGet `stdin` as a `string`.\n\nIn a TTY context, a promise that resolves to an empty `string` is returned.\n\n### getStdin.buffer()\n\nGet `stdin` as a `Buffer`.\n\nIn a TTY context, a promise that resolves to an empty `Buffer` is returned.\n\n## Related\n\n- [get-stream](https://github.com/sindresorhus/get-stream) - Get a stream as a string or buffer\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-get-stdin?utm_source=npm-get-stdin&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","readmeFilename":"readme.md","homepage":"https://github.com/sindresorhus/get-stdin#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/get-stdin.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/get-stdin/issues"},"license":"MIT"}
+{
+ "name": "get-stdin",
+ "description": "Get stdin as a string or buffer",
+ "dist-tags": {
+ "latest": "8.0.0"
+ },
+ "versions": {
+ "8.0.0": {
+ "name": "get-stdin",
+ "version": "8.0.0",
+ "description": "Get stdin as a string or buffer",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/get-stdin.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && ava test.js test-buffer.js && echo unicorns | node test-real.js && tsd"
+ },
+ "devDependencies": {
+ "@types/node": "^13.13.5",
+ "ava": "^2.4.0",
+ "delay": "^4.2.0",
+ "tsd": "^0.11.0",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "07288e101242054df3c197abc5559458af6c78ba",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/get-stdin/issues"
+ },
+ "_id": "get-stdin@8.0.0",
+ "_nodeVersion": "10.20.1",
+ "_npmVersion": "6.14.5",
+ "dist": {
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "shasum": "cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53",
+ "tarball": "http://localhost:4260/get-stdin/get-stdin-8.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4706
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "readmeFilename": "readme.md",
+ "homepage": "https://github.com/sindresorhus/get-stdin#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/get-stdin.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/get-stdin/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/glob/registry.json b/tests/registry/npm/glob/registry.json
index 8d3c24441..fe6c9f7ce 100644
--- a/tests/registry/npm/glob/registry.json
+++ b/tests/registry/npm/glob/registry.json
@@ -1 +1,144 @@
-{"name":"glob","dist-tags":{"latest":"10.4.4"},"versions":{"10.4.4":{"name":"glob","version":"10.4.4","author":{"url":"https://blog.izs.me/","name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"ISC","_id":"glob@10.4.4","bugs":{"url":"https://github.com/isaacs/node-glob/issues"},"bin":{"glob":"dist/esm/bin.mjs"},"tap":{"before":"test/00-setup.ts"},"dist":{"shasum":"d60943feb6f8140522117e6576a923b715718380","tarball":"http://localhost:4260/glob/glob-10.4.4.tgz","fileCount":65,"integrity":"sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==","signatures":[{"sig":"MEUCIQCgHPF8XN3tuyJVZY/mk6XGnjI0czNt8rbIMYMlqgrw1QIgXnAz8HxtRhDCXenUQgfjYcEXPOH6Ylq+5q4a8fwDERc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":475328},"main":"./dist/commonjs/index.js","tshy":{"main":true,"exports":{".":"./src/index.ts","./package.json":"./package.json"}},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":"14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","source":"./src/index.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","source":"./src/index.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/isaacs"},"gitHead":"78275168e1bbc7a61e372af1ba58307c27faf0cb","scripts":{"prof":"bash prof.sh","snap":"tap","test":"tap","bench":"bash benchmark.sh","format":"prettier --write . --log-level warn","prepare":"tshy","preprof":"npm run prepare","presnap":"npm run prepare","pretest":"npm run prepare","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts","prebench":"npm run prepare","profclean":"rm -f v8.log profile.txt","benchclean":"node benchclean.cjs","prepublish":"npm run benchclean","preversion":"npm test","test-regen":"npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags"},"prettier":{"semi":false,"useTabs":false,"tabWidth":2,"endOfLine":"lf","printWidth":75,"arrowParens":"avoid","singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"experimentalTernaries":true},"repository":{"url":"git://github.com/isaacs/node-glob.git","type":"git"},"_npmVersion":"10.7.0","description":"the most correct and second fastest glob implementation in JavaScript","directories":{},"_nodeVersion":"20.13.1","dependencies":{"minipass":"^7.1.2","jackspeak":"^3.1.2","minimatch":"^9.0.4","path-scurry":"^1.11.1","foreground-child":"^3.1.0","package-json-from-dist":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^19.0.0","tshy":"^1.14.0","memfs":"^3.4.13","mkdirp":"^3.0.1","rimraf":"^5.0.7","typedoc":"^0.25.12","prettier":"^3.2.5","@types/node":"^20.11.30","sync-content":"^1.0.2"}}},"bugs":{"url":"https://github.com/isaacs/node-glob/issues"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://blog.izs.me/"},"license":"ISC","homepage":"https://github.com/isaacs/node-glob#readme","repository":{"type":"git","url":"git://github.com/isaacs/node-glob.git"},"description":"the most correct and second fastest glob implementation in JavaScript","readme":"# Glob\n\nMatch files using the patterns the shell uses.\n\nThe most correct and second fastest glob implementation in\nJavaScript. (See **Comparison to Other JavaScript Glob\nImplementations** at the bottom of this readme.)\n\n![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png)\n\n## Usage\n\nInstall with npm\n\n```\nnpm i glob\n```\n\n**Note** the npm package name is _not_ `node-glob` that's a\ndifferent thing that was abandoned years ago. Just `glob`.\n\n```js\n// load using import\nimport { glob, globSync, globStream, globStreamSync, Glob } from 'glob'\n// or using commonjs, that's fine, too\nconst {\n glob,\n globSync,\n globStream,\n globStreamSync,\n Glob,\n} = require('glob')\n\n// the main glob() and globSync() resolve/return array of filenames\n\n// all js files, but don't look in node_modules\nconst jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })\n\n// pass in a signal to cancel the glob walk\nconst stopAfter100ms = await glob('**/*.css', {\n signal: AbortSignal.timeout(100),\n})\n\n// multiple patterns supported as well\nconst images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])\n\n// but of course you can do that with the glob pattern also\n// the sync function is the same, just returns a string[] instead\n// of Promise<string[]>\nconst imagesAlt = globSync('{css,public}/*.{png,jpeg}')\n\n// you can also stream them, this is a Minipass stream\nconst filesStream = globStream(['**/*.dat', 'logs/**/*.log'])\n\n// construct a Glob object if you wanna do it that way, which\n// allows for much faster walks if you have to look in the same\n// folder multiple times.\nconst g = new Glob('**/foo', {})\n// glob objects are async iterators, can also do globIterate() or\n// g.iterate(), same deal\nfor await (const file of g) {\n console.log('found a foo file:', file)\n}\n// pass a glob as the glob options to reuse its settings and caches\nconst g2 = new Glob('**/bar', g)\n// sync iteration works as well\nfor (const file of g2) {\n console.log('found a bar file:', file)\n}\n\n// you can also pass withFileTypes: true to get Path objects\n// these are like a Dirent, but with some more added powers\n// check out http://npm.im/path-scurry for more info on their API\nconst g3 = new Glob('**/baz/**', { withFileTypes: true })\ng3.stream().on('data', path => {\n console.log(\n 'got a path object',\n path.fullpath(),\n path.isDirectory(),\n path.readdirSync().map(e => e.name),\n )\n})\n\n// if you use stat:true and withFileTypes, you can sort results\n// by things like modified time, filter by permission mode, etc.\n// All Stats fields will be available in that case. Slightly\n// slower, though.\n// For example:\nconst results = await glob('**', { stat: true, withFileTypes: true })\n\nconst timeSortedFiles = results\n .sort((a, b) => a.mtimeMs - b.mtimeMs)\n .map(path => path.fullpath())\n\nconst groupReadableFiles = results\n .filter(path => path.mode & 0o040)\n .map(path => path.fullpath())\n\n// custom ignores can be done like this, for example by saying\n// you'll ignore all markdown files, and all folders named 'docs'\nconst customIgnoreResults = await glob('**', {\n ignore: {\n ignored: p => /\\.md$/.test(p.name),\n childrenIgnored: p => p.isNamed('docs'),\n },\n})\n\n// another fun use case, only return files with the same name as\n// their parent folder, plus either `.ts` or `.js`\nconst folderNamedModules = await glob('**/*.{ts,js}', {\n ignore: {\n ignored: p => {\n const pp = p.parent\n return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))\n },\n },\n})\n\n// find all files edited in the last hour, to do this, we ignore\n// all of them that are more than an hour old\nconst newFiles = await glob('**', {\n // need stat so we have mtime\n stat: true,\n // only want the files, not the dirs\n nodir: true,\n ignore: {\n ignored: p => {\n return new Date() - p.mtime > 60 * 60 * 1000\n },\n // could add similar childrenIgnored here as well, but\n // directory mtime is inconsistent across platforms, so\n // probably better not to, unless you know the system\n // tracks this reliably.\n },\n})\n```\n\n**Note** Glob patterns should always use `/` as a path separator,\neven on Windows systems, as `\\` is used to escape glob\ncharacters. If you wish to use `\\` as a path separator _instead\nof_ using it as an escape character on Windows platforms, you may\nset `windowsPathsNoEscape:true` in the options. In this mode,\nspecial glob characters cannot be escaped, making it impossible\nto match a literal `*` `?` and so on in filenames.\n\n## Command Line Interface\n\n```\n$ glob -h\n\nUsage:\n glob [options] [<pattern> [<pattern> ...]]\n\nExpand the positional glob expression arguments into any matching file system\npaths found.\n\n -c<command> --cmd=<command>\n Run the command provided, passing the glob expression\n matches as arguments.\n\n -A --all By default, the glob cli command will not expand any\n arguments that are an exact match to a file on disk.\n\n This prevents double-expanding, in case the shell\n expands an argument whose filename is a glob\n expression.\n\n For example, if 'app/*.ts' would match 'app/[id].ts',\n then on Windows powershell or cmd.exe, 'glob app/*.ts'\n will expand to 'app/[id].ts', as expected. However, in\n posix shells such as bash or zsh, the shell will first\n expand 'app/*.ts' to a list of filenames. Then glob\n will look for a file matching 'app/[id].ts' (ie,\n 'app/i.ts' or 'app/d.ts'), which is unexpected.\n\n Setting '--all' prevents this behavior, causing glob to\n treat ALL patterns as glob expressions to be expanded,\n even if they are an exact match to a file on disk.\n\n When setting this option, be sure to enquote arguments\n so that the shell will not expand them prior to passing\n them to the glob command process.\n\n -a --absolute Expand to absolute paths\n -d --dot-relative Prepend './' on relative matches\n -m --mark Append a / on any directories matched\n -x --posix Always resolve to posix style paths, using '/' as the\n directory separator, even on Windows. Drive letter\n absolute matches on Windows will be expanded to their\n full resolved UNC maths, eg instead of 'C:\\foo\\bar', it\n will expand to '//?/C:/foo/bar'.\n\n -f --follow Follow symlinked directories when expanding '**'\n -R --realpath Call 'fs.realpath' on all of the results. In the case\n of an entry that cannot be resolved, the entry is\n omitted. This incurs a slight performance penalty, of\n course, because of the added system calls.\n\n -s --stat Call 'fs.lstat' on all entries, whether required or not\n to determine if it's a valid match.\n\n -b --match-base Perform a basename-only match if the pattern does not\n contain any slash characters. That is, '*.js' would be\n treated as equivalent to '**/*.js', matching js files\n in all directories.\n\n --dot Allow patterns to match files/directories that start\n with '.', even if the pattern does not start with '.'\n\n --nobrace Do not expand {...} patterns\n --nocase Perform a case-insensitive match. This defaults to\n 'true' on macOS and Windows platforms, and false on all\n others.\n\n Note: 'nocase' should only be explicitly set when it is\n known that the filesystem's case sensitivity differs\n from the platform default. If set 'true' on\n case-insensitive file systems, then the walk may return\n more or less results than expected.\n\n --nodir Do not match directories, only files.\n\n Note: to *only* match directories, append a '/' at the\n end of the pattern.\n\n --noext Do not expand extglob patterns, such as '+(a|b)'\n --noglobstar Do not expand '**' against multiple path portions. Ie,\n treat it as a normal '*' instead.\n\n --windows-path-no-escape\n Use '\\' as a path separator *only*, and *never* as an\n escape character. If set, all '\\' characters are\n replaced with '/' in the pattern.\n\n -D<n> --max-depth=<n> Maximum depth to traverse from the current working\n directory\n\n -C<cwd> --cwd=<cwd> Current working directory to execute/match in\n -r<root> --root=<root> A string path resolved against the 'cwd', which is used\n as the starting point for absolute patterns that start\n with '/' (but not drive letters or UNC paths on\n Windows).\n\n Note that this *doesn't* necessarily limit the walk to\n the 'root' directory, and doesn't affect the cwd\n starting point for non-absolute patterns. A pattern\n containing '..' will still be able to traverse out of\n the root directory, if it is not an actual root\n directory on the filesystem, and any non-absolute\n patterns will still be matched in the 'cwd'.\n\n To start absolute and non-absolute patterns in the same\n path, you can use '--root=' to set it to the empty\n string. However, be aware that on Windows systems, a\n pattern like 'x:/*' or '//host/share/*' will *always*\n start in the 'x:/' or '//host/share/' directory,\n regardless of the --root setting.\n\n --platform=<platform> Defaults to the value of 'process.platform' if\n available, or 'linux' if not. Setting --platform=win32\n on non-Windows systems may cause strange behavior!\n\n -i<ignore> --ignore=<ignore>\n Glob patterns to ignore Can be set multiple times\n -v --debug Output a huge amount of noisy debug information about\n patterns as they are parsed and used to match files.\n\n -h --help Show this usage information\n```\n\n## `glob(pattern: string | string[], options?: GlobOptions) => Promise<string[] | Path[]>`\n\nPerform an asynchronous glob search for the pattern(s) specified.\nReturns\n[Path](https://isaacs.github.io/path-scurry/classes/PathBase)\nobjects if the `withFileTypes` option is set to `true`. See below\nfor full options field desciptions.\n\n## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`\n\nSynchronous form of `glob()`.\n\nAlias: `glob.sync()`\n\n## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator<string>`\n\nReturn an async iterator for walking glob pattern matches.\n\nAlias: `glob.iterate()`\n\n## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator<string>`\n\nReturn a sync iterator for walking glob pattern matches.\n\nAlias: `glob.iterate.sync()`, `glob.sync.iterate()`\n\n## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`\n\nReturn a stream that emits all the strings or `Path` objects and\nthen emits `end` when completed.\n\nAlias: `glob.stream()`\n\n## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`\n\nSyncronous form of `globStream()`. Will read all the matches as\nfast as you consume them, even all in a single tick if you\nconsume them immediately, but will still respond to backpressure\nif they're not consumed immediately.\n\nAlias: `glob.stream.sync()`, `glob.sync.stream()`\n\n## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`\n\nReturns `true` if the provided pattern contains any \"magic\" glob\ncharacters, given the options provided.\n\nBrace expansion is not considered \"magic\" unless the\n`magicalBraces` option is set, as brace expansion just turns one\nstring into an array of strings. So a pattern like `'x{a,b}y'`\nwould return `false`, because `'xay'` and `'xby'` both do not\ncontain any magic glob characters, and it's treated the same as\nif you had called it on `['xay', 'xby']`. When\n`magicalBraces:true` is in the options, brace expansion _is_\ntreated as a pattern having magic.\n\n## `escape(pattern: string, options?: GlobOptions) => string`\n\nEscape all magic characters in a glob pattern, so that it will\nonly ever match literal strings\n\nIf the `windowsPathsNoEscape` option is used, then characters are\nescaped by wrapping in `[]`, because a magic character wrapped in\na character class can only be satisfied by that exact character.\n\nSlashes (and backslashes in `windowsPathsNoEscape` mode) cannot\nbe escaped or unescaped.\n\n## `unescape(pattern: string, options?: GlobOptions) => string`\n\nUn-escape a glob string that may contain some escaped characters.\n\nIf the `windowsPathsNoEscape` option is used, then square-brace\nescapes are removed, but not backslash escapes. For example, it\nwill turn the string `'[*]'` into `*`, but it will not turn\n`'\\\\*'` into `'*'`, because `\\` is a path separator in\n`windowsPathsNoEscape` mode.\n\nWhen `windowsPathsNoEscape` is not set, then both brace escapes\nand backslash escapes are removed.\n\nSlashes (and backslashes in `windowsPathsNoEscape` mode) cannot\nbe escaped or unescaped.\n\n## Class `Glob`\n\nAn object that can perform glob pattern traversals.\n\n### `const g = new Glob(pattern: string | string[], options: GlobOptions)`\n\nOptions object is required.\n\nSee full options descriptions below.\n\nNote that a previous `Glob` object can be passed as the\n`GlobOptions` to another `Glob` instantiation to re-use settings\nand caches with a new pattern.\n\nTraversal functions can be called multiple times to run the walk\nagain.\n\n### `g.stream()`\n\nStream results asynchronously,\n\n### `g.streamSync()`\n\nStream results synchronously.\n\n### `g.iterate()`\n\nDefault async iteration function. Returns an AsyncGenerator that\niterates over the results.\n\n### `g.iterateSync()`\n\nDefault sync iteration function. Returns a Generator that\niterates over the results.\n\n### `g.walk()`\n\nReturns a Promise that resolves to the results array.\n\n### `g.walkSync()`\n\nReturns a results array.\n\n### Properties\n\nAll options are stored as properties on the `Glob` object.\n\n- `opts` The options provided to the constructor.\n- `patterns` An array of parsed immutable `Pattern` objects.\n\n## Options\n\nExported as `GlobOptions` TypeScript interface. A `GlobOptions`\nobject may be provided to any of the exported methods, and must\nbe provided to the `Glob` constructor.\n\nAll options are optional, boolean, and false by default, unless\notherwise noted.\n\nAll resolved options are added to the Glob object as properties.\n\nIf you are running many `glob` operations, you can pass a Glob\nobject as the `options` argument to a subsequent operation to\nshare the previously loaded cache.\n\n- `cwd` String path or `file://` string or URL object. The\n current working directory in which to search. Defaults to\n `process.cwd()`. See also: \"Windows, CWDs, Drive Letters, and\n UNC Paths\", below.\n\n This option may be either a string path or a `file://` URL\n object or string.\n\n- `root` A string path resolved against the `cwd` option, which\n is used as the starting point for absolute patterns that start\n with `/`, (but not drive letters or UNC paths on Windows).\n\n Note that this _doesn't_ necessarily limit the walk to the\n `root` directory, and doesn't affect the cwd starting point for\n non-absolute patterns. A pattern containing `..` will still be\n able to traverse out of the root directory, if it is not an\n actual root directory on the filesystem, and any non-absolute\n patterns will be matched in the `cwd`. For example, the\n pattern `/../*` with `{root:'/some/path'}` will return all\n files in `/some`, not all files in `/some/path`. The pattern\n `*` with `{root:'/some/path'}` will return all the entries in\n the cwd, not the entries in `/some/path`.\n\n To start absolute and non-absolute patterns in the same\n path, you can use `{root:''}`. However, be aware that on\n Windows systems, a pattern like `x:/*` or `//host/share/*` will\n _always_ start in the `x:/` or `//host/share` directory,\n regardless of the `root` setting.\n\n- `windowsPathsNoEscape` Use `\\\\` as a path separator _only_, and\n _never_ as an escape character. If set, all `\\\\` characters are\n replaced with `/` in the pattern.\n\n Note that this makes it **impossible** to match against paths\n containing literal glob pattern characters, but allows matching\n with patterns constructed using `path.join()` and\n `path.resolve()` on Windows platforms, mimicking the (buggy!)\n behavior of Glob v7 and before on Windows. Please use with\n caution, and be mindful of [the caveat below about Windows\n paths](#windows). (For legacy reasons, this is also set if\n `allowWindowsEscape` is set to the exact value `false`.)\n\n- `dot` Include `.dot` files in normal matches and `globstar`\n matches. Note that an explicit dot in a portion of the pattern\n will always match dot files.\n\n- `magicalBraces` Treat brace expansion like `{a,b}` as a \"magic\"\n pattern. Has no effect if {@link nobrace} is set.\n\n Only has effect on the {@link hasMagic} function, no effect on\n glob pattern matching itself.\n\n- `dotRelative` Prepend all relative path strings with `./` (or\n `.\\` on Windows).\n\n Without this option, returned relative paths are \"bare\", so\n instead of returning `'./foo/bar'`, they are returned as\n `'foo/bar'`.\n\n Relative patterns starting with `'../'` are not prepended with\n `./`, even if this option is set.\n\n- `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n\n- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.\n\n- `noglobstar` Do not match `**` against multiple filenames. (Ie,\n treat it as a normal `*` instead.)\n\n- `noext` Do not match \"extglob\" patterns such as `+(a|b)`.\n\n- `nocase` Perform a case-insensitive match. This defaults to\n `true` on macOS and Windows systems, and `false` on all others.\n\n **Note** `nocase` should only be explicitly set when it is\n known that the filesystem's case sensitivity differs from the\n platform default. If set `true` on case-sensitive file\n systems, or `false` on case-insensitive file systems, then the\n walk may return more or less results than expected.\n\n- `maxDepth` Specify a number to limit the depth of the directory\n traversal to this many levels below the `cwd`.\n\n- `matchBase` Perform a basename-only match if the pattern does\n not contain any slash characters. That is, `*.js` would be\n treated as equivalent to `**/*.js`, matching all js files in\n all directories.\n\n- `nodir` Do not match directories, only files. (Note: to match\n _only_ directories, put a `/` at the end of the pattern.)\n\n Note: when `follow` and `nodir` are both set, then symbolic\n links to directories are also omitted.\n\n- `stat` Call `lstat()` on all entries, whether required or not\n to determine whether it's a valid match. When used with\n `withFileTypes`, this means that matches will include data such\n as modified time, permissions, and so on. Note that this will\n incur a performance cost due to the added system calls.\n\n- `ignore` string or string[], or an object with `ignore` and\n `ignoreChildren` methods.\n\n If a string or string[] is provided, then this is treated as a\n glob pattern or array of glob patterns to exclude from matches.\n To ignore all children within a directory, as well as the entry\n itself, append `'/**'` to the ignore pattern.\n\n **Note** `ignore` patterns are _always_ in `dot:true` mode,\n regardless of any other settings.\n\n If an object is provided that has `ignored(path)` and/or\n `childrenIgnored(path)` methods, then these methods will be\n called to determine whether any Path is a match or if its\n children should be traversed, respectively.\n\n- `follow` Follow symlinked directories when expanding `**`\n patterns. This can result in a lot of duplicate references in\n the presence of cyclic links, and make performance quite bad.\n\n By default, a `**` in a pattern will follow 1 symbolic link if\n it is not the first item in the pattern, or none if it is the\n first item in the pattern, following the same behavior as Bash.\n\n Note: when `follow` and `nodir` are both set, then symbolic\n links to directories are also omitted.\n\n- `realpath` Set to true to call `fs.realpath` on all of the\n results. In the case of an entry that cannot be resolved, the\n entry is omitted. This incurs a slight performance penalty, of\n course, because of the added system calls.\n\n- `absolute` Set to true to always receive absolute paths for\n matched files. Set to `false` to always receive relative paths\n for matched files.\n\n By default, when this option is not set, absolute paths are\n returned for patterns that are absolute, and otherwise paths\n are returned that are relative to the `cwd` setting.\n\n This does _not_ make an extra system call to get the realpath,\n it only does string path resolution.\n\n `absolute` may not be used along with `withFileTypes`.\n\n- `posix` Set to true to use `/` as the path separator in\n returned results. On posix systems, this has no effect. On\n Windows systems, this will return `/` delimited path results,\n and absolute paths will be returned in their full resolved UNC\n path form, eg insted of `'C:\\\\foo\\\\bar'`, it will return\n `//?/C:/foo/bar`.\n\n- `platform` Defaults to value of `process.platform` if\n available, or `'linux'` if not. Setting `platform:'win32'` on\n non-Windows systems may cause strange behavior.\n\n- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)\n `Path` objects instead of strings. These are similar to a\n NodeJS `Dirent` object, but with additional methods and\n properties.\n\n `withFileTypes` may not be used along with `absolute`.\n\n- `signal` An AbortSignal which will cancel the Glob walk when\n triggered.\n\n- `fs` An override object to pass in custom filesystem methods.\n See [PathScurry docs](http://npm.im/path-scurry) for what can\n be overridden.\n\n- `scurry` A [PathScurry](http://npm.im/path-scurry) object used\n to traverse the file system. If the `nocase` option is set\n explicitly, then any provided `scurry` object must match this\n setting.\n\n- `includeChildMatches` boolean, default `true`. Do not match any\n children of any matches. For example, the pattern `**\\/foo`\n would match `a/foo`, but not `a/foo/b/foo` in this mode.\n\n This is especially useful for cases like \"find all\n `node_modules` folders, but not the ones in `node_modules`\".\n\n In order to support this, the `Ignore` implementation must\n support an `add(pattern: string)` method. If using the default\n `Ignore` class, then this is fine, but if this is set to\n `false`, and a custom `Ignore` is provided that does not have\n an `add()` method, then it will throw an error.\n\n **Caveat** It _only_ ignores matches that would be a descendant\n of a previous match, and only if that descendant is matched\n _after_ the ancestor is encountered. Since the file system walk\n happens in indeterminate order, it's possible that a match will\n already be added before its ancestor, if multiple or braced\n patterns are used.\n\n For example:\n\n ```js\n const results = await glob(\n [\n // likely to match first, since it's just a stat\n 'a/b/c/d/e/f',\n\n // this pattern is more complicated! It must to various readdir()\n // calls and test the results against a regular expression, and that\n // is certainly going to take a little bit longer.\n //\n // So, later on, it encounters a match at 'a/b/c/d/e', but it's too\n // late to ignore a/b/c/d/e/f, because it's already been emitted.\n 'a/[bdf]/?/[a-z]/*',\n ],\n { includeChildMatches: false },\n )\n ```\n\n It's best to only set this to `false` if you can be reasonably\n sure that no components of the pattern will potentially match\n one another's file system descendants, or if the occasional\n included child entry will not cause problems.\n\n## Glob Primer\n\nMuch more information about glob pattern expansion can be found\nby running `man bash` and searching for `Pattern Matching`.\n\n\"Globs\" are the patterns you type when you do stuff like `ls\n*.js` on the command line, or put `build/*` in a `.gitignore`\nfile.\n\nBefore parsing the path part patterns, braced sections are\nexpanded into a set. Braced sections start with `{` and end with\n`}`, with 2 or more comma-delimited sections within. Braced\nsections may contain slash characters, so `a{/b/c,bcd}` would\nexpand into `a/b/c` and `abcd`.\n\nThe following characters have special magic meaning when used in\na path portion. With the exception of `**`, none of these match\npath separators (ie, `/` on all platforms, and `\\` on Windows).\n\n- `*` Matches 0 or more characters in a single path portion.\n When alone in a path portion, it must match at least 1\n character. If `dot:true` is not specified, then `*` will not\n match against a `.` character at the start of a path portion.\n- `?` Matches 1 character. If `dot:true` is not specified, then\n `?` will not match against a `.` character at the start of a\n path portion.\n- `[...]` Matches a range of characters, similar to a RegExp\n range. If the first character of the range is `!` or `^` then\n it matches any character not in the range. If the first\n character is `]`, then it will be considered the same as `\\]`,\n rather than the end of the character class.\n- `!(pattern|pattern|pattern)` Matches anything that does not\n match any of the patterns provided. May _not_ contain `/`\n characters. Similar to `*`, if alone in a path portion, then\n the path portion must have at least one character.\n- `?(pattern|pattern|pattern)` Matches zero or one occurrence of\n the patterns provided. May _not_ contain `/` characters.\n- `+(pattern|pattern|pattern)` Matches one or more occurrences of\n the patterns provided. May _not_ contain `/` characters.\n- `*(a|b|c)` Matches zero or more occurrences of the patterns\n provided. May _not_ contain `/` characters.\n- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns\n provided. May _not_ contain `/` characters.\n- `**` If a \"globstar\" is alone in a path portion, then it\n matches zero or more directories and subdirectories searching\n for matches. It does not crawl symlinked directories, unless\n `{follow:true}` is passed in the options object. A pattern\n like `a/b/**` will only match `a/b` if it is a directory.\n Follows 1 symbolic link if not the first item in the pattern,\n or 0 if it is the first item, unless `follow:true` is set, in\n which case it follows all symbolic links.\n\n`[:class:]` patterns are supported by this implementation, but\n`[=c=]` and `[.symbol.]` style class patterns are not.\n\n### Dots\n\nIf a file or directory path portion has a `.` as the first\ncharacter, then it will not match any glob pattern unless that\npattern's corresponding path part also has a `.` as its first\ncharacter.\n\nFor example, the pattern `a/.*/c` would match the file at\n`a/.b/c`. However the pattern `a/*/c` would not, because `*` does\nnot start with a dot character.\n\nYou can make glob treat dots as normal characters by setting\n`dot:true` in the options.\n\n### Basename Matching\n\nIf you set `matchBase:true` in the options, and the pattern has\nno slashes in it, then it will seek for any file anywhere in the\ntree with a matching basename. For example, `*.js` would match\n`test/simple/basic.js`.\n\n### Empty Sets\n\nIf no matching files are found, then an empty array is returned.\nThis differs from the shell, where the pattern itself is\nreturned. For example:\n\n```sh\n$ echo a*s*d*f\na*s*d*f\n```\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a\nworthwhile goal, some discrepancies exist between node-glob and\nother implementations, and are intentional.\n\nThe double-star character `**` is supported by default, unless\nthe `noglobstar` flag is set. This is supported in the manner of\nbsdglob and bash 5, where `**` only has special significance if\nit is the only thing in a path part. That is, `a/**/b` will match\n`a/x/y/b`, but `a/**b` will not.\n\nNote that symlinked directories are not traversed as part of a\n`**`, though their contents may match against subsequent portions\nof the pattern. This prevents infinite loops and duplicates and\nthe like. You can force glob to traverse symlinks with `**` by\nsetting `{follow:true}` in the options.\n\nThere is no equivalent of the `nonull` option. A pattern that\ndoes not find any matches simply resolves to nothing. (An empty\narray, immediately ended stream, etc.)\n\nIf brace expansion is not disabled, then it is performed before\nany other interpretation of the glob pattern. Thus, a pattern\nlike `+(a|{b),c)}`, which would not be valid in bash or zsh, is\nexpanded **first** into the set of `+(a|b)` and `+(a|c)`, and\nthose patterns are checked for validity. Since those two are\nvalid, matching proceeds.\n\nThe character class patterns `[:class:]` (posix standard named\nclasses) style class patterns are supported and unicode-aware,\nbut `[=c=]` (locale-specific character collation weight), and\n`[.symbol.]` (collating symbol), are not.\n\n### Repeated Slashes\n\nUnlike Bash and zsh, repeated `/` are always coalesced into a\nsingle path separator.\n\n### Comments and Negation\n\nPreviously, this module let you mark a pattern as a \"comment\" if\nit started with a `#` character, or a \"negated\" pattern if it\nstarted with a `!` character.\n\nThese options were deprecated in version 5, and removed in\nversion 6.\n\nTo specify things that should not match, use the `ignore` option.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only\n`/` characters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will\nalways be interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto\nthe root setting using `path.join`. On windows, this will by\ndefault result in `/foo/*` matching `C:\\foo\\bar.txt`.\n\nTo automatically coerce all `\\` characters to `/` in pattern\nstrings, **thus making it impossible to escape literal glob\ncharacters**, you may set the `windowsPathsNoEscape` option to\n`true`.\n\n### Windows, CWDs, Drive Letters, and UNC Paths\n\nOn posix systems, when a pattern starts with `/`, any `cwd`\noption is ignored, and the traversal starts at `/`, plus any\nnon-magic path portions specified in the pattern.\n\nOn Windows systems, the behavior is similar, but the concept of\nan \"absolute path\" is somewhat more involved.\n\n#### UNC Paths\n\nA UNC path may be used as the start of a pattern on Windows\nplatforms. For example, a pattern like: `//?/x:/*` will return\nall file entries in the root of the `x:` drive. A pattern like\n`//ComputerName/Share/*` will return all files in the associated\nshare.\n\nUNC path roots are always compared case insensitively.\n\n#### Drive Letters\n\nA pattern starting with a drive letter, like `c:/*`, will search\nin that drive, regardless of any `cwd` option provided.\n\nIf the pattern starts with `/`, and is not a UNC path, and there\nis an explicit `cwd` option set with a drive letter, then the\ndrive letter in the `cwd` is used as the root of the directory\ntraversal.\n\nFor example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return\n`['c:/tmp']` as the result.\n\nIf an explicit `cwd` option is not provided, and the pattern\nstarts with `/`, then the traversal will run on the root of the\ndrive provided as the `cwd` option. (That is, it is the result of\n`path.resolve('/')`.)\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race\nconditions, since it relies on directory walking.\n\nAs a result, it is possible that a file that exists when glob\nlooks for it may have been deleted or modified by the time it\nreturns the result.\n\nBy design, this implementation caches all readdir calls that it\nmakes, in order to cut down on system overhead. However, this\nalso makes it even more susceptible to races, especially if the\ncache object is reused between glob calls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast\nmajority of operations, this is never a problem.\n\n### See Also:\n\n- `man sh`\n- `man bash` [Pattern\n Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)\n- `man 3 fnmatch`\n- `man 5 gitignore`\n- [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## Glob Logo\n\nGlob's logo was created by [Tanya\nBrassie](http://tanyabrassie.com/). Logo files can be found\n[here](https://github.com/isaacs/node-glob/tree/master/logo).\n\nThe logo is licensed under a [Creative Commons\nAttribution-ShareAlike 4.0 International\nLicense](https://creativecommons.org/licenses/by-sa/4.0/).\n\n## Contributing\n\nAny change to behavior (including bugfixes) must come with a\ntest.\n\nPatches that fail tests or reduce performance will be rejected.\n\n```sh\n# to run tests\nnpm test\n\n# to re-generate test fixtures\nnpm run test-regen\n\n# run the benchmarks\nnpm run bench\n\n# to profile javascript\nnpm run prof\n```\n\n## Comparison to Other JavaScript Glob Implementations\n\n**tl;dr**\n\n- If you want glob matching that is as faithful as possible to\n Bash pattern expansion semantics, and as fast as possible\n within that constraint, _use this module_.\n- If you are reasonably sure that the patterns you will encounter\n are relatively simple, and want the absolutely fastest glob\n matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.\n- If you are reasonably sure that the patterns you will encounter\n are relatively simple, and want the convenience of\n automatically respecting `.gitignore` files, _use\n [globby](http://npm.im/globby)_.\n\nThere are some other glob matcher libraries on npm, but these\nthree are (in my opinion, as of 2023) the best.\n\n---\n\n**full explanation**\n\nEvery library reflects a set of opinions and priorities in the\ntrade-offs it makes. Other than this library, I can personally\nrecommend both [globby](http://npm.im/globby) and\n[fast-glob](http://npm.im/fast-glob), though they differ in their\nbenefits and drawbacks.\n\nBoth have very nice APIs and are reasonably fast.\n\n`fast-glob` is, as far as I am aware, the fastest glob\nimplementation in JavaScript today. However, there are many\ncases where the choices that `fast-glob` makes in pursuit of\nspeed mean that its results differ from the results returned by\nBash and other sh-like shells, which may be surprising.\n\nIn my testing, `fast-glob` is around 10-20% faster than this\nmodule when walking over 200k files nested 4 directories\ndeep[1](#fn-webscale). However, there are some inconsistencies\nwith Bash matching behavior that this module does not suffer\nfrom:\n\n- `**` only matches files, not directories\n- `..` path portions are not handled unless they appear at the\n start of the pattern\n- `./!(<pattern>)` will not match any files that _start_ with\n `<pattern>`, even if they do not match `<pattern>`. For\n example, `!(9).txt` will not match `9999.txt`.\n- Some brace patterns in the middle of a pattern will result in\n failing to find certain matches.\n- Extglob patterns are allowed to contain `/` characters.\n\nGlobby exhibits all of the same pattern semantics as fast-glob,\n(as it is a wrapper around fast-glob) and is slightly slower than\nnode-glob (by about 10-20% in the benchmark test set, or in other\nwords, anywhere from 20-50% slower than fast-glob). However, it\nadds some API conveniences that may be worth the costs.\n\n- Support for `.gitignore` and other ignore files.\n- Support for negated globs (ie, patterns starting with `!`\n rather than using a separate `ignore` option).\n\nThe priority of this module is \"correctness\" in the sense of\nperforming a glob pattern expansion as faithfully as possible to\nthe behavior of Bash and other sh-like shells, with as much speed\nas possible.\n\nNote that prior versions of `node-glob` are _not_ on this list.\nFormer versions of this module are far too slow for any cases\nwhere performance matters at all, and were designed with APIs\nthat are extremely dated by current JavaScript standards.\n\n---\n\n<small id=\"fn-webscale\">[1]: In the cases where this module\nreturns results and `fast-glob` doesn't, it's even faster, of\ncourse.</small>\n\n![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)\n\n### Benchmark Results\n\nFirst number is time, smaller is better.\n\nSecond number is the count of results returned.\n\n```\n--- pattern: '**' ---\n~~ sync ~~\nnode fast-glob sync 0m0.598s 200364\nnode globby sync 0m0.765s 200364\nnode current globSync mjs 0m0.683s 222656\nnode current glob syncStream 0m0.649s 222656\n~~ async ~~\nnode fast-glob async 0m0.350s 200364\nnode globby async 0m0.509s 200364\nnode current glob async mjs 0m0.463s 222656\nnode current glob stream 0m0.411s 222656\n\n--- pattern: '**/..' ---\n~~ sync ~~\nnode fast-glob sync 0m0.486s 0\nnode globby sync 0m0.769s 200364\nnode current globSync mjs 0m0.564s 2242\nnode current glob syncStream 0m0.583s 2242\n~~ async ~~\nnode fast-glob async 0m0.283s 0\nnode globby async 0m0.512s 200364\nnode current glob async mjs 0m0.299s 2242\nnode current glob stream 0m0.312s 2242\n\n--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.490s 10\nnode globby sync 0m0.517s 10\nnode current globSync mjs 0m0.540s 10\nnode current glob syncStream 0m0.550s 10\n~~ async ~~\nnode fast-glob async 0m0.290s 10\nnode globby async 0m0.296s 10\nnode current glob async mjs 0m0.278s 10\nnode current glob stream 0m0.302s 10\n\n--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.500s 160\nnode globby sync 0m0.528s 160\nnode current globSync mjs 0m0.556s 160\nnode current glob syncStream 0m0.573s 160\n~~ async ~~\nnode fast-glob async 0m0.283s 160\nnode globby async 0m0.301s 160\nnode current glob async mjs 0m0.306s 160\nnode current glob stream 0m0.322s 160\n\n--- pattern: './**/0/**/0/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.502s 5230\nnode globby sync 0m0.527s 5230\nnode current globSync mjs 0m0.544s 5230\nnode current glob syncStream 0m0.557s 5230\n~~ async ~~\nnode fast-glob async 0m0.285s 5230\nnode globby async 0m0.305s 5230\nnode current glob async mjs 0m0.304s 5230\nnode current glob stream 0m0.310s 5230\n\n--- pattern: '**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.580s 200023\nnode globby sync 0m0.771s 200023\nnode current globSync mjs 0m0.685s 200023\nnode current glob syncStream 0m0.649s 200023\n~~ async ~~\nnode fast-glob async 0m0.349s 200023\nnode globby async 0m0.509s 200023\nnode current glob async mjs 0m0.427s 200023\nnode current glob stream 0m0.388s 200023\n\n--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---\n~~ sync ~~\nnode fast-glob sync 0m0.589s 200023\nnode globby sync 0m0.771s 200023\nnode current globSync mjs 0m0.716s 200023\nnode current glob syncStream 0m0.684s 200023\n~~ async ~~\nnode fast-glob async 0m0.351s 200023\nnode globby async 0m0.518s 200023\nnode current glob async mjs 0m0.462s 200023\nnode current glob stream 0m0.468s 200023\n\n--- pattern: '**/5555/0000/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.496s 1000\nnode globby sync 0m0.519s 1000\nnode current globSync mjs 0m0.539s 1000\nnode current glob syncStream 0m0.567s 1000\n~~ async ~~\nnode fast-glob async 0m0.285s 1000\nnode globby async 0m0.299s 1000\nnode current glob async mjs 0m0.305s 1000\nnode current glob stream 0m0.301s 1000\n\n--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.484s 0\nnode globby sync 0m0.507s 0\nnode current globSync mjs 0m0.577s 4880\nnode current glob syncStream 0m0.586s 4880\n~~ async ~~\nnode fast-glob async 0m0.280s 0\nnode globby async 0m0.298s 0\nnode current glob async mjs 0m0.327s 4880\nnode current glob stream 0m0.324s 4880\n\n--- pattern: '**/????/????/????/????/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.547s 100000\nnode globby sync 0m0.673s 100000\nnode current globSync mjs 0m0.626s 100000\nnode current glob syncStream 0m0.618s 100000\n~~ async ~~\nnode fast-glob async 0m0.315s 100000\nnode globby async 0m0.414s 100000\nnode current glob async mjs 0m0.366s 100000\nnode current glob stream 0m0.345s 100000\n\n--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.588s 100000\nnode globby sync 0m0.670s 100000\nnode current globSync mjs 0m0.717s 200023\nnode current glob syncStream 0m0.687s 200023\n~~ async ~~\nnode fast-glob async 0m0.343s 100000\nnode globby async 0m0.418s 100000\nnode current glob async mjs 0m0.519s 200023\nnode current glob stream 0m0.451s 200023\n\n--- pattern: '**/!(0|9).txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.573s 160023\nnode globby sync 0m0.731s 160023\nnode current globSync mjs 0m0.680s 180023\nnode current glob syncStream 0m0.659s 180023\n~~ async ~~\nnode fast-glob async 0m0.345s 160023\nnode globby async 0m0.476s 160023\nnode current glob async mjs 0m0.427s 180023\nnode current glob stream 0m0.388s 180023\n\n--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.483s 0\nnode globby sync 0m0.512s 0\nnode current globSync mjs 0m0.811s 200023\nnode current glob syncStream 0m0.773s 200023\n~~ async ~~\nnode fast-glob async 0m0.280s 0\nnode globby async 0m0.299s 0\nnode current glob async mjs 0m0.617s 200023\nnode current glob stream 0m0.568s 200023\n\n--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.485s 0\nnode globby sync 0m0.507s 0\nnode current globSync mjs 0m0.759s 200023\nnode current glob syncStream 0m0.740s 200023\n~~ async ~~\nnode fast-glob async 0m0.281s 0\nnode globby async 0m0.297s 0\nnode current glob async mjs 0m0.544s 200023\nnode current glob stream 0m0.464s 200023\n\n--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.486s 0\nnode globby sync 0m0.513s 0\nnode current globSync mjs 0m0.734s 200023\nnode current glob syncStream 0m0.696s 200023\n~~ async ~~\nnode fast-glob async 0m0.286s 0\nnode globby async 0m0.296s 0\nnode current glob async mjs 0m0.506s 200023\nnode current glob stream 0m0.483s 200023\n\n--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.060s 0\nnode globby sync 0m0.074s 0\nnode current globSync mjs 0m0.067s 0\nnode current glob syncStream 0m0.066s 0\n~~ async ~~\nnode fast-glob async 0m0.060s 0\nnode globby async 0m0.075s 0\nnode current glob async mjs 0m0.066s 0\nnode current glob stream 0m0.067s 0\n\n--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.568s 100000\nnode globby sync 0m0.651s 100000\nnode current globSync mjs 0m0.619s 100000\nnode current glob syncStream 0m0.617s 100000\n~~ async ~~\nnode fast-glob async 0m0.332s 100000\nnode globby async 0m0.409s 100000\nnode current glob async mjs 0m0.372s 100000\nnode current glob stream 0m0.351s 100000\n\n--- pattern: '**/*/**/*/**/*/**/*/**' ---\n~~ sync ~~\nnode fast-glob sync 0m0.603s 200113\nnode globby sync 0m0.798s 200113\nnode current globSync mjs 0m0.730s 222137\nnode current glob syncStream 0m0.693s 222137\n~~ async ~~\nnode fast-glob async 0m0.356s 200113\nnode globby async 0m0.525s 200113\nnode current glob async mjs 0m0.508s 222137\nnode current glob stream 0m0.455s 222137\n\n--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.622s 200000\nnode globby sync 0m0.792s 200000\nnode current globSync mjs 0m0.722s 200000\nnode current glob syncStream 0m0.695s 200000\n~~ async ~~\nnode fast-glob async 0m0.369s 200000\nnode globby async 0m0.527s 200000\nnode current glob async mjs 0m0.502s 200000\nnode current glob stream 0m0.481s 200000\n\n--- pattern: '**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.588s 200023\nnode globby sync 0m0.771s 200023\nnode current globSync mjs 0m0.684s 200023\nnode current glob syncStream 0m0.658s 200023\n~~ async ~~\nnode fast-glob async 0m0.352s 200023\nnode globby async 0m0.516s 200023\nnode current glob async mjs 0m0.432s 200023\nnode current glob stream 0m0.384s 200023\n\n--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.589s 200023\nnode globby sync 0m0.766s 200023\nnode current globSync mjs 0m0.682s 200023\nnode current glob syncStream 0m0.652s 200023\n~~ async ~~\nnode fast-glob async 0m0.352s 200023\nnode globby async 0m0.523s 200023\nnode current glob async mjs 0m0.436s 200023\nnode current glob stream 0m0.380s 200023\n\n--- pattern: '**/*/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.592s 200023\nnode globby sync 0m0.776s 200023\nnode current globSync mjs 0m0.691s 200023\nnode current glob syncStream 0m0.659s 200023\n~~ async ~~\nnode fast-glob async 0m0.357s 200023\nnode globby async 0m0.513s 200023\nnode current glob async mjs 0m0.471s 200023\nnode current glob stream 0m0.424s 200023\n\n--- pattern: '**/*/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.585s 200023\nnode globby sync 0m0.766s 200023\nnode current globSync mjs 0m0.694s 200023\nnode current glob syncStream 0m0.664s 200023\n~~ async ~~\nnode fast-glob async 0m0.350s 200023\nnode globby async 0m0.514s 200023\nnode current glob async mjs 0m0.472s 200023\nnode current glob stream 0m0.424s 200023\n\n--- pattern: '**/[0-9]/**/*.txt' ---\n~~ sync ~~\nnode fast-glob sync 0m0.544s 100000\nnode globby sync 0m0.636s 100000\nnode current globSync mjs 0m0.626s 100000\nnode current glob syncStream 0m0.621s 100000\n~~ async ~~\nnode fast-glob async 0m0.322s 100000\nnode globby async 0m0.404s 100000\nnode current glob async mjs 0m0.360s 100000\nnode current glob stream 0m0.352s 100000\n```\n","readmeFilename":"README.md"}
+{
+ "name": "glob",
+ "dist-tags": {
+ "latest": "10.4.4"
+ },
+ "versions": {
+ "10.4.4": {
+ "name": "glob",
+ "version": "10.4.4",
+ "author": {
+ "url": "https://blog.izs.me/",
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "ISC",
+ "_id": "glob@10.4.4",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-glob/issues"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "tap": {
+ "before": "test/00-setup.ts"
+ },
+ "dist": {
+ "shasum": "d60943feb6f8140522117e6576a923b715718380",
+ "tarball": "http://localhost:4260/glob/glob-10.4.4.tgz",
+ "fileCount": 65,
+ "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==",
+ "unpackedSize": 475328
+ },
+ "main": "./dist/commonjs/index.js",
+ "tshy": {
+ "main": true,
+ "exports": {
+ ".": "./src/index.ts",
+ "./package.json": "./package.json"
+ }
+ },
+ "type": "module",
+ "types": "./dist/commonjs/index.d.ts",
+ "module": "./dist/esm/index.js",
+ "engines": {
+ "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "source": "./src/index.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "source": "./src/index.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "78275168e1bbc7a61e372af1ba58307c27faf0cb",
+ "scripts": {
+ "prof": "bash prof.sh",
+ "snap": "tap",
+ "test": "tap",
+ "bench": "bash benchmark.sh",
+ "format": "prettier --write . --log-level warn",
+ "prepare": "tshy",
+ "preprof": "npm run prepare",
+ "presnap": "npm run prepare",
+ "pretest": "npm run prepare",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts",
+ "prebench": "npm run prepare",
+ "profclean": "rm -f v8.log profile.txt",
+ "benchclean": "node benchclean.cjs",
+ "prepublish": "npm run benchclean",
+ "preversion": "npm test",
+ "test-regen": "npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "prettier": {
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "endOfLine": "lf",
+ "printWidth": 75,
+ "arrowParens": "avoid",
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "experimentalTernaries": true
+ },
+ "repository": {
+ "url": "git://github.com/isaacs/node-glob.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "the most correct and second fastest glob implementation in JavaScript",
+ "directories": {},
+ "_nodeVersion": "20.13.1",
+ "dependencies": {
+ "minipass": "^7.1.2",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "path-scurry": "^1.11.1",
+ "foreground-child": "^3.1.0",
+ "package-json-from-dist": "^1.0.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^19.0.0",
+ "tshy": "^1.14.0",
+ "memfs": "^3.4.13",
+ "mkdirp": "^3.0.1",
+ "rimraf": "^5.0.7",
+ "typedoc": "^0.25.12",
+ "prettier": "^3.2.5",
+ "@types/node": "^20.11.30",
+ "sync-content": "^1.0.2"
+ }
+ }
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/node-glob/issues"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://blog.izs.me/"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/isaacs/node-glob#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-glob.git"
+ },
+ "description": "the most correct and second fastest glob implementation in JavaScript",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/globals/registry.json b/tests/registry/npm/globals/registry.json
index fd83c25d1..6e8c2f90d 100644
--- a/tests/registry/npm/globals/registry.json
+++ b/tests/registry/npm/globals/registry.json
@@ -1 +1,84 @@
-{"name":"globals","description":"Global identifiers from different JavaScript environments","dist-tags":{"latest":"13.17.0"},"versions":{"13.17.0":{"name":"globals","version":"13.17.0","description":"Global identifiers from different JavaScript environments","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/globals.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava"},"dependencies":{"type-fest":"^0.20.2"},"devDependencies":{"ava":"^2.4.0","tsd":"^0.14.0","xo":"^0.36.1"},"xo":{"ignores":["get-browser-globals.js"],"rules":{"node/no-unsupported-features/es-syntax":"off"}},"tsd":{"compilerOptions":{"resolveJsonModule":true}},"types":"./index.d.ts","gitHead":"1a1f7e863300f5685c66263086765b8cdcdc3665","bugs":{"url":"https://github.com/sindresorhus/globals/issues"},"_id":"globals@13.17.0","_nodeVersion":"14.19.3","_npmVersion":"8.3.2","dist":{"integrity":"sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==","shasum":"902eb1e680a41da93945adbdcb5a9f361ba69bd4","tarball":"http://localhost:4260/globals/globals-13.17.0.tgz","fileCount":6,"unpackedSize":46315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJVV2QzBgk8QZkIGiL0Tc47k02GV4sjqgvLVClSY6g+QIgdj0X+kHQpzOJcZbeTTMeuHYCtmL+ZAGIte0MO/V6JYs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2QtlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrDhw//fc6R4ogS7lQO8GlzVFeV1aKEwo8ZIuqm9md1EpvujtNtg3si\r\nSMAVyV94avK6zxZXbZ+CPBQZcWJ3rgTwdrldodOMXPRGcyqKN1oPyIR46Jzr\r\nPLedBVnfRyx+sGxQxz+RQRts73rr3b/GoD5fuLKx+V0cEjGUtKaJoZCsgwa8\r\nlo250LsjGJir6pQtTZMCjeEbZZrK0thL8Njru3NyhGzNsGVGyspIifF0Ph9+\r\nCEmSM73ziZrlEHYKYsFnIDqHpGQcE9IToVQJJofzQKoTmOLR1ZWL+8eaWAzn\r\n1TJvHs/nNofvYc4cvqzh4kVkrjhy52gV25sZt4EnZbTaSVCKlzz77sgUXnpb\r\nk8dYYorrMMKeV/ipLiqhAiJ9Ac18BTUh2DGs4CF10yrOryTXWQi/m5EEWf78\r\nHTObf8c+A7ltejG6EApHcToYPo3L9ogJY7GqZaVq4xfcKwBTNQIwi97OM+i5\r\nbn8VQCinnWgGHfBHDWPvQNCCGNdZO24pYzGm+ZxhDt6+CmnB8einjBR/2mzY\r\nTiTlyHsUi2aTPygwG9zTN55lRShk5Y/pcenrMC0jfe2NW0ayHZ2EbPck0fdA\r\n4TnxCY2SXrPK0q4YG0IemE7lI68n8Hf8PoK7uhG70foWGggqSUJWipOCbu6a\r\nbM4aJiiLKeybcAh/ynig4RsbK+cGX6vM5EE=\r\n=xg5I\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# globals\n\n> Global identifiers from different JavaScript environments\n\nIt's just a [JSON file](globals.json), so use it in any environment.\n\nThis package is used by ESLint.\n\n**This package [no longer accepts](https://github.com/sindresorhus/globals/issues/82) new environments. If you need it for ESLint, just [create a plugin](http://eslint.org/docs/developer-guide/working-with-plugins#environments-in-plugins).**\n\n## Install\n\n```\n$ npm install globals\n```\n\n## Usage\n\n```js\nconst globals = require('globals');\n\nconsole.log(globals.browser);\n/*\n{\n\taddEventListener: false,\n\tapplicationCache: false,\n\tArrayBuffer: false,\n\tatob: false,\n\t…\n}\n*/\n```\n\nEach global is given a value of `true` or `false`. A value of `true` indicates that the variable may be overwritten. A value of `false` indicates that the variable should be considered read-only. This information is used by static analysis tools to flag incorrect behavior. We assume all variables should be `false` unless we hear otherwise.\n\nFor Node.js this package provides two sets of globals:\n\n- `globals.nodeBuiltin`: Globals available to all code running in Node.js.\n\tThese will usually be available as properties on the `global` object and include `process`, `Buffer`, but not CommonJS arguments like `require`.\n\tSee: https://nodejs.org/api/globals.html\n- `globals.node`: A combination of the globals from `nodeBuiltin` plus all CommonJS arguments (\"CommonJS module scope\").\n\tSee: https://nodejs.org/api/modules.html#modules_the_module_scope\n\nWhen analyzing code that is known to run outside of a CommonJS wrapper, for example, JavaScript modules, `nodeBuiltin` can find accidental CommonJS references.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-globals?utm_source=npm-globals&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"repository":{"type":"git","url":"git+https://github.com/sindresorhus/globals.git"},"homepage":"https://github.com/sindresorhus/globals#readme","bugs":{"url":"https://github.com/sindresorhus/globals/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "globals",
+ "description": "Global identifiers from different JavaScript environments",
+ "dist-tags": {
+ "latest": "13.17.0"
+ },
+ "versions": {
+ "13.17.0": {
+ "name": "globals",
+ "version": "13.17.0",
+ "description": "Global identifiers from different JavaScript environments",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/globals.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "tsd": "^0.14.0",
+ "xo": "^0.36.1"
+ },
+ "xo": {
+ "ignores": [
+ "get-browser-globals.js"
+ ],
+ "rules": {
+ "node/no-unsupported-features/es-syntax": "off"
+ }
+ },
+ "tsd": {
+ "compilerOptions": {
+ "resolveJsonModule": true
+ }
+ },
+ "types": "./index.d.ts",
+ "gitHead": "1a1f7e863300f5685c66263086765b8cdcdc3665",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/globals/issues"
+ },
+ "_id": "globals@13.17.0",
+ "_nodeVersion": "14.19.3",
+ "_npmVersion": "8.3.2",
+ "dist": {
+ "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+ "shasum": "902eb1e680a41da93945adbdcb5a9f361ba69bd4",
+ "tarball": "http://localhost:4260/globals/globals-13.17.0.tgz",
+ "fileCount": 6,
+ "unpackedSize": 46315
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/globals.git"
+ },
+ "homepage": "https://github.com/sindresorhus/globals#readme",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/globals/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/graceful-fs/registry.json b/tests/registry/npm/graceful-fs/registry.json
index d0846de29..13d546033 100644
--- a/tests/registry/npm/graceful-fs/registry.json
+++ b/tests/registry/npm/graceful-fs/registry.json
@@ -1 +1,61 @@
-{"name":"graceful-fs","description":"A drop-in replacement for fs, making various improvements.","dist-tags":{"latest":"4.2.10"},"versions":{"4.2.10":{"name":"graceful-fs","description":"A drop-in replacement for fs, making various improvements.","version":"4.2.10","repository":{"type":"git","url":"git+https://github.com/isaacs/node-graceful-fs.git"},"main":"graceful-fs.js","directories":{"test":"test"},"scripts":{"preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags","test":"nyc --silent node test.js | tap -c -","posttest":"nyc report"},"license":"ISC","devDependencies":{"import-fresh":"^2.0.0","mkdirp":"^0.5.0","rimraf":"^2.2.8","tap":"^12.7.0"},"gitHead":"1f19b0b467e4144260b397343cd60f37c5bdcfda","bugs":{"url":"https://github.com/isaacs/node-graceful-fs/issues"},"_id":"graceful-fs@4.2.10","_nodeVersion":"17.6.0","_npmVersion":"8.5.3","dist":{"integrity":"sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==","shasum":"147d3a006da4ca3ce14728c7aefc287c367d7a6c","tarball":"http://localhost:4260/graceful-fs/graceful-fs-4.2.10.tgz","fileCount":7,"unpackedSize":32470,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA1uTjaW3iIxS4M3qAd6G2a1eA2VBnJk3uad5b39KE2kAiAM2jgxR4jcxVjstEzRCd5ydGON5o0VkPyEuFNHKzYupQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSyZoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCzw//UtS3HkPO3bCZalf3uNH+6ZTvOyFSFzjOprlRrOvQ5r51hicp\r\npizQBejiOaCcK5p7tBViXT+bV5otgvJ8dXBjiQQpXuSuSVN13MWs9FsNJANQ\r\nlcmzJRFZwdhoVygtRtuk6Dx9EOG7gfcH3Oud/ztts9iSeDLRsZewzkHtqRBX\r\nAfoAaFn9YNZ/14B0QwsbmOHeURedNmdnPLU5hL3o91LjUe3++TrMPA0BcDFT\r\nN8jguwfX9YoD6GkAO/11Iu9q48QALO6WwdU7+WF3f1kp1GdryxfxaYgTZWMp\r\nOrfgCRpDCzdDZkN8AKTlJkRUnDRHuEeiJB5wfONw1p321XwBx4EbqenZQSkc\r\naBhP8Q20MKRJb6A8tuNKyvx9toSeYY6gj7thORU7RhI4JvJJgGSGNyHeAjz5\r\nV5cap9J8QrI472ZxIth3abdws45yP/f4kVtZ+32GdcCrwkQHiL8VfGYuaPoM\r\nyvULvSiKeDkBZR7oGAHUyM2esHaZcqSQDsQ8aP7dCL/L80iW4qQzvs1Ngmqt\r\nGMzRIAh6LzMG/Q/xX0lLBNLLqa3ajkrcyIjpKFgzhS5TqAr/gNI56i4kgTuP\r\nFPxg6QHN/q8tt/MhWjZA6jZjCs/X7ZjNCFKU1qBhf8ecnqdkFZMo2fQo0tN+\r\nLRaRLDpK3L8hBQ5tY0YmrKHqymSZjT43Voo=\r\n=5ivk\r\n-----END PGP SIGNATURE-----\r\n"},"_hasShrinkwrap":false}},"repository":{"type":"git","url":"git+https://github.com/isaacs/node-graceful-fs.git"},"readme":"# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over [fs module](https://nodejs.org/api/fs.html)\n\n* Queues up `open` and `readdir` calls, and retries them once\n something closes if there is an EMFILE error from too many file\n descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## USAGE\n\n```javascript\n// use just like fs\nvar fs = require('graceful-fs')\n\n// now go and do stuff with it...\nfs.readFile('some-file-or-whatever', (err, data) => {\n // Do stuff here.\n})\n```\n\n## Sync methods\n\nThis module cannot intercept or handle `EMFILE` or `ENFILE` errors from sync\nmethods. If you use sync methods which open file descriptors then you are\nresponsible for dealing with any errors.\n\nThis is a known limitation, not a bug.\n\n## Global Patching\n\nIf you want to patch the global fs module (or any other fs-like\nmodule) you can do this:\n\n```javascript\n// Make sure to read the caveat below.\nvar realFs = require('fs')\nvar gracefulFs = require('graceful-fs')\ngracefulFs.gracefulify(realFs)\n```\n\nThis should only ever be done at the top-level application layer, in\norder to delay on EMFILE errors from any fs-using dependencies. You\nshould **not** do this in a library, because it can cause unexpected\ndelays in other parts of the program.\n\n## Changes\n\nThis module is fairly stable at this point, and used by a lot of\nthings. That being said, because it implements a subtle behavior\nchange in a core part of the node API, even modest changes can be\nextremely breaking, and the versioning is thus biased towards\nbumping the major when in doubt.\n\nThe main change between major versions has been switching between\nproviding a fully-patched `fs` module vs monkey-patching the node core\nbuiltin, and the approach by which a non-monkey-patched `fs` was\ncreated.\n\nThe goal is to trade `EMFILE` errors for slower fs operations. So, if\nyou try to open a zillion files, rather than crashing, `open`\noperations will be queued up and wait for something else to `close`.\n\nThere are advantages to each approach. Monkey-patching the fs means\nthat no `EMFILE` errors can possibly occur anywhere in your\napplication, because everything is using the same core `fs` module,\nwhich is patched. However, it can also obviously cause undesirable\nside-effects, especially if the module is loaded multiple times.\n\nImplementing a separate-but-identical patched `fs` module is more\nsurgical (and doesn't run the risk of patching multiple times), but\nalso imposes the challenge of keeping in sync with the core module.\n\nThe current approach loads the `fs` module, and then creates a\nlookalike object that has all the same methods, except a few that are\npatched. It is safe to use in all versions of Node from 0.8 through\n7.0.\n\n### v4\n\n* Do not monkey-patch the fs module. This module may now be used as a\n drop-in dep, and users can opt into monkey-patching the fs builtin\n if their app requires it.\n\n### v3\n\n* Monkey-patch fs, because the eval approach no longer works on recent\n node.\n* fixed possible type-error throw if rename fails on windows\n* verify that we *never* get EMFILE errors\n* Ignore ENOSYS from chmod/chown\n* clarify that graceful-fs must be used as a drop-in\n\n### v2.1.0\n\n* Use eval rather than monkey-patching fs.\n* readdir: Always sort the results\n* win32: requeue a file if error has an OK status\n\n### v2.0\n\n* A return to monkey patching\n* wrap process.cwd\n\n### v1.1\n\n* wrap readFile\n* Wrap fs.writeFile.\n* readdir protection\n* Don't clobber the fs builtin\n* Handle fs.read EAGAIN errors by trying again\n* Expose the curOpen counter\n* No-op lchown/lchmod if not implemented\n* fs.rename patch only for win32\n* Patch fs.rename to handle AV software on Windows\n* Close #4 Chown should not fail on einval or eperm if non-root\n* Fix isaacs/fstream#1 Only wrap fs one time\n* Fix #3 Start at 1024 max files, then back off on EMFILE\n* lutimes that doens't blow up on Linux\n* A full on-rewrite using a queue instead of just swallowing the EMFILE error\n* Wrap Read/Write streams as well\n\n### 1.0\n\n* Update engines for node 0.6\n* Be lstat-graceful on Windows\n* first\n","readmeFilename":"README.md","homepage":"https://github.com/isaacs/node-graceful-fs#readme","bugs":{"url":"https://github.com/isaacs/node-graceful-fs/issues"},"license":"ISC"}
+{
+ "name": "graceful-fs",
+ "description": "A drop-in replacement for fs, making various improvements.",
+ "dist-tags": {
+ "latest": "4.2.10"
+ },
+ "versions": {
+ "4.2.10": {
+ "name": "graceful-fs",
+ "description": "A drop-in replacement for fs, making various improvements.",
+ "version": "4.2.10",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/node-graceful-fs.git"
+ },
+ "main": "graceful-fs.js",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags",
+ "test": "nyc --silent node test.js | tap -c -",
+ "posttest": "nyc report"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "import-fresh": "^2.0.0",
+ "mkdirp": "^0.5.0",
+ "rimraf": "^2.2.8",
+ "tap": "^12.7.0"
+ },
+ "gitHead": "1f19b0b467e4144260b397343cd60f37c5bdcfda",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-graceful-fs/issues"
+ },
+ "_id": "graceful-fs@4.2.10",
+ "_nodeVersion": "17.6.0",
+ "_npmVersion": "8.5.3",
+ "dist": {
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "shasum": "147d3a006da4ca3ce14728c7aefc287c367d7a6c",
+ "tarball": "http://localhost:4260/graceful-fs/graceful-fs-4.2.10.tgz",
+ "fileCount": 7,
+ "unpackedSize": 32470
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/node-graceful-fs.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/isaacs/node-graceful-fs#readme",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-graceful-fs/issues"
+ },
+ "license": "ISC"
+}
diff --git a/tests/registry/npm/has-flag/registry.json b/tests/registry/npm/has-flag/registry.json
index 3ef16f907..198af78fa 100644
--- a/tests/registry/npm/has-flag/registry.json
+++ b/tests/registry/npm/has-flag/registry.json
@@ -1 +1,66 @@
-{"name":"has-flag","description":"Check if argv has a specific flag","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"has-flag","version":"4.0.0","description":"Check if argv has a specific flag","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/has-flag.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"474aa39afca7333d356c022fc5be4d31732bbba3","bugs":{"url":"https://github.com/sindresorhus/has-flag/issues"},"_id":"has-flag@4.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","dist":{"integrity":"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==","shasum":"944771fd9c81c81265c4d6941860da06bb59479b","tarball":"http://localhost:4260/has-flag/has-flag-4.0.0.tgz","fileCount":5,"unpackedSize":4419,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqMqCCRA9TVsSAnZWagAATrIP/22VegVJi5IYjjhsWhNL\nllQoPP8zRlEq/AG6a36bAVuF2lEGtPvtausr/IUbsWZj83n4orGFECflp7Qb\nAsJ3u6zFZLtnp5ug+AhjcqloCM57A05T2RT1YtMpIStapRGsIVc5xudQJtQI\nC+i8ePGQH42iYtLweN7xEw6UKa1ke8UG9hn8FvNP3EkGJOhS59TL8KfsxD8v\nQaNYjOr15UsRsL8K44afDQyhlO4njhr/e+INBDBQhR9vbjTysSxjf/edhzqu\n0CT+WdecdjAMk5egAjIIIbFTQmJtzITfVGJy/UnDmHF3Dyn68QPCOGVbInzy\ncyR858RhE2DAthInEOTYoM5ZfzH2YVSboXcsVZCn2/qcwmKVEyMcGzb0Mzeb\na2jyCMKacWlFO4LbdlXelLaiAfax5auAGiCtDyVfxV1QzBfGbOPoHpmN3drr\nRGxKBoQnlvXrrofmnnpP6sTHQVJJEo86y+F3WzlTwXqp50sC1gq05JC/TNxp\nOIsT5A8RPYmJBvZZKArMo3dHtlvOPPCN9GNERqrKr6ITq55d6h2dylmi46pJ\n920HPH55IKZlB3w73e3ylfAqEmG1KlM3auk/bHqRZJpdPRxUtHP+9pxweDbV\nNYAxJI6hZ3yMhAU8CwbLGBDYZTXSEJt2QxfJj8Yw4lQbQfUScjiML+MmJipS\nM5jU\r\n=+VZG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFIW6CbIUufytlg7z6IWHf4WQ5H0IgTew2Vydxc86Y04AiBa0VEMmjPBw7a40g+RZ1HkEW18uRdGxBR72XhW67yDew=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# has-flag\n\n> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag\n\n## Install\n\n```\n$ npm install has-flag\n```\n\n## Usage\n\n```js\n// foo.js\nimport hasFlag from 'has-flag';\n\nhasFlag('unicorn');\n//=> true\n\nhasFlag('--unicorn');\n//=> true\n\nhasFlag('f');\n//=> true\n\nhasFlag('-f');\n//=> true\n\nhasFlag('foo=bar');\n//=> true\n\nhasFlag('foo');\n//=> false\n\nhasFlag('rainbow');\n//=> false\n```\n\n```\n$ node foo.js -f --unicorn --foo=bar -- --rainbow\n```\n\n## API\n\n### hasFlag(flag, argv?)\n\nReturns a boolean for whether the flag exists.\n\nIt correctly stops looking after an `--` argument terminator.\n\n#### flag\n\nType: `string`\n\nCLI flag to look for. The `--` prefix is optional.\n\n#### argv\n\nType: `string[]`\\\nDefault: `process.argv`\n\nCLI arguments.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-has-flag?utm_source=npm-has-flag&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/has-flag#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/has-flag.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/has-flag/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "has-flag",
+ "description": "Check if argv has a specific flag",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "has-flag",
+ "version": "4.0.0",
+ "description": "Check if argv has a specific flag",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/has-flag.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "474aa39afca7333d356c022fc5be4d31732bbba3",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/has-flag/issues"
+ },
+ "_id": "has-flag@4.0.0",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "10.15.1",
+ "dist": {
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "shasum": "944771fd9c81c81265c4d6941860da06bb59479b",
+ "tarball": "http://localhost:4260/has-flag/has-flag-4.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4419
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/has-flag#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/has-flag.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/has-flag/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/has-package-exports/registry.json b/tests/registry/npm/has-package-exports/registry.json
index ec958ac5e..dbd462148 100644
--- a/tests/registry/npm/has-package-exports/registry.json
+++ b/tests/registry/npm/has-package-exports/registry.json
@@ -1 +1,120 @@
-{"name":"has-package-exports","dist-tags":{"latest":"1.3.0"},"versions":{"1.3.0":{"name":"has-package-exports","version":"1.3.0","description":"Does the current node version have support for the \"exports\" field in package.json?","main":"no","browser":{"no":"./browser.js","yes":"./browser.js"},"exports":{".":[{"browser":"./browser.js","default":"./yes.js"},"./yes.js"],"./conditional":[{"browser":"./browser.js","import":"./yes.js","require":"./yes.js","node":"./yes.js","default":"./no.js"},"./no.js"],"./pattern":"./pattern.js","./pattern-trailers":"./pattern-trailers.js"},"scripts":{"prepublish":"!(type safe-publish-latest 2>&1 >/dev/null) || not-in-publish || npm run prepublishOnly","prepublishOnly":"safe-publish-latest","lint":"eslint --ext=js,mjs .","pretest":"npm run lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production || true","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"repository":{"type":"git","url":"git+https://github.com/inspect-js/has-package-exports.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"funding":{"url":"https://github.com/sponsors/ljharb"},"license":"MIT","bugs":{"url":"https://github.com/inspect-js/has-package-exports/issues"},"dependencies":{"@ljharb/has-package-exports-patterns":"^0.0.2"},"devDependencies":{"@ljharb/eslint-config":"^20.2.3","aud":"^2.0.0","auto-changelog":"^2.4.0","eslint":"=8.8.0","has-package-exports":"file:.","nyc":"^10.3.2","safe-publish-latest":"^2.0.0","semver":"^6.3.0","tape":"^5.5.2"},"greenkeeper":{"ignore":["semver"]},"auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"gitHead":"10ed49bdd97180c96cd0a24c72e5acf67c6995af","_id":"has-package-exports@1.3.0","_nodeVersion":"17.8.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-e9OeXPQnmPhYoJ63lXC4wWe34TxEGZDZ3OQX9XRqp2VwsfLl3bQBy7VehLnd34g3ef8CmYlBLGqEMKXuz8YazQ==","shasum":"68ee0892a1616893b7e6daed46b74ffdb5079ed6","tarball":"http://localhost:4260/has-package-exports/has-package-exports-1.3.0.tgz","fileCount":13,"unpackedSize":19477,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFijeujs5k90ktAHaPQdPFGO5ijvx6DfP5Erlu+eNzQCAiBAvNyUKfabIx6RHHCzEvIh3KGzDigMvGZemZftPUJynQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTuVcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCChAAjZKw6zbcEsHqHT74JVQoL/JAXwPd5v1NeMX3Awgo+mRxS4/G\r\nZqcVexX241p+AhjxdtBWMixkSBVsX8Tk2QPlhBagrQTgfzj3TgLNnGhhMDWk\r\nSQ/w+rGGi+7d++GCQy+xNZpz38mtwAt03/4Yad3Xc63UC/N4KhN3xKhqa7Un\r\nMTgdTUYchYvToXZoaWmeaSLlNTC/U3oppjonKVxWzO6JYYgDtEayaKzBETDO\r\nMeeCi2JAnOfDNFUHbGZ9NbQ0ZX0VD4xWPqp7cRljvAeVjqM3KQC092buZppB\r\n9wLtbR5L7s7joH6/SZabtVgYClZAZgOnDgbuxQfDLbfTcWmkUYGpr22NeDfm\r\nkl2mUnv6Rc80u2TTAG/jWTgzNHMhcsy3Rymr43POfEHFAXun7bMlwnA1lkQy\r\nBjfw02IA+9tZZfNmZQUYnW0m9LIDKnU47M0zPXY8sskMpdDj4aJLAlzyj+AG\r\nObZdwrsEeWy9GgIFkykJhb0ReJZy3XGCJLvodaKeT/sx5VS6OQnOLAIcoHe5\r\nmD7JtjfzLRZq5sNknxmmnc96OWv+ns1DFRJAKg2TGz6+CaQLqDKPfU3hqtUx\r\nh3teeWgUdxmBHcHkfH6vDYRnQGAY2fi6XMANijGbrPuOBf7oddB0T/gza3Jd\r\nGf15pSLqwYfEByLpO2tQC05Tpsalxqcp9Ys=\r\n=0WVw\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"Does the current node version have support for the \"exports\" field in package.json?","homepage":"https://github.com/inspect-js/has-package-exports#readme","repository":{"type":"git","url":"git+https://github.com/inspect-js/has-package-exports.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"bugs":{"url":"https://github.com/inspect-js/has-package-exports/issues"},"license":"MIT","readme":"# has-package-exports <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nDoes the current node version have support for the \"exports\" field in package.json?\n\nAt the time of this writing, node v12.17+ and v13+ has support for the [\"exports\" field in package.json](https://nodejs.org/api/packages.html#packages_exports).\n\nThis library exports `true` if the current node version supports it, `false` if it does not, and `null` if it's in a browser.\n\nRequire or import `has-package-exports/conditional` to determine if the current environment supports conditional exports (as of this writing, node v12.17+ and v13.7+).\n\nRequire or import `has-package-exports/pattern` to determine if the current environment supports exports patterns (as of this writing, node v12.20+ and v14.13+).\n\nRequire or import `has-package-exports/pattern-trailers` to determine if the current environment supports exports pattern trailers (as of this writing, node v14.19+ and v16.9+).\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n[package-url]: https://npmjs.org/package/has-package-exports\n[npm-version-svg]: https://versionbadg.es/inspect-js/has-package-exports.svg\n[deps-svg]: https://david-dm.org/inspect-js/has-package-exports.svg\n[deps-url]: https://david-dm.org/inspect-js/has-package-exports\n[dev-deps-svg]: https://david-dm.org/inspect-js/has-package-exports/dev-status.svg\n[dev-deps-url]: https://david-dm.org/inspect-js/has-package-exports#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/has-package-exports.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/has-package-exports.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/has-package-exports.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=has-package-exports\n","readmeFilename":"README.md"}
+{
+ "name": "has-package-exports",
+ "dist-tags": {
+ "latest": "1.3.0"
+ },
+ "versions": {
+ "1.3.0": {
+ "name": "has-package-exports",
+ "version": "1.3.0",
+ "description": "Does the current node version have support for the \"exports\" field in package.json?",
+ "main": "no",
+ "browser": {
+ "no": "./browser.js",
+ "yes": "./browser.js"
+ },
+ "exports": {
+ ".": [
+ {
+ "browser": "./browser.js",
+ "default": "./yes.js"
+ },
+ "./yes.js"
+ ],
+ "./conditional": [
+ {
+ "browser": "./browser.js",
+ "import": "./yes.js",
+ "require": "./yes.js",
+ "node": "./yes.js",
+ "default": "./no.js"
+ },
+ "./no.js"
+ ],
+ "./pattern": "./pattern.js",
+ "./pattern-trailers": "./pattern-trailers.js"
+ },
+ "scripts": {
+ "prepublish": "!(type safe-publish-latest 2>&1 >/dev/null) || not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "lint": "eslint --ext=js,mjs .",
+ "pretest": "npm run lint",
+ "test": "npm run tests-only",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "posttest": "aud --production || true",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-package-exports.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-package-exports/issues"
+ },
+ "dependencies": {
+ "@ljharb/has-package-exports-patterns": "^0.0.2"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^20.2.3",
+ "aud": "^2.0.0",
+ "auto-changelog": "^2.4.0",
+ "eslint": "=8.8.0",
+ "has-package-exports": "file:.",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "semver": "^6.3.0",
+ "tape": "^5.5.2"
+ },
+ "greenkeeper": {
+ "ignore": [
+ "semver"
+ ]
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "gitHead": "10ed49bdd97180c96cd0a24c72e5acf67c6995af",
+ "_id": "has-package-exports@1.3.0",
+ "_nodeVersion": "17.8.0",
+ "_npmVersion": "8.3.1",
+ "dist": {
+ "integrity": "sha512-e9OeXPQnmPhYoJ63lXC4wWe34TxEGZDZ3OQX9XRqp2VwsfLl3bQBy7VehLnd34g3ef8CmYlBLGqEMKXuz8YazQ==",
+ "shasum": "68ee0892a1616893b7e6daed46b74ffdb5079ed6",
+ "tarball": "http://localhost:4260/has-package-exports/has-package-exports-1.3.0.tgz",
+ "fileCount": 13,
+ "unpackedSize": 19477
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Does the current node version have support for the \"exports\" field in package.json?",
+ "homepage": "https://github.com/inspect-js/has-package-exports#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-package-exports.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-package-exports/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/has-property-descriptors/registry.json b/tests/registry/npm/has-property-descriptors/registry.json
index 095de7d01..9003b2b89 100644
--- a/tests/registry/npm/has-property-descriptors/registry.json
+++ b/tests/registry/npm/has-property-descriptors/registry.json
@@ -1 +1,99 @@
-{"name":"has-property-descriptors","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"has-property-descriptors","version":"1.0.0","description":"Does the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.","main":"index.js","exports":{".":"./index.js","./package.json":"./package.json"},"sideEffects":false,"scripts":{"prepublishOnly":"safe-publish-latest","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run lint","prelint":"evalmd README.md","lint":"eslint --ext=js,mjs .","tests-only":"nyc tape 'test/**/*.js'","test":"npm run tests-only","posttest":"aud --production","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"repository":{"type":"git","url":"git+https://github.com/inspect-js/has-property-descriptors.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"funding":{"url":"https://github.com/sponsors/ljharb"},"license":"MIT","bugs":{"url":"https://github.com/inspect-js/has-property-descriptors/issues"},"devDependencies":{"@ljharb/eslint-config":"^21.0.0","aud":"^2.0.0","auto-changelog":"^2.4.0","eslint":"=8.8.0","in-publish":"^2.0.1","evalmd":"^0.0.19","nyc":"^10.3.2","safe-publish-latest":"^2.0.0","tape":"^5.5.3"},"dependencies":{"get-intrinsic":"^1.1.1"},"testling":{"files":"test/index.js"},"auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"gitHead":"3771c8b4f20e963d3a64b101b3233c20791c32ae","_id":"has-property-descriptors@1.0.0","_nodeVersion":"17.9.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==","shasum":"610708600606d36961ed04c196193b6a607fa861","tarball":"http://localhost:4260/has-property-descriptors/has-property-descriptors-1.0.0.tgz","fileCount":9,"unpackedSize":9308,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGu4gOEZPx0AUfM6YuqldUOElOureYihKd6CDr1Dpv9gAiBYuTEkAw8K4moKvJ7BXTohQQAJNKNWCnAJlOEyg06yYg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWQgoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpuEhAAlWpOnMjEOy8ZCmrOUmE82lejonXdgy/c0+t609UYz2VO0nKr\r\n0RqhNm3xSvSU/0wMa1LOKb0rcNnRNk9YFffxDMWi6xE84n7jjWbf1vcZ1xEb\r\nFLb5T7MGEveF6lNeeMLOZPJVyQ3WDEwio5meyayWVRzEBrJq5yT+e5/hgFwz\r\nLDxMfil2CosRkDeqr+YHJC5s57qcTOkM0SKLv7pfvtVymnFPuVjTkZfwb26g\r\nwRu7oVkZFjIBf6bG0wCxj9fMCMsHpKI27rU9O3K+U0DCJLtSG92bTyvDJ0ig\r\nNLBiX5zwelnLHUEGmvIwt3/V2ZxFvK5Soymnk4COvCI3QgJkGAKoBJDgsLmP\r\nDcvHe5NEidZqvh/8kfiqwHqQ0tAUImPGQoQ3j+Sx6oN3+q+6d9RWkUyfv69I\r\n0268s/Mf2Rf7Ow0PbgkQn3qq/dxR/PvPKDSTz53gpmiDd79Hqjv9KTNTawBG\r\nHF/Nga5rVOUZHQgvhaOoXrGDsIVLfKeda+UrFwKHN4zkbvO58LaBoIMjHKz3\r\nLB8Qddh4Cqm4QdK6fBgmrDyCI79AIICCeETfQCGU/gitLcS0mQTCIHFSdwtR\r\nwt0t85krp1lpjhKA8HfHgwj5Ky9A/KdFPI1DrbbqjJiRCAnsSJzdJuw0eXcn\r\nUai87G82D9Q2HmEpEgBhWKsa8PQU4pO18E0=\r\n=iq2o\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"description":"Does the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.","homepage":"https://github.com/inspect-js/has-property-descriptors#readme","repository":{"type":"git","url":"git+https://github.com/inspect-js/has-property-descriptors.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com"},"bugs":{"url":"https://github.com/inspect-js/has-property-descriptors/issues"},"license":"MIT","readme":"# has-property-descriptors <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nDoes the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.\n\n## Example\n\n```js\nvar hasPropertyDescriptors = require('has-property-descriptors');\nvar assert = require('assert');\n\nassert.equal(hasPropertyDescriptors(), true); // will be `false` in IE 6-8, and ES5 engines\n\n// Arrays can not have their length `[[Defined]]` in some engines\nassert.equal(hasPropertyDescriptors.hasArrayLengthDefineBug(), false); // will be `true` in Firefox 4-22, and node v0.6\n```\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n[package-url]: https://npmjs.org/package/has-property-descriptors\n[npm-version-svg]: https://versionbadg.es/inspect-js/has-property-descriptors.svg\n[deps-svg]: https://david-dm.org/inspect-js/has-property-descriptors.svg\n[deps-url]: https://david-dm.org/inspect-js/has-property-descriptors\n[dev-deps-svg]: https://david-dm.org/inspect-js/has-property-descriptors/dev-status.svg\n[dev-deps-url]: https://david-dm.org/inspect-js/has-property-descriptors#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/has-property-descriptors.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/has-property-descriptors.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/has-property-descriptors.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=has-property-descriptors\n[codecov-image]: https://codecov.io/gh/inspect-js/has-property-descriptors/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/inspect-js/has-property-descriptors/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/has-property-descriptors\n[actions-url]: https://github.com/inspect-js/has-property-descriptors/actions\n","readmeFilename":"README.md"}
+{
+ "name": "has-property-descriptors",
+ "dist-tags": {
+ "latest": "1.0.0"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "has-property-descriptors",
+ "version": "1.0.0",
+ "description": "Does the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.",
+ "main": "index.js",
+ "exports": {
+ ".": "./index.js",
+ "./package.json": "./package.json"
+ },
+ "sideEffects": false,
+ "scripts": {
+ "prepublishOnly": "safe-publish-latest",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "pretest": "npm run lint",
+ "prelint": "evalmd README.md",
+ "lint": "eslint --ext=js,mjs .",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-property-descriptors.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-property-descriptors/issues"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.0.0",
+ "aud": "^2.0.0",
+ "auto-changelog": "^2.4.0",
+ "eslint": "=8.8.0",
+ "in-publish": "^2.0.1",
+ "evalmd": "^0.0.19",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.5.3"
+ },
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "testling": {
+ "files": "test/index.js"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "gitHead": "3771c8b4f20e963d3a64b101b3233c20791c32ae",
+ "_id": "has-property-descriptors@1.0.0",
+ "_nodeVersion": "17.9.0",
+ "_npmVersion": "8.3.1",
+ "dist": {
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "shasum": "610708600606d36961ed04c196193b6a607fa861",
+ "tarball": "http://localhost:4260/has-property-descriptors/has-property-descriptors-1.0.0.tgz",
+ "fileCount": 9,
+ "unpackedSize": 9308
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Does the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.",
+ "homepage": "https://github.com/inspect-js/has-property-descriptors#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/has-property-descriptors.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/inspect-js/has-property-descriptors/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/has-symbols/registry.json b/tests/registry/npm/has-symbols/registry.json
index be1f50cec..8d6883765 100644
--- a/tests/registry/npm/has-symbols/registry.json
+++ b/tests/registry/npm/has-symbols/registry.json
@@ -1 +1,120 @@
-{"name":"has-symbols","description":"Determine if the JS environment has Symbol support. Supports spec, or shams.","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.3":{"name":"has-symbols","version":"1.0.3","description":"Determine if the JS environment has Symbol support. Supports spec, or shams.","main":"index.js","scripts":{"prepublishOnly":"safe-publish-latest","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent lint","test":"npm run tests-only","posttest":"aud --production","tests-only":"npm run test:stock && npm run test:staging && npm run test:shams","test:stock":"nyc node test","test:staging":"nyc node --harmony --es-staging test","test:shams":"npm run --silent test:shams:getownpropertysymbols && npm run --silent test:shams:corejs","test:shams:corejs":"nyc node test/shams/core-js.js","test:shams:getownpropertysymbols":"nyc node test/shams/get-own-property-symbols.js","lint":"eslint --ext=js,mjs .","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"repository":{"type":"git","url":"git://github.com/inspect-js/has-symbols.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"},"funding":{"url":"https://github.com/sponsors/ljharb"},"license":"MIT","bugs":{"url":"https://github.com/ljharb/has-symbols/issues"},"devDependencies":{"@ljharb/eslint-config":"^20.2.3","aud":"^2.0.0","auto-changelog":"^2.4.0","core-js":"^2.6.12","eslint":"=8.8.0","get-own-property-symbols":"^0.9.5","nyc":"^10.3.2","safe-publish-latest":"^2.0.0","tape":"^5.5.2"},"testling":{"files":"test/index.js","browsers":["iexplore/6.0..latest","firefox/3.0..6.0","firefox/15.0..latest","firefox/nightly","chrome/4.0..10.0","chrome/20.0..latest","chrome/canary","opera/10.0..latest","opera/next","safari/4.0..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2"]},"engines":{"node":">= 0.4"},"auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"greenkeeper":{"ignore":["core-js"]},"gitHead":"444dc14d035df9891743a28cbc5d6ecdb0cb3b01","_id":"has-symbols@1.0.3","_nodeVersion":"17.6.0","_npmVersion":"8.5.2","dist":{"integrity":"sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==","shasum":"bb7b2c4349251dce87b125f7bdf874aa7c8b39f8","tarball":"http://localhost:4260/has-symbols/has-symbols-1.0.3.tgz","fileCount":13,"unpackedSize":20603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiHo7dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJTg//VKZyTT/GxVMPZNQFC6Q05AQ+zwFmm1ePSsyP3+hebhjz0KMZ\r\nZh8Z3oaFj53lk6p6hl6wJgJh8v+4H8tYi90zewuk2/sv/r4gS8KKOJkEU5hS\r\nExpiO/FlpW1EBW0kHcPOLiYkyvhm5iNX17o0qUXw62EVu9pFdzLuMLtoVch9\r\n0RC3armyFU5YXjpr4lQCbHCAK6okYFFh6BGQYB0k/to/o1YZ3QijFZ7cDlyl\r\nUSH33b6VFsD9gVT6pVYGmhwPfbxrUzvgpmMeJqdL940V3BgVDu9h/lXFDpvC\r\nyf9vmUEiVkcxeiIbJuusCQjMbPT31uYDaAYY+W+v4pbD552jb/7Gm2ttl1uV\r\n1yx9J3M5aKbjZWMVfRinlfGoyUIs0rpxhSsQTp84skwPLkXC1YfODYNhy4+o\r\nVR5GNTIDDOB4i4y7lGVvx7Vd4ySP+Tz9YpmFI9ZrCnEVXggUn9y+PU8R19UJ\r\nrOVAYikVzsyC5PT9PKr2lvITXDb8siGUNt8YmJhZupzv3K+I5sEojmpqCGvP\r\nW748lmzXQAFYUY/BL1/zChahtp6w5mBaX79uF/xO7h/owukFCK2Y1Seyz4HP\r\nFzn6kDQM+TcUD9GlOhy1OsSLVhuK+gbGupNtSG52OaR9JVtmxSzd83TujaTF\r\ncDmeevwmNQi4Gnt70AILlnaCxXanGrp0epk=\r\n=B5Gh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwzczMy98ycY151XrPoURp8chFzfXRYegRhpOydLT8UgIgb/6c33xTl81h3biIUwEWPJAVPlOf6E2AEaWCvLmPOck="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# has-symbols <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][5]][6]\n[![dev dependency status][7]][8]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][11]][1]\n\nDetermine if the JS environment has Symbol support. Supports spec, or shams.\n\n## Example\n\n```js\nvar hasSymbols = require('has-symbols');\n\nhasSymbols() === true; // if the environment has native Symbol support. Not polyfillable, not forgeable.\n\nvar hasSymbolsKinda = require('has-symbols/shams');\nhasSymbolsKinda() === true; // if the environment has a Symbol sham that mostly follows the spec.\n```\n\n## Supported Symbol shams\n - get-own-property-symbols [npm](https://www.npmjs.com/package/get-own-property-symbols) | [github](https://github.com/WebReflection/get-own-property-symbols)\n - core-js [npm](https://www.npmjs.com/package/core-js) | [github](https://github.com/zloirock/core-js)\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n[1]: https://npmjs.org/package/has-symbols\n[2]: https://versionbadg.es/inspect-js/has-symbols.svg\n[5]: https://david-dm.org/inspect-js/has-symbols.svg\n[6]: https://david-dm.org/inspect-js/has-symbols\n[7]: https://david-dm.org/inspect-js/has-symbols/dev-status.svg\n[8]: https://david-dm.org/inspect-js/has-symbols#info=devDependencies\n[11]: https://nodei.co/npm/has-symbols.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/has-symbols.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/has-symbols.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=has-symbols\n[codecov-image]: https://codecov.io/gh/inspect-js/has-symbols/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/inspect-js/has-symbols/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/has-symbols\n[actions-url]: https://github.com/inspect-js/has-symbols/actions\n","homepage":"https://github.com/ljharb/has-symbols#readme","repository":{"type":"git","url":"git://github.com/inspect-js/has-symbols.git"},"author":{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"},"bugs":{"url":"https://github.com/ljharb/has-symbols/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "has-symbols",
+ "description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
+ "dist-tags": {
+ "latest": "1.0.3"
+ },
+ "versions": {
+ "1.0.3": {
+ "name": "has-symbols",
+ "version": "1.0.3",
+ "description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
+ "main": "index.js",
+ "scripts": {
+ "prepublishOnly": "safe-publish-latest",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "pretest": "npm run --silent lint",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "tests-only": "npm run test:stock && npm run test:staging && npm run test:shams",
+ "test:stock": "nyc node test",
+ "test:staging": "nyc node --harmony --es-staging test",
+ "test:shams": "npm run --silent test:shams:getownpropertysymbols && npm run --silent test:shams:corejs",
+ "test:shams:corejs": "nyc node test/shams/core-js.js",
+ "test:shams:getownpropertysymbols": "nyc node test/shams/get-own-property-symbols.js",
+ "lint": "eslint --ext=js,mjs .",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/inspect-js/has-symbols.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ljharb/has-symbols/issues"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^20.2.3",
+ "aud": "^2.0.0",
+ "auto-changelog": "^2.4.0",
+ "core-js": "^2.6.12",
+ "eslint": "=8.8.0",
+ "get-own-property-symbols": "^0.9.5",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.5.2"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "greenkeeper": {
+ "ignore": [
+ "core-js"
+ ]
+ },
+ "gitHead": "444dc14d035df9891743a28cbc5d6ecdb0cb3b01",
+ "_id": "has-symbols@1.0.3",
+ "_nodeVersion": "17.6.0",
+ "_npmVersion": "8.5.2",
+ "dist": {
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "shasum": "bb7b2c4349251dce87b125f7bdf874aa7c8b39f8",
+ "tarball": "http://localhost:4260/has-symbols/has-symbols-1.0.3.tgz",
+ "fileCount": 13,
+ "unpackedSize": 20603
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/ljharb/has-symbols#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/inspect-js/has-symbols.git"
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/has-symbols/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/has/registry.json b/tests/registry/npm/has/registry.json
index 2ed8bcaa1..9de4070c1 100644
--- a/tests/registry/npm/has/registry.json
+++ b/tests/registry/npm/has/registry.json
@@ -1 +1,76 @@
-{"name":"has","description":"Object.prototype.hasOwnProperty.call shortcut","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.3":{"name":"has","description":"Object.prototype.hasOwnProperty.call shortcut","version":"1.0.3","author":{"name":"Thiago de Arruda","email":"tpadilha84@gmail.com"},"repository":{"type":"git","url":"git://github.com/tarruda/has.git"},"bugs":{"url":"https://github.com/tarruda/has/issues"},"license":"MIT","licenses":[{"type":"MIT","url":"https://github.com/tarruda/has/blob/master/LICENSE-MIT"}],"main":"./src","dependencies":{"function-bind":"^1.1.1"},"devDependencies":{"@ljharb/eslint-config":"^12.2.1","eslint":"^4.19.1","tape":"^4.9.0"},"engines":{"node":">= 0.4.0"},"scripts":{"lint":"eslint .","pretest":"npm run lint","test":"tape test"},"gitHead":"4edf96f2dec87ad6b6e68482e8f6d7c8eb7e07e6","_id":"has@1.0.3","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","dist":{"integrity":"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==","shasum":"722d7cbfc1f6aa8241f16dd814e011e1f41e8796","tarball":"http://localhost:4260/has/has-1.0.3.tgz","fileCount":5,"unpackedSize":2770,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFWeCCRA9TVsSAnZWagAAGqoP/3/GpNmBbr2IzYG0v9Rg\n0jDcyA0p95I8Tc1GbOsB0YWMY+VMs5I3tggHG4yjB8OskeR7GyItfcZpe9b5\nEGNr2Yq/eOKI602MTnWzHaAczxF887EVcXDISg1qDlzjTYWFMNms5jDxH6OT\nKD0SLHE1qRCASPxNZsJLoxT/dPaVfRC5QMIz8msEaI+qUu8p54cO0/DSLSlT\n5kCGKA5CfbfIODAmyvddsKgOW0at16XJ97f+qHhrI5q6HoYdM2jcLzPXxPiw\nSgPKXICus5TjFvRdBoOXa2diz9urPjQGzVsGoKs8W0Z9EeoxpiJInVRN1Hec\nabW1NzLvINbuFcG1I/CvNVXKGKwIafKg25ba/T/PHa/5rHY2+S4Y9Mj0SLFv\n8V7HWSQMGaG86kZjH9vgd7MPP39lBZXw5msjftiRVxiDiZYutbGzBymwHcYd\nzPVrzCfdNg9o2OsG8mjIBGntCwz9/Yrx7npK9mP97nZQ4EDDoDoCga5efkMP\nmT02Vru1cCdHOfRnM/tlr4Onf0umRhgzUfsbjdSsrGapGCTeVvBvnm6XKznZ\nw9HWfGyNaZiT1J0/pmnRMwxEp/xcKMaAOa1c2pisTGpjkbQloGQx77IwfBiO\nAVBfV3yBDWCgutiwEb4zg0RPPjlS1RCJDMzg+CsXT1u9H6St8MUtuBikkNr4\ndlxV\r\n=Dlp+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDi2aj8+sqrebhyEkv7F23LOzXMTe0zUrFZqtxhj4ubhQIhAM8njQhxRA7zu5nYQHE3+EN4rJa5+9EpwlJiBeEkLn54"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# has\n\n> Object.prototype.hasOwnProperty.call shortcut\n\n## Installation\n\n```sh\nnpm install --save has\n```\n\n## Usage\n\n```js\nvar has = require('has');\n\nhas({}, 'hasOwnProperty'); // false\nhas(Object.prototype, 'hasOwnProperty'); // true\n```\n","author":{"name":"Thiago de Arruda","email":"tpadilha84@gmail.com"},"repository":{"type":"git","url":"git://github.com/tarruda/has.git"},"homepage":"https://github.com/tarruda/has","bugs":{"url":"https://github.com/tarruda/has/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "has",
+ "description": "Object.prototype.hasOwnProperty.call shortcut",
+ "dist-tags": {
+ "latest": "1.0.3"
+ },
+ "versions": {
+ "1.0.3": {
+ "name": "has",
+ "description": "Object.prototype.hasOwnProperty.call shortcut",
+ "version": "1.0.3",
+ "author": {
+ "name": "Thiago de Arruda",
+ "email": "tpadilha84@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/tarruda/has.git"
+ },
+ "bugs": {
+ "url": "https://github.com/tarruda/has/issues"
+ },
+ "license": "MIT",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://github.com/tarruda/has/blob/master/LICENSE-MIT"
+ }
+ ],
+ "main": "./src",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^12.2.1",
+ "eslint": "^4.19.1",
+ "tape": "^4.9.0"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "pretest": "npm run lint",
+ "test": "tape test"
+ },
+ "gitHead": "4edf96f2dec87ad6b6e68482e8f6d7c8eb7e07e6",
+ "_id": "has@1.0.3",
+ "_npmVersion": "6.1.0",
+ "_nodeVersion": "10.3.0",
+ "dist": {
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "shasum": "722d7cbfc1f6aa8241f16dd814e011e1f41e8796",
+ "tarball": "http://localhost:4260/has/has-1.0.3.tgz",
+ "fileCount": 5,
+ "unpackedSize": 2770
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Thiago de Arruda",
+ "email": "tpadilha84@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/tarruda/has.git"
+ },
+ "homepage": "https://github.com/tarruda/has",
+ "bugs": {
+ "url": "https://github.com/tarruda/has/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/http-cache-semantics/registry.json b/tests/registry/npm/http-cache-semantics/registry.json
index 1a0d11c31..ce3a72c1d 100644
--- a/tests/registry/npm/http-cache-semantics/registry.json
+++ b/tests/registry/npm/http-cache-semantics/registry.json
@@ -1 +1,62 @@
-{"name":"http-cache-semantics","description":"Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies","dist-tags":{"latest":"4.1.1"},"versions":{"4.1.1":{"name":"http-cache-semantics","version":"4.1.1","description":"Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies","repository":{"type":"git","url":"git+https://github.com/kornelski/http-cache-semantics.git"},"main":"index.js","scripts":{"test":"mocha"},"author":{"name":"Kornel Lesiński","email":"kornel@geekhood.net","url":"https://kornel.ski/"},"license":"BSD-2-Clause","devDependencies":{"mocha":"^10.0"},"gitHead":"24496504352199caf360d1b4d4a01efdc8a7249e","bugs":{"url":"https://github.com/kornelski/http-cache-semantics/issues"},"_id":"http-cache-semantics@4.1.1","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==","shasum":"abe02fcb2985460bf0323be664436ec3476a6d5a","tarball":"http://localhost:4260/http-cache-semantics/http-cache-semantics-4.1.1.tgz","fileCount":4,"unpackedSize":35938,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGygvN3Se0zxQ/mTxHNc2vU4yMZ9gjqZ5Eg074xkMbAVAiEAlQ2uBmUo2WnAkHmlZ9RWL4swb0m5SqfSyDDgvOwZIcE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0yjnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7VxAAkpq0uXaMxwzz6Wmq1wgvIbx80vTxTRni9wrPU/0YAJHtsU/R\r\nUcZ/ypDzvJaSSrdjUXZcWhb/Md6Gfzq89AA4aqo71pzRTEMAu/9LFAU/NFRR\r\nWc9RrzC9LyRM+Sn6qaCQ2pBPyyqo8O2hVtbuWaHuL6XNk0HpCNkBfhEJsKM5\r\n49vZYiGEXvmSlHY2VQ0GSbNcvLyIQ28pjC0mOcdJ/l4OUqSzcXpxmYPzoNLq\r\nL7yVEKCpdykEt2INBA+G9Px3ixmc6HsCme6z967gC33dKnOYKtewCquHhMYo\r\n6dublLQ8ulGSkJTnknqC3dx5yzh2I4dAe2TLFFrDfpN3jLShaHhjkJTQ3omc\r\nukNmNU41dyJyLj/IwXvcyYy4Ec6dB59F/ctnEB6Fg8xES3AYrYSF1bqV4D39\r\ncRS8k+N4bq5l+2v7yuOnkHb+qAAgCBcC3qsYHGwwXPaXCKRwxhErqOrQCBl9\r\nmICS9tm8Ft6+y17DW7Mzr2lhdwiHJAepUxpVgSPf3JOSwdrAYrNU/KW4b58B\r\nJxUPeS9KXfCzjxhXNVt5o7r7hyobkNU1UzpapO408C4Sl50GyRxXYL27r7Ps\r\nhodtirKJSkzYSxamQmwrrQ9AdD9QYKEXIxJ8UX1TN9tSa1Xpysbe+Ggt6Tob\r\nV+CE74/nWjnTlfg39VSdnYPU1eXCyZTJmzw=\r\n=hHfC\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# Can I cache this? [![Build Status](https://travis-ci.org/kornelski/http-cache-semantics.svg?branch=master)](https://travis-ci.org/kornelski/http-cache-semantics)\n\n`CachePolicy` tells when responses can be reused from a cache, taking into account [HTTP RFC 7234](http://httpwg.org/specs/rfc7234.html) rules for user agents and shared caches.\nIt also implements [RFC 5861](https://tools.ietf.org/html/rfc5861), implementing `stale-if-error` and `stale-while-revalidate`.\nIt's aware of many tricky details such as the `Vary` header, proxy revalidation, and authenticated responses.\n\n## Usage\n\nCacheability of an HTTP response depends on how it was requested, so both `request` and `response` are required to create the policy.\n\n```js\nconst policy = new CachePolicy(request, response, options);\n\nif (!policy.storable()) {\n // throw the response away, it's not usable at all\n return;\n}\n\n// Cache the data AND the policy object in your cache\n// (this is pseudocode, roll your own cache (lru-cache package works))\nletsPretendThisIsSomeCache.set(\n request.url,\n { policy, response },\n policy.timeToLive()\n);\n```\n\n```js\n// And later, when you receive a new request:\nconst { policy, response } = letsPretendThisIsSomeCache.get(newRequest.url);\n\n// It's not enough that it exists in the cache, it has to match the new request, too:\nif (policy && policy.satisfiesWithoutRevalidation(newRequest)) {\n // OK, the previous response can be used to respond to the `newRequest`.\n // Response headers have to be updated, e.g. to add Age and remove uncacheable headers.\n response.headers = policy.responseHeaders();\n return response;\n}\n```\n\nIt may be surprising, but it's not enough for an HTTP response to be [fresh](#yo-fresh) to satisfy a request. It may need to match request headers specified in `Vary`. Even a matching fresh response may still not be usable if the new request restricted cacheability, etc.\n\nThe key method is `satisfiesWithoutRevalidation(newRequest)`, which checks whether the `newRequest` is compatible with the original request and whether all caching conditions are met.\n\n### Constructor options\n\nRequest and response must have a `headers` property with all header names in lower case. `url`, `status` and `method` are optional (defaults are any URL, status `200`, and `GET` method).\n\n```js\nconst request = {\n url: '/',\n method: 'GET',\n headers: {\n accept: '*/*',\n },\n};\n\nconst response = {\n status: 200,\n headers: {\n 'cache-control': 'public, max-age=7234',\n },\n};\n\nconst options = {\n shared: true,\n cacheHeuristic: 0.1,\n immutableMinTimeToLive: 24 * 3600 * 1000, // 24h\n ignoreCargoCult: false,\n};\n```\n\nIf `options.shared` is `true` (default), then the response is evaluated from a perspective of a shared cache (i.e. `private` is not cacheable and `s-maxage` is respected). If `options.shared` is `false`, then the response is evaluated from a perspective of a single-user cache (i.e. `private` is cacheable and `s-maxage` is ignored). `shared: true` is recommended for HTTP clients.\n\n`options.cacheHeuristic` is a fraction of response's age that is used as a fallback cache duration. The default is 0.1 (10%), e.g. if a file hasn't been modified for 100 days, it'll be cached for 100\\*0.1 = 10 days.\n\n`options.immutableMinTimeToLive` is a number of milliseconds to assume as the default time to cache responses with `Cache-Control: immutable`. Note that [per RFC](http://httpwg.org/http-extensions/immutable.html) these can become stale, so `max-age` still overrides the default.\n\nIf `options.ignoreCargoCult` is true, common anti-cache directives will be completely ignored if the non-standard `pre-check` and `post-check` directives are present. These two useless directives are most commonly found in bad StackOverflow answers and PHP's \"session limiter\" defaults.\n\n### `storable()`\n\nReturns `true` if the response can be stored in a cache. If it's `false` then you MUST NOT store either the request or the response.\n\n### `satisfiesWithoutRevalidation(newRequest)`\n\nThis is the most important method. Use this method to check whether the cached response is still fresh in the context of the new request.\n\nIf it returns `true`, then the given `request` matches the original response this cache policy has been created with, and the response can be reused without contacting the server. Note that the old response can't be returned without being updated, see `responseHeaders()`.\n\nIf it returns `false`, then the response may not be matching at all (e.g. it's for a different URL or method), or may require to be refreshed first (see `revalidationHeaders()`).\n\n### `responseHeaders()`\n\nReturns updated, filtered set of response headers to return to clients receiving the cached response. This function is necessary, because proxies MUST always remove hop-by-hop headers (such as `TE` and `Connection`) and update response's `Age` to avoid doubling cache time.\n\n```js\ncachedResponse.headers = cachePolicy.responseHeaders(cachedResponse);\n```\n\n### `timeToLive()`\n\nReturns approximate time in _milliseconds_ until the response becomes stale (i.e. not fresh).\n\nAfter that time (when `timeToLive() <= 0`) the response might not be usable without revalidation. However, there are exceptions, e.g. a client can explicitly allow stale responses, so always check with `satisfiesWithoutRevalidation()`.\n`stale-if-error` and `stale-while-revalidate` extend the time to live of the cache, that can still be used if stale.\n\n### `toObject()`/`fromObject(json)`\n\nChances are you'll want to store the `CachePolicy` object along with the cached response. `obj = policy.toObject()` gives a plain JSON-serializable object. `policy = CachePolicy.fromObject(obj)` creates an instance from it.\n\n### Refreshing stale cache (revalidation)\n\nWhen a cached response has expired, it can be made fresh again by making a request to the origin server. The server may respond with status 304 (Not Modified) without sending the response body again, saving bandwidth.\n\nThe following methods help perform the update efficiently and correctly.\n\n#### `revalidationHeaders(newRequest)`\n\nReturns updated, filtered set of request headers to send to the origin server to check if the cached response can be reused. These headers allow the origin server to return status 304 indicating the response is still fresh. All headers unrelated to caching are passed through as-is.\n\nUse this method when updating cache from the origin server.\n\n```js\nupdateRequest.headers = cachePolicy.revalidationHeaders(updateRequest);\n```\n\n#### `revalidatedPolicy(revalidationRequest, revalidationResponse)`\n\nUse this method to update the cache after receiving a new response from the origin server. It returns an object with two keys:\n\n- `policy` — A new `CachePolicy` with HTTP headers updated from `revalidationResponse`. You can always replace the old cached `CachePolicy` with the new one.\n- `modified` — Boolean indicating whether the response body has changed.\n - If `false`, then a valid 304 Not Modified response has been received, and you can reuse the old cached response body. This is also affected by `stale-if-error`.\n - If `true`, you should use new response's body (if present), or make another request to the origin server without any conditional headers (i.e. don't use `revalidationHeaders()` this time) to get the new resource.\n\n```js\n// When serving requests from cache:\nconst { oldPolicy, oldResponse } = letsPretendThisIsSomeCache.get(\n newRequest.url\n);\n\nif (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {\n // Change the request to ask the origin server if the cached response can be used\n newRequest.headers = oldPolicy.revalidationHeaders(newRequest);\n\n // Send request to the origin server. The server may respond with status 304\n const newResponse = await makeRequest(newRequest);\n\n // Create updated policy and combined response from the old and new data\n const { policy, modified } = oldPolicy.revalidatedPolicy(\n newRequest,\n newResponse\n );\n const response = modified ? newResponse : oldResponse;\n\n // Update the cache with the newer/fresher response\n letsPretendThisIsSomeCache.set(\n newRequest.url,\n { policy, response },\n policy.timeToLive()\n );\n\n // And proceed returning cached response as usual\n response.headers = policy.responseHeaders();\n return response;\n}\n```\n\n# Yo, FRESH\n\n![satisfiesWithoutRevalidation](fresh.jpg)\n\n## Used by\n\n- [ImageOptim API](https://imageoptim.com/api), [make-fetch-happen](https://github.com/zkat/make-fetch-happen), [cacheable-request](https://www.npmjs.com/package/cacheable-request) ([got](https://www.npmjs.com/package/got)), [npm/registry-fetch](https://github.com/npm/registry-fetch), [etc.](https://github.com/kornelski/http-cache-semantics/network/dependents)\n\n## Implemented\n\n- `Cache-Control` response header with all the quirks.\n- `Expires` with check for bad clocks.\n- `Pragma` response header.\n- `Age` response header.\n- `Vary` response header.\n- Default cacheability of statuses and methods.\n- Requests for stale data.\n- Filtering of hop-by-hop headers.\n- Basic revalidation request\n- `stale-if-error`\n\n## Unimplemented\n\n- Merging of range requests, `If-Range` (but correctly supports them as non-cacheable)\n- Revalidation of multiple representations\n\n### Trusting server `Date`\n\nPer the RFC, the cache should take into account the time between server-supplied `Date` and the time it received the response. The RFC-mandated behavior creates two problems:\n\n * Servers with incorrectly set timezone may add several hours to cache age (or more, if the clock is completely wrong).\n * Even reasonably correct clocks may be off by a couple of seconds, breaking `max-age=1` trick (which is useful for reverse proxies on high-traffic servers).\n\nPrevious versions of this library had an option to ignore the server date if it was \"too inaccurate\". To support the `max-age=1` trick the library also has to ignore dates that pretty accurate. There's no point of having an option to trust dates that are only a bit inaccurate, so this library won't trust any server dates. `max-age` will be interpreted from the time the response has been received, not from when it has been sent. This will affect only [RFC 1149 networks](https://tools.ietf.org/html/rfc1149).\n","homepage":"https://github.com/kornelski/http-cache-semantics#readme","repository":{"type":"git","url":"git+https://github.com/kornelski/http-cache-semantics.git"},"author":{"name":"Kornel Lesiński","email":"kornel@geekhood.net","url":"https://kornel.ski/"},"bugs":{"url":"https://github.com/kornelski/http-cache-semantics/issues"},"license":"BSD-2-Clause","readmeFilename":"README.md"}
+{
+ "name": "http-cache-semantics",
+ "description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
+ "dist-tags": {
+ "latest": "4.1.1"
+ },
+ "versions": {
+ "4.1.1": {
+ "name": "http-cache-semantics",
+ "version": "4.1.1",
+ "description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/kornelski/http-cache-semantics.git"
+ },
+ "main": "index.js",
+ "scripts": {
+ "test": "mocha"
+ },
+ "author": {
+ "name": "Kornel Lesiński",
+ "email": "kornel@geekhood.net",
+ "url": "https://kornel.ski/"
+ },
+ "license": "BSD-2-Clause",
+ "devDependencies": {
+ "mocha": "^10.0"
+ },
+ "gitHead": "24496504352199caf360d1b4d4a01efdc8a7249e",
+ "bugs": {
+ "url": "https://github.com/kornelski/http-cache-semantics/issues"
+ },
+ "_id": "http-cache-semantics@4.1.1",
+ "_nodeVersion": "19.4.0",
+ "_npmVersion": "9.2.0",
+ "dist": {
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "shasum": "abe02fcb2985460bf0323be664436ec3476a6d5a",
+ "tarball": "http://localhost:4260/http-cache-semantics/http-cache-semantics-4.1.1.tgz",
+ "fileCount": 4,
+ "unpackedSize": 35938
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/kornelski/http-cache-semantics#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/kornelski/http-cache-semantics.git"
+ },
+ "author": {
+ "name": "Kornel Lesiński",
+ "email": "kornel@geekhood.net",
+ "url": "https://kornel.ski/"
+ },
+ "bugs": {
+ "url": "https://github.com/kornelski/http-cache-semantics/issues"
+ },
+ "license": "BSD-2-Clause",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/http-proxy-agent/registry.json b/tests/registry/npm/http-proxy-agent/registry.json
index 8704fdd14..d1079a407 100644
--- a/tests/registry/npm/http-proxy-agent/registry.json
+++ b/tests/registry/npm/http-proxy-agent/registry.json
@@ -1 +1,85 @@
-{"name":"http-proxy-agent","description":"An HTTP(s) proxy `http.Agent` implementation for HTTP","dist-tags":{"latest":"7.0.2"},"versions":{"7.0.2":{"name":"http-proxy-agent","version":"7.0.2","description":"An HTTP(s) proxy `http.Agent` implementation for HTTP","main":"./dist/index.js","types":"./dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/http-proxy-agent"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"license":"MIT","dependencies":{"agent-base":"^7.1.0","debug":"^4.3.4"},"devDependencies":{"@types/debug":"^4.1.7","@types/jest":"^29.5.1","@types/node":"^14.18.45","async-listen":"^3.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.4","proxy":"2.1.1","tsconfig":"0.0.0"},"engines":{"node":">= 14"},"scripts":{"build":"tsc","test":"jest --env node --verbose --bail","lint":"eslint . --ext .ts","pack":"node ../../scripts/pack.mjs"},"bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"_id":"http-proxy-agent@7.0.2","_integrity":"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==","_resolved":"/tmp/42ba4e26e53ed178ce9214ff542db94a/http-proxy-agent-7.0.2.tgz","_from":"file:http-proxy-agent-7.0.2.tgz","_nodeVersion":"20.11.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==","shasum":"9a8b1f246866c028509486585f62b8f2c18c270e","tarball":"http://localhost:4260/http-proxy-agent/http-proxy-agent-7.0.2.tgz","fileCount":8,"unpackedSize":23348,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBi+r32oZ7TAb8M+r8gRNyTMLi4SMGeNoZOcOaBcXWBJAiEAgEJSlR5tDp/tFXfa6gKR+uqSbvjxJ3CwHII/T6GqKuk="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"http-proxy-agent\n================\n### An HTTP(s) proxy `http.Agent` implementation for HTTP\n\nThis module provides an `http.Agent` implementation that connects to a specified\nHTTP or HTTPS proxy server, and can be used with the built-in `http` module.\n\n__Note:__ For HTTP proxy usage with the `https` module, check out\n[`https-proxy-agent`](../https-proxy-agent).\n\n\nExample\n-------\n\n```ts\nimport * as http from 'http';\nimport { HttpProxyAgent } from 'http-proxy-agent';\n\nconst agent = new HttpProxyAgent('http://168.63.76.32:3128');\n\nhttp.get('http://nodejs.org/api/', { agent }, (res) => {\n console.log('\"response\" event!', res.headers);\n res.pipe(process.stdout);\n});\n```\n\nAPI\n---\n\n### new HttpProxyAgent(proxy: string | URL, options?: HttpProxyAgentOptions)\n\nThe `HttpProxyAgent` class implements an `http.Agent` subclass that connects\nto the specified \"HTTP(s) proxy server\" in order to proxy HTTP requests.\n\nThe `proxy` argument is the URL for the proxy server.\n\nThe `options` argument accepts the usual `http.Agent` constructor options, and\nsome additional properties:\n\n * `headers` - Object containing additional headers to send to the proxy server\n in each request. This may also be a function that returns a headers object.\n \n **NOTE:** If your proxy does not strip these headers from the request, they\n will also be sent to the destination server.","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/http-proxy-agent"},"homepage":"https://github.com/TooTallNate/proxy-agents#readme","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "http-proxy-agent",
+ "description": "An HTTP(s) proxy `http.Agent` implementation for HTTP",
+ "dist-tags": {
+ "latest": "7.0.2"
+ },
+ "versions": {
+ "7.0.2": {
+ "name": "http-proxy-agent",
+ "version": "7.0.2",
+ "description": "An HTTP(s) proxy `http.Agent` implementation for HTTP",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/http-proxy-agent"
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "devDependencies": {
+ "@types/debug": "^4.1.7",
+ "@types/jest": "^29.5.1",
+ "@types/node": "^14.18.45",
+ "async-listen": "^3.0.0",
+ "jest": "^29.5.0",
+ "ts-jest": "^29.1.0",
+ "typescript": "^5.0.4",
+ "proxy": "2.1.1",
+ "tsconfig": "0.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "scripts": {
+ "build": "tsc",
+ "test": "jest --env node --verbose --bail",
+ "lint": "eslint . --ext .ts",
+ "pack": "node ../../scripts/pack.mjs"
+ },
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "_id": "http-proxy-agent@7.0.2",
+ "_integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "_resolved": "/tmp/42ba4e26e53ed178ce9214ff542db94a/http-proxy-agent-7.0.2.tgz",
+ "_from": "file:http-proxy-agent-7.0.2.tgz",
+ "_nodeVersion": "20.11.0",
+ "_npmVersion": "10.2.4",
+ "dist": {
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "shasum": "9a8b1f246866c028509486585f62b8f2c18c270e",
+ "tarball": "http://localhost:4260/http-proxy-agent/http-proxy-agent-7.0.2.tgz",
+ "fileCount": 8,
+ "unpackedSize": 23348
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/http-proxy-agent"
+ },
+ "homepage": "https://github.com/TooTallNate/proxy-agents#readme",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/https-proxy-agent/registry.json b/tests/registry/npm/https-proxy-agent/registry.json
index 20e14c781..9dfdd263a 100644
--- a/tests/registry/npm/https-proxy-agent/registry.json
+++ b/tests/registry/npm/https-proxy-agent/registry.json
@@ -1 +1,88 @@
-{"name":"https-proxy-agent","description":"An HTTP(s) proxy `http.Agent` implementation for HTTPS","dist-tags":{"latest":"7.0.5"},"versions":{"7.0.5":{"name":"https-proxy-agent","version":"7.0.5","description":"An HTTP(s) proxy `http.Agent` implementation for HTTPS","main":"./dist/index.js","types":"./dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/https-proxy-agent"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"license":"MIT","dependencies":{"agent-base":"^7.0.2","debug":"4"},"devDependencies":{"@types/async-retry":"^1.4.5","@types/debug":"4","@types/jest":"^29.5.1","@types/node":"^14.18.45","async-listen":"^3.0.0","async-retry":"^1.3.3","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.4","proxy":"2.2.0","tsconfig":"0.0.0"},"engines":{"node":">= 14"},"scripts":{"build":"tsc","test":"jest --env node --verbose --bail test/test.ts","test-e2e":"jest --env node --verbose --bail test/e2e.test.ts","lint":"eslint --ext .ts","pack":"node ../../scripts/pack.mjs"},"_id":"https-proxy-agent@7.0.5","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"_integrity":"sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==","_resolved":"/tmp/5180433bb9463a934c98795a9595b7a5/https-proxy-agent-7.0.5.tgz","_from":"file:https-proxy-agent-7.0.5.tgz","_nodeVersion":"20.15.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==","shasum":"9e8b5013873299e11fab6fd548405da2d6c602b2","tarball":"http://localhost:4260/https-proxy-agent/https-proxy-agent-7.0.5.tgz","fileCount":12,"unpackedSize":34878,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDFZmWUU+D3oE97K/cAiDmaGBWqWbaJGdP4cXqLZkp/qAiBUAt9Z2J0FL8xGKJYYpXlFk+nOjdkWPWIy0xRwtfTq6g=="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/https-proxy-agent"},"license":"MIT","homepage":"https://github.com/TooTallNate/proxy-agents#readme","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"readme":"https-proxy-agent\n================\n### An HTTP(s) proxy `http.Agent` implementation for HTTPS\n\nThis module provides an `http.Agent` implementation that connects to a specified\nHTTP or HTTPS proxy server, and can be used with the built-in `https` module.\n\nSpecifically, this `Agent` implementation connects to an intermediary \"proxy\"\nserver and issues the [CONNECT HTTP method][CONNECT], which tells the proxy to\nopen a direct TCP connection to the destination server.\n\nSince this agent implements the CONNECT HTTP method, it also works with other\nprotocols that use this method when connecting over proxies (i.e. WebSockets).\nSee the \"Examples\" section below for more.\n\nExamples\n--------\n\n#### `https` module example\n\n```ts\nimport * as https from 'https';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\n\nconst agent = new HttpsProxyAgent('http://168.63.76.32:3128');\n\nhttps.get('https://example.com', { agent }, (res) => {\n console.log('\"response\" event!', res.headers);\n res.pipe(process.stdout);\n});\n```\n\n#### `ws` WebSocket connection example\n\n```ts\nimport WebSocket from 'ws';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\n\nconst agent = new HttpsProxyAgent('http://168.63.76.32:3128');\nconst socket = new WebSocket('ws://echo.websocket.org', { agent });\n\nsocket.on('open', function () {\n console.log('\"open\" event!');\n socket.send('hello world');\n});\n\nsocket.on('message', function (data, flags) {\n console.log('\"message\" event! %j %j', data, flags);\n socket.close();\n});\n```\n\nAPI\n---\n\n### new HttpsProxyAgent(proxy: string | URL, options?: HttpsProxyAgentOptions)\n\nThe `HttpsProxyAgent` class implements an `http.Agent` subclass that connects\nto the specified \"HTTP(s) proxy server\" in order to proxy HTTPS and/or WebSocket\nrequests. This is achieved by using the [HTTP `CONNECT` method][CONNECT].\n\nThe `proxy` argument is the URL for the proxy server.\n\nThe `options` argument accepts the usual `http.Agent` constructor options, and\nsome additional properties:\n\n * `headers` - Object containing additional headers to send to the proxy server\n in the `CONNECT` request.\n\n[CONNECT]: http://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_Tunneling\n","readmeFilename":"README.md"}
+{
+ "name": "https-proxy-agent",
+ "description": "An HTTP(s) proxy `http.Agent` implementation for HTTPS",
+ "dist-tags": {
+ "latest": "7.0.5"
+ },
+ "versions": {
+ "7.0.5": {
+ "name": "https-proxy-agent",
+ "version": "7.0.5",
+ "description": "An HTTP(s) proxy `http.Agent` implementation for HTTPS",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/https-proxy-agent"
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "devDependencies": {
+ "@types/async-retry": "^1.4.5",
+ "@types/debug": "4",
+ "@types/jest": "^29.5.1",
+ "@types/node": "^14.18.45",
+ "async-listen": "^3.0.0",
+ "async-retry": "^1.3.3",
+ "jest": "^29.5.0",
+ "ts-jest": "^29.1.0",
+ "typescript": "^5.0.4",
+ "proxy": "2.2.0",
+ "tsconfig": "0.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "scripts": {
+ "build": "tsc",
+ "test": "jest --env node --verbose --bail test/test.ts",
+ "test-e2e": "jest --env node --verbose --bail test/e2e.test.ts",
+ "lint": "eslint --ext .ts",
+ "pack": "node ../../scripts/pack.mjs"
+ },
+ "_id": "https-proxy-agent@7.0.5",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "_integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "_resolved": "/tmp/5180433bb9463a934c98795a9595b7a5/https-proxy-agent-7.0.5.tgz",
+ "_from": "file:https-proxy-agent-7.0.5.tgz",
+ "_nodeVersion": "20.15.0",
+ "_npmVersion": "10.7.0",
+ "dist": {
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "shasum": "9e8b5013873299e11fab6fd548405da2d6c602b2",
+ "tarball": "http://localhost:4260/https-proxy-agent/https-proxy-agent-7.0.5.tgz",
+ "fileCount": 12,
+ "unpackedSize": 34878
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/https-proxy-agent"
+ },
+ "license": "MIT",
+ "homepage": "https://github.com/TooTallNate/proxy-agents#readme",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/iconv-lite/registry.json b/tests/registry/npm/iconv-lite/registry.json
index 81006ff5b..6a71a9c83 100644
--- a/tests/registry/npm/iconv-lite/registry.json
+++ b/tests/registry/npm/iconv-lite/registry.json
@@ -1 +1,78 @@
-{"name":"iconv-lite","description":"Convert character encodings in pure javascript.","dist-tags":{"latest":"0.6.3"},"versions":{"0.6.3":{"name":"iconv-lite","description":"Convert character encodings in pure javascript.","version":"0.6.3","license":"MIT","author":{"name":"Alexander Shtuchkin","email":"ashtuchkin@gmail.com"},"main":"./lib/index.js","typings":"./lib/index.d.ts","bugs":{"url":"https://github.com/ashtuchkin/iconv-lite/issues"},"repository":{"type":"git","url":"git://github.com/ashtuchkin/iconv-lite.git"},"engines":{"node":">=0.10.0"},"scripts":{"coverage":"c8 _mocha --grep .","test":"mocha --reporter spec --grep ."},"browser":{"stream":false},"devDependencies":{"async":"^3.2.0","c8":"^7.2.0","errto":"^0.2.1","iconv":"^2.3.5","mocha":"^3.5.3","request":"^2.88.2","semver":"^6.3.0","unorm":"^1.6.0"},"dependencies":{"safer-buffer":">= 2.1.2 < 3.0.0"},"gitHead":"d13de386c07a1574425811f8f219c181c633e88d","_id":"iconv-lite@0.6.3","_nodeVersion":"15.6.0","_npmVersion":"7.6.1","dist":{"integrity":"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==","shasum":"a52f80bf38da1952eb5c681790719871a1a72501","tarball":"http://localhost:4260/iconv-lite/iconv-lite-0.6.3.tgz","fileCount":33,"unpackedSize":348518,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgqxbCCRA9TVsSAnZWagAAcroP/Rqrts1/wHN9dJXkXtdS\n1IKvYULE9ATmoW937FdYmVJmSy8Z1WOYvqmcF+W1o5m/Gseo5fb1VevT/bqE\nSsIThcPU4MU9EN6uLTgA4Z6YJwtuzdaCVOq6q6KAYmZSI2Vp4qxf5OYarvfv\nF42y8mxy9NoE6X2bIGZW8yqbcam5TmxwU9T5NDhP3eCTp9d7n+E4uBOf8oLt\np6fDhCw1vOSOkbz2x8Bar/J8vR+JWOTUbiIrXyRA6eAYcGz61VZcqEd1rR5G\nGrNTBVAdPE/MXvwdhiQQ++BEWCwyE3NLjz4VZeRy0P0ZfSPRl0Qbm2ZbdoUU\nMh69bc2luE+6yXom6quHlkmchMNngdt5sNUh0cGnBRa98hLjz0qUTxTloTWS\nXp3fxFUwO1v6jCnihnhUV1R4DCu1OgQp8bJs9JXMsgtvvwjf7mFPGbtxSLoh\nFqCJBWDieN/4OsaLGb/BkdLRK9L1RWylQS+DE2XqgKc4Ag13vesKrtAa1poR\nLWKe5olRcM8YCDuJBhqSMjsPeZcbL/BMhVDcXi0xrenBIbt2DbLYdac4K4JT\n0BiCApA+LH8Jqa/NX43XVVHdnYTC+s9HhLtIsEHEv5U948SzhSKpDerZozbO\nmJ4m6Omg/zo2Q5E1QOBhYmI4hPUw9776hvkOkidQJt66OKmwaynx4nsfdG2/\nt5o+\r\n=//pT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDSW7M7mQIAkBr00ylKb0LSsUZcoFW209OCE5NNaW1gbAiAbeRO4nflTwu3LXel4cm/zTmdXnshjnilZrIfaimURZA=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"## iconv-lite: Pure JS character encoding conversion\n\n * No need for native code compilation. Quick to install, works on Windows and in sandboxed environments like [Cloud9](http://c9.io).\n * Used in popular projects like [Express.js (body_parser)](https://github.com/expressjs/body-parser), \n [Grunt](http://gruntjs.com/), [Nodemailer](http://www.nodemailer.com/), [Yeoman](http://yeoman.io/) and others.\n * Faster than [node-iconv](https://github.com/bnoordhuis/node-iconv) (see below for performance comparison).\n * Intuitive encode/decode API, including Streaming support.\n * In-browser usage via [browserify](https://github.com/substack/node-browserify) or [webpack](https://webpack.js.org/) (~180kb gzip compressed with Buffer shim included).\n * Typescript [type definition file](https://github.com/ashtuchkin/iconv-lite/blob/master/lib/index.d.ts) included.\n * React Native is supported (need to install `stream` module to enable Streaming API).\n * License: MIT.\n\n[![NPM Stats](https://nodei.co/npm/iconv-lite.png)](https://npmjs.org/package/iconv-lite/) \n[![Build Status](https://travis-ci.org/ashtuchkin/iconv-lite.svg?branch=master)](https://travis-ci.org/ashtuchkin/iconv-lite)\n[![npm](https://img.shields.io/npm/v/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n[![npm downloads](https://img.shields.io/npm/dm/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n[![npm bundle size](https://img.shields.io/bundlephobia/min/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n\n## Usage\n### Basic API\n```javascript\nvar iconv = require('iconv-lite');\n\n// Convert from an encoded buffer to a js string.\nstr = iconv.decode(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');\n\n// Convert from a js string to an encoded buffer.\nbuf = iconv.encode(\"Sample input string\", 'win1251');\n\n// Check if encoding is supported\niconv.encodingExists(\"us-ascii\")\n```\n\n### Streaming API\n```javascript\n\n// Decode stream (from binary data stream to js strings)\nhttp.createServer(function(req, res) {\n var converterStream = iconv.decodeStream('win1251');\n req.pipe(converterStream);\n\n converterStream.on('data', function(str) {\n console.log(str); // Do something with decoded strings, chunk-by-chunk.\n });\n});\n\n// Convert encoding streaming example\nfs.createReadStream('file-in-win1251.txt')\n .pipe(iconv.decodeStream('win1251'))\n .pipe(iconv.encodeStream('ucs2'))\n .pipe(fs.createWriteStream('file-in-ucs2.txt'));\n\n// Sugar: all encode/decode streams have .collect(cb) method to accumulate data.\nhttp.createServer(function(req, res) {\n req.pipe(iconv.decodeStream('win1251')).collect(function(err, body) {\n assert(typeof body == 'string');\n console.log(body); // full request body string\n });\n});\n```\n\n## Supported encodings\n\n * All node.js native encodings: utf8, ucs2 / utf16-le, ascii, binary, base64, hex.\n * Additional unicode encodings: utf16, utf16-be, utf-7, utf-7-imap, utf32, utf32-le, and utf32-be.\n * All widespread singlebyte encodings: Windows 125x family, ISO-8859 family, \n IBM/DOS codepages, Macintosh family, KOI8 family, all others supported by iconv library. \n Aliases like 'latin1', 'us-ascii' also supported.\n * All widespread multibyte encodings: CP932, CP936, CP949, CP950, GB2312, GBK, GB18030, Big5, Shift_JIS, EUC-JP.\n\nSee [all supported encodings on wiki](https://github.com/ashtuchkin/iconv-lite/wiki/Supported-Encodings).\n\nMost singlebyte encodings are generated automatically from [node-iconv](https://github.com/bnoordhuis/node-iconv). Thank you Ben Noordhuis and libiconv authors!\n\nMultibyte encodings are generated from [Unicode.org mappings](http://www.unicode.org/Public/MAPPINGS/) and [WHATWG Encoding Standard mappings](http://encoding.spec.whatwg.org/). Thank you, respective authors!\n\n\n## Encoding/decoding speed\n\nComparison with node-iconv module (1000x256kb, on MacBook Pro, Core i5/2.6 GHz, Node v0.12.0). \nNote: your results may vary, so please always check on your hardware.\n\n operation iconv@2.1.4 iconv-lite@0.4.7\n ----------------------------------------------------------\n encode('win1251') ~96 Mb/s ~320 Mb/s\n decode('win1251') ~95 Mb/s ~246 Mb/s\n\n## BOM handling\n\n * Decoding: BOM is stripped by default, unless overridden by passing `stripBOM: false` in options\n (f.ex. `iconv.decode(buf, enc, {stripBOM: false})`).\n A callback might also be given as a `stripBOM` parameter - it'll be called if BOM character was actually found.\n * If you want to detect UTF-8 BOM when decoding other encodings, use [node-autodetect-decoder-stream](https://github.com/danielgindi/node-autodetect-decoder-stream) module.\n * Encoding: No BOM added, unless overridden by `addBOM: true` option.\n\n## UTF-16 Encodings\n\nThis library supports UTF-16LE, UTF-16BE and UTF-16 encodings. First two are straightforward, but UTF-16 is trying to be\nsmart about endianness in the following ways:\n * Decoding: uses BOM and 'spaces heuristic' to determine input endianness. Default is UTF-16LE, but can be \n overridden with `defaultEncoding: 'utf-16be'` option. Strips BOM unless `stripBOM: false`.\n * Encoding: uses UTF-16LE and writes BOM by default. Use `addBOM: false` to override.\n\n## UTF-32 Encodings\n\nThis library supports UTF-32LE, UTF-32BE and UTF-32 encodings. Like the UTF-16 encoding above, UTF-32 defaults to UTF-32LE, but uses BOM and 'spaces heuristics' to determine input endianness. \n * The default of UTF-32LE can be overridden with the `defaultEncoding: 'utf-32be'` option. Strips BOM unless `stripBOM: false`.\n * Encoding: uses UTF-32LE and writes BOM by default. Use `addBOM: false` to override. (`defaultEncoding: 'utf-32be'` can also be used here to change encoding.)\n\n## Other notes\n\nWhen decoding, be sure to supply a Buffer to decode() method, otherwise [bad things usually happen](https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding). \nUntranslatable characters are set to � or ?. No transliteration is currently supported. \nNode versions 0.10.31 and 0.11.13 are buggy, don't use them (see #65, #77). \n\n## Testing\n\n```bash\n$ git clone git@github.com:ashtuchkin/iconv-lite.git\n$ cd iconv-lite\n$ npm install\n$ npm test\n \n$ # To view performance:\n$ node test/performance.js\n\n$ # To view test coverage:\n$ npm run coverage\n$ open coverage/lcov-report/index.html\n```\n","author":{"name":"Alexander Shtuchkin","email":"ashtuchkin@gmail.com"},"repository":{"type":"git","url":"git://github.com/ashtuchkin/iconv-lite.git"},"homepage":"https://github.com/ashtuchkin/iconv-lite","bugs":{"url":"https://github.com/ashtuchkin/iconv-lite/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "iconv-lite",
+ "description": "Convert character encodings in pure javascript.",
+ "dist-tags": {
+ "latest": "0.6.3"
+ },
+ "versions": {
+ "0.6.3": {
+ "name": "iconv-lite",
+ "description": "Convert character encodings in pure javascript.",
+ "version": "0.6.3",
+ "license": "MIT",
+ "author": {
+ "name": "Alexander Shtuchkin",
+ "email": "ashtuchkin@gmail.com"
+ },
+ "main": "./lib/index.js",
+ "typings": "./lib/index.d.ts",
+ "bugs": {
+ "url": "https://github.com/ashtuchkin/iconv-lite/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ashtuchkin/iconv-lite.git"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "coverage": "c8 _mocha --grep .",
+ "test": "mocha --reporter spec --grep ."
+ },
+ "browser": {
+ "stream": false
+ },
+ "devDependencies": {
+ "async": "^3.2.0",
+ "c8": "^7.2.0",
+ "errto": "^0.2.1",
+ "iconv": "^2.3.5",
+ "mocha": "^3.5.3",
+ "request": "^2.88.2",
+ "semver": "^6.3.0",
+ "unorm": "^1.6.0"
+ },
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "gitHead": "d13de386c07a1574425811f8f219c181c633e88d",
+ "_id": "iconv-lite@0.6.3",
+ "_nodeVersion": "15.6.0",
+ "_npmVersion": "7.6.1",
+ "dist": {
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "shasum": "a52f80bf38da1952eb5c681790719871a1a72501",
+ "tarball": "http://localhost:4260/iconv-lite/iconv-lite-0.6.3.tgz",
+ "fileCount": 33,
+ "unpackedSize": 348518
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Alexander Shtuchkin",
+ "email": "ashtuchkin@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ashtuchkin/iconv-lite.git"
+ },
+ "homepage": "https://github.com/ashtuchkin/iconv-lite",
+ "bugs": {
+ "url": "https://github.com/ashtuchkin/iconv-lite/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/imurmurhash/registry.json b/tests/registry/npm/imurmurhash/registry.json
index 9c0bfccb4..b9e072309 100644
--- a/tests/registry/npm/imurmurhash/registry.json
+++ b/tests/registry/npm/imurmurhash/registry.json
@@ -1 +1,59 @@
-{"name":"imurmurhash","description":"An incremental implementation of MurmurHash3","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.4":{"name":"imurmurhash","version":"0.1.4","description":"An incremental implementation of MurmurHash3","main":"imurmurhash.js","files":["imurmurhash.js","imurmurhash.min.js","package.json","README.md"],"repository":{"type":"git","url":"https://github.com/jensyt/imurmurhash-js"},"bugs":{"url":"https://github.com/jensyt/imurmurhash-js/issues"},"author":{"name":"Jens Taylor","email":"jensyt@gmail.com","url":"https://github.com/homebrewing"},"license":"MIT","dependencies":{},"devDependencies":{},"engines":{"node":">=0.8.19"},"readme":"iMurmurHash.js\n==============\n\nAn incremental implementation of the MurmurHash3 (32-bit) hashing algorithm for JavaScript based on [Gary Court's implementation](https://github.com/garycourt/murmurhash-js) with [kazuyukitanimura's modifications](https://github.com/kazuyukitanimura/murmurhash-js).\n\nThis version works significantly faster than the non-incremental version if you need to hash many small strings into a single hash, since string concatenation (to build the single string to pass the non-incremental version) is fairly costly. In one case tested, using the incremental version was about 50% faster than concatenating 5-10 strings and then hashing.\n\nInstallation\n------------\n\nTo use iMurmurHash in the browser, [download the latest version](https://raw.github.com/jensyt/imurmurhash-js/master/imurmurhash.min.js) and include it as a script on your site.\n\n```html\n<script type=\"text/javascript\" src=\"/scripts/imurmurhash.min.js\"></script>\n<script>\n// Your code here, access iMurmurHash using the global object MurmurHash3\n</script>\n```\n\n---\n\nTo use iMurmurHash in Node.js, install the module using NPM:\n\n```bash\nnpm install imurmurhash\n```\n\nThen simply include it in your scripts:\n\n```javascript\nMurmurHash3 = require('imurmurhash');\n```\n\nQuick Example\n-------------\n\n```javascript\n// Create the initial hash\nvar hashState = MurmurHash3('string');\n\n// Incrementally add text\nhashState.hash('more strings');\nhashState.hash('even more strings');\n\n// All calls can be chained if desired\nhashState.hash('and').hash('some').hash('more');\n\n// Get a result\nhashState.result();\n// returns 0xe4ccfe6b\n```\n\nFunctions\n---------\n\n### MurmurHash3 ([string], [seed])\nGet a hash state object, optionally initialized with the given _string_ and _seed_. _Seed_ must be a positive integer if provided. Calling this function without the `new` keyword will return a cached state object that has been reset. This is safe to use as long as the object is only used from a single thread and no other hashes are created while operating on this one. If this constraint cannot be met, you can use `new` to create a new state object. For example:\n\n```javascript\n// Use the cached object, calling the function again will return the same\n// object (but reset, so the current state would be lost)\nhashState = MurmurHash3();\n...\n\n// Create a new object that can be safely used however you wish. Calling the\n// function again will simply return a new state object, and no state loss\n// will occur, at the cost of creating more objects.\nhashState = new MurmurHash3();\n```\n\nBoth methods can be mixed however you like if you have different use cases.\n\n---\n\n### MurmurHash3.prototype.hash (string)\nIncrementally add _string_ to the hash. This can be called as many times as you want for the hash state object, including after a call to `result()`. Returns `this` so calls can be chained.\n\n---\n\n### MurmurHash3.prototype.result ()\nGet the result of the hash as a 32-bit positive integer. This performs the tail and finalizer portions of the algorithm, but does not store the result in the state object. This means that it is perfectly safe to get results and then continue adding strings via `hash`.\n\n```javascript\n// Do the whole string at once\nMurmurHash3('this is a test string').result();\n// 0x70529328\n\n// Do part of the string, get a result, then the other part\nvar m = MurmurHash3('this is a');\nm.result();\n// 0xbfc4f834\nm.hash(' test string').result();\n// 0x70529328 (same as above)\n```\n\n---\n\n### MurmurHash3.prototype.reset ([seed])\nReset the state object for reuse, optionally using the given _seed_ (defaults to 0 like the constructor). Returns `this` so calls can be chained.\n\n---\n\nLicense (MIT)\n-------------\nCopyright (c) 2013 Gary Court, Jens Taylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"imurmurhash@0.1.4","dist":{"shasum":"9218b9b2b928a238b13dc4fb6b6d576f231453ea","tarball":"http://localhost:4260/imurmurhash/imurmurhash-0.1.4.tgz","integrity":"sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDBYV53bBFjsfNsa4u6aXAPKZ+9co9516ZzIbyHU6H9GAiBXXkJRFrbyt8Y2KjDxx6KfZb8DhPxQB/BkZd2wnfAMEg=="}]},"_from":".","_npmVersion":"1.3.2","directories":{}}},"readme":"iMurmurHash.JS\n==============\n\nAn incremental implementation of the MurmurHash3 (32-bit) hashing algorithm for JavaScript based on [Gary Court's implementation](https://github.com/garycourt/murmurhash-js).\n\nInstallation\n------------\n\nTo use iMurmurHash in the browser, [download the latest version](https://raw.github.com/jensyt/imurmurhash-js/master/imurmurhash.min.js) and include it as a script on your site.\n\n```html\n<script type=\"text/javascript\" src=\"/scripts/imurmurhash.min.js\"></script>\n<script>\n// Your code here, access iMurmurHash using the global object MurmurHash3\n</script>\n```\n\n---\n\nTo use iMurmurHash in Node.js, install the module using NPM:\n\n```bash\nnpm install imurmurhash\n```\n\nThen simply include it in your scripts:\n\n```javascript\nMurmurHash3 = require('imurmurhash');\n```\n\nQuick Example\n-------------\n\n```javascript\n// Create the initial hash\nvar hashState = MurmurHash3('string');\n\n// Incrementally add text\nhashState.hash('more strings');\nhashState.hash('even more strings');\n\n// All calls can be chained if desired\nhashState.hash('and').hash('some').hash('more');\n\n// Get a result\nhashState.result();\n// returns 0x29d3f1e3\n```\n\nFunctions\n---------\n\n### MurmurHash3 ([string], [seed])\nGet a hash state object, optionally initialized with the given _string_ and _seed_. _Seed_ must be a positive integer if provided. Calling this function without the `new` keyword will return a cached state object that has been reset. This is safe to use as long as the object is only used from a single thread and no other hashes are created while operating on this one. If this constraint cannot be met, you can use `new` to create a new state object. For example:\n\n```javascript\n// Use the cached object, calling the function again will return the same\n// object (but reset, so the current state would be lost)\nhashState = MurmurHash3();\n...\n\n// Create a new object that can be safely used however you wish. Calling the\n// function again will simply return a new state object, and no state loss\n// will occur, at the cost of creating more objects.\nhashState = new MurmurHash3();\n```\n\nBoth methods can be mixed however you like if you have different use cases.\n\n---\n\n### MurmurHash3.prototype.hash (string)\nIncrementally add a _string_ to the hash. This can be called as many times as you want for the hash state object, including after a calls to `result()`. Returns `this` so calls can be chained.\n\n---\n\n### MurmurHash3.prototype.result ()\nGet the result of the hash as a 32-bit positive integer. This performs the tail and finalizer portions of the algorithm, but does not store the result in the state object. This means that it is perfectly safe to get results and then continue adding strings via `hash`.\n\n```javascript\n// Do the whole string at once\nMurmurHash3('this is a test string').result();\n// 0x70529328\n\n// Do part of the string, get a result, then the other part\nvar m = MurmurHash3('this is a');\nm.result();\n// 0xbfc4f834\nm.hash(' test string').result();\n// 0x70529328 (same as above)\n```\n\n---\n\n### MurmurHash3.prototype.reset (seed)\nReset the state object for reuse, optionally using the given _seed_ (defaults to 0 like constructor). Returns `this` so calls can be chained.\n\n---\n\nLicense (MIT)\n-------------\nCopyright (c) 2013 Gary Court, Jens Taylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","author":{"name":"Jens Taylor","email":"jensyt@gmail.com","url":"https://github.com/homebrewing"},"repository":{"type":"git","url":"https://github.com/jensyt/imurmurhash-js"}}
+{
+ "name": "imurmurhash",
+ "description": "An incremental implementation of MurmurHash3",
+ "dist-tags": {
+ "latest": "0.1.4"
+ },
+ "versions": {
+ "0.1.4": {
+ "name": "imurmurhash",
+ "version": "0.1.4",
+ "description": "An incremental implementation of MurmurHash3",
+ "main": "imurmurhash.js",
+ "files": [
+ "imurmurhash.js",
+ "imurmurhash.min.js",
+ "package.json",
+ "README.md"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jensyt/imurmurhash-js"
+ },
+ "bugs": {
+ "url": "https://github.com/jensyt/imurmurhash-js/issues"
+ },
+ "author": {
+ "name": "Jens Taylor",
+ "email": "jensyt@gmail.com",
+ "url": "https://github.com/homebrewing"
+ },
+ "license": "MIT",
+ "dependencies": {},
+ "devDependencies": {},
+ "engines": {
+ "node": ">=0.8.19"
+ },
+ "readme": "iMurmurHash.js\n==============\n\nAn incremental implementation of the MurmurHash3 (32-bit) hashing algorithm for JavaScript based on [Gary Court's implementation](https://github.com/garycourt/murmurhash-js) with [kazuyukitanimura's modifications](https://github.com/kazuyukitanimura/murmurhash-js).\n\nThis version works significantly faster than the non-incremental version if you need to hash many small strings into a single hash, since string concatenation (to build the single string to pass the non-incremental version) is fairly costly. In one case tested, using the incremental version was about 50% faster than concatenating 5-10 strings and then hashing.\n\nInstallation\n------------\n\nTo use iMurmurHash in the browser, [download the latest version](https://raw.github.com/jensyt/imurmurhash-js/master/imurmurhash.min.js) and include it as a script on your site.\n\n```html\n<script type=\"text/javascript\" src=\"/scripts/imurmurhash.min.js\"></script>\n<script>\n// Your code here, access iMurmurHash using the global object MurmurHash3\n</script>\n```\n\n---\n\nTo use iMurmurHash in Node.js, install the module using NPM:\n\n```bash\nnpm install imurmurhash\n```\n\nThen simply include it in your scripts:\n\n```javascript\nMurmurHash3 = require('imurmurhash');\n```\n\nQuick Example\n-------------\n\n```javascript\n// Create the initial hash\nvar hashState = MurmurHash3('string');\n\n// Incrementally add text\nhashState.hash('more strings');\nhashState.hash('even more strings');\n\n// All calls can be chained if desired\nhashState.hash('and').hash('some').hash('more');\n\n// Get a result\nhashState.result();\n// returns 0xe4ccfe6b\n```\n\nFunctions\n---------\n\n### MurmurHash3 ([string], [seed])\nGet a hash state object, optionally initialized with the given _string_ and _seed_. _Seed_ must be a positive integer if provided. Calling this function without the `new` keyword will return a cached state object that has been reset. This is safe to use as long as the object is only used from a single thread and no other hashes are created while operating on this one. If this constraint cannot be met, you can use `new` to create a new state object. For example:\n\n```javascript\n// Use the cached object, calling the function again will return the same\n// object (but reset, so the current state would be lost)\nhashState = MurmurHash3();\n...\n\n// Create a new object that can be safely used however you wish. Calling the\n// function again will simply return a new state object, and no state loss\n// will occur, at the cost of creating more objects.\nhashState = new MurmurHash3();\n```\n\nBoth methods can be mixed however you like if you have different use cases.\n\n---\n\n### MurmurHash3.prototype.hash (string)\nIncrementally add _string_ to the hash. This can be called as many times as you want for the hash state object, including after a call to `result()`. Returns `this` so calls can be chained.\n\n---\n\n### MurmurHash3.prototype.result ()\nGet the result of the hash as a 32-bit positive integer. This performs the tail and finalizer portions of the algorithm, but does not store the result in the state object. This means that it is perfectly safe to get results and then continue adding strings via `hash`.\n\n```javascript\n// Do the whole string at once\nMurmurHash3('this is a test string').result();\n// 0x70529328\n\n// Do part of the string, get a result, then the other part\nvar m = MurmurHash3('this is a');\nm.result();\n// 0xbfc4f834\nm.hash(' test string').result();\n// 0x70529328 (same as above)\n```\n\n---\n\n### MurmurHash3.prototype.reset ([seed])\nReset the state object for reuse, optionally using the given _seed_ (defaults to 0 like the constructor). Returns `this` so calls can be chained.\n\n---\n\nLicense (MIT)\n-------------\nCopyright (c) 2013 Gary Court, Jens Taylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
+ "readmeFilename": "README.md",
+ "_id": "imurmurhash@0.1.4",
+ "dist": {
+ "shasum": "9218b9b2b928a238b13dc4fb6b6d576f231453ea",
+ "tarball": "http://localhost:4260/imurmurhash/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+ },
+ "_from": ".",
+ "_npmVersion": "1.3.2",
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Jens Taylor",
+ "email": "jensyt@gmail.com",
+ "url": "https://github.com/homebrewing"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jensyt/imurmurhash-js"
+ }
+}
diff --git a/tests/registry/npm/indent-string/registry.json b/tests/registry/npm/indent-string/registry.json
index aa9043f02..6dac5c96b 100644
--- a/tests/registry/npm/indent-string/registry.json
+++ b/tests/registry/npm/indent-string/registry.json
@@ -1 +1,66 @@
-{"name":"indent-string","description":"Indent each line in a string","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"indent-string","version":"4.0.0","description":"Indent each line in a string","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/indent-string.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"99280aa24669a3fab303bb231d6caafd7d5029d3","bugs":{"url":"https://github.com/sindresorhus/indent-string/issues"},"_id":"indent-string@4.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","dist":{"integrity":"sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==","shasum":"624f8f4497d619b2d9768531d58f4122854d7251","tarball":"http://localhost:4260/indent-string/indent-string-4.0.0.tgz","fileCount":5,"unpackedSize":4398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcttZBCRA9TVsSAnZWagAAw4QP/RLhgvRhH6lu6c73/OqW\nwqtS6k3cxc3I8oyxGMwBPsk4UTEkoLK8Yz4lrhs6xrK+yGKlChqmACe2mWLb\nBTFBIdSVejTyN7sMRm/UFfS4FwQ4Gz1mlTT/FGR36LAuRxrU2EmExVY2Ser2\nbsQyODD7cr5a3H0iRLFCM7TGOtIy+t5o4l3ktbyUclbKLakyk0SNI1SXHMrA\n7ggcy9TNx3gQ94AlNONra/F8S67Kz2xMqSrRuZQ9MP/awfcpyVDOZssr2tZq\nYF7/obaQjCRswMykj58Lo1gPEjwQeJkM48zzGuvNtFgiyjpPpX7HvZMXfjVH\ncMPcOaqpBj/wbAvCFeCkaXl29ReznD30iJOrqg0kdagvshRbx1S8SFDDoxwR\nJCCxQv7M2D8twLfnhPY/hEIwa2VFLKHyDi/v39QeVXaVsuGLvrxZLU3cIcFS\nQ8MgS6DAvfoo2biiHfvLKf7paEx1COBjY2d1p/APi3lHPlTNeC4QpOOeSvAt\n2QS0dgXOXaE7LijnJRt9kIwgoljFOgs4LHDU/ZmyR3dpjTQnrH84oKY5zJzy\n/XXouR8TglSkGruwrnoTkJ0Ro9erMGEKt5P+UqGaVNvL2Grmsi1UyW6auQbo\nQ4zoS9zcmSBBAvHhtZGxRDpr6lfnAwg4SSluYLA/1Qy3D4EcYIlBFGOI2HB1\ntSXY\r\n=83ol\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGPHHuz9DpZOHrB3DpJ+kS0ACff0FCj390y/7sXNkh7XAiEA3tjpHtr67ThClg/N7z8mYCV2WW+XizZVUQN4/xy1ZPw="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# indent-string\n\n> Indent each line in a string\n\n## Install\n\n```\n$ npm install indent-string\n```\n\n## Usage\n\n```js\nimport indentString from 'indent-string';\n\nindentString('Unicorns\\nRainbows', 4);\n//=> ' Unicorns\\n Rainbows'\n\nindentString('Unicorns\\nRainbows', 4, {indent: '♥'});\n//=> '♥♥♥♥Unicorns\\n♥♥♥♥Rainbows'\n```\n\n## API\n\n### indentString(string, count?, options?)\n\n#### string\n\nType: `string`\n\nThe string to indent.\n\n#### count\n\nType: `number`\\\nDefault: `1`\n\nHow many times you want `options.indent` repeated.\n\n#### options\n\nType: `object`\n\n##### indent\n\nType: `string`\\\nDefault: `' '`\n\nThe string to use for the indent.\n\n##### includeEmptyLines\n\nType: `boolean`\\\nDefault: `false`\n\nAlso indent empty lines.\n\n## Related\n\n- [indent-string-cli](https://github.com/sindresorhus/indent-string-cli) - CLI for this module\n- [strip-indent](https://github.com/sindresorhus/strip-indent) - Strip leading whitespace from every line in a string\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-indent-string?utm_source=npm-indent-string&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/indent-string#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/indent-string.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/indent-string/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "indent-string",
+ "description": "Indent each line in a string",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "indent-string",
+ "version": "4.0.0",
+ "description": "Indent each line in a string",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/indent-string.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "99280aa24669a3fab303bb231d6caafd7d5029d3",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/indent-string/issues"
+ },
+ "_id": "indent-string@4.0.0",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "10.15.1",
+ "dist": {
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "shasum": "624f8f4497d619b2d9768531d58f4122854d7251",
+ "tarball": "http://localhost:4260/indent-string/indent-string-4.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4398
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/indent-string#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/indent-string.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/indent-string/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/ip-address/registry.json b/tests/registry/npm/ip-address/registry.json
index 03e0839e9..27f92c49e 100644
--- a/tests/registry/npm/ip-address/registry.json
+++ b/tests/registry/npm/ip-address/registry.json
@@ -1 +1,121 @@
-{"name":"ip-address","description":"A library for parsing IPv4 and IPv6 IP addresses in node and the browser.","dist-tags":{"latest":"9.0.5"},"versions":{"9.0.5":{"name":"ip-address","description":"A library for parsing IPv4 and IPv6 IP addresses in node and the browser.","version":"9.0.5","author":{"name":"Beau Gunderson","email":"beau@beaugunderson.com","url":"https://beaugunderson.com/"},"license":"MIT","main":"dist/ip-address.js","types":"dist/ip-address.d.ts","scripts":{"docs":"documentation build --github --output docs --format html ./ip-address.js","build":"rm -rf dist; mkdir dist; tsc","prepack":"npm run build","release":"release-it","test-ci":"nyc mocha","test":"mocha","watch":"mocha --watch"},"nyc":{"extension":[".ts"],"exclude":["**/*.d.ts",".eslintrc.js","coverage/","dist/","test/","tmp/"],"reporter":["html","lcov","text"],"all":true},"engines":{"node":">= 12"},"repository":{"type":"git","url":"git://github.com/beaugunderson/ip-address.git"},"dependencies":{"jsbn":"1.1.0","sprintf-js":"^1.1.3"},"devDependencies":{"@types/chai":"^4.2.18","@types/jsbn":"^1.2.31","@types/mocha":"^10.0.1","@types/sprintf-js":"^1.1.2","@typescript-eslint/eslint-plugin":"^6.7.2","@typescript-eslint/parser":"^6.7.2","browserify":"^17.0.0","chai":"^4.3.4","codecov":"^3.8.2","documentation":"^14.0.2","eslint":"^8.50.0","eslint-config-airbnb":"^19.0.4","eslint-config-prettier":"^9.0.0","eslint-plugin-filenames":"^1.3.2","eslint-plugin-import":"^2.23.4","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.24.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-sort-imports-es6-autofix":"^0.6.0","mocha":"^10.2.0","nyc":"^15.1.0","prettier":"^3.0.3","release-it":"^16.2.0","source-map-support":"^0.5.19","ts-node":"^10.0.0","typescript":"^5.2.2"},"_id":"ip-address@9.0.5","gitHead":"9a1a7c401ed754a978f7a0fe8dd352eb413798b9","bugs":{"url":"https://github.com/beaugunderson/ip-address/issues"},"_nodeVersion":"20.5.1","_npmVersion":"10.1.0","dist":{"integrity":"sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==","shasum":"117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a","tarball":"http://localhost:4260/ip-address/ip-address-9.0.5.tgz","fileCount":48,"unpackedSize":176898,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGNoc2Yy0JaKBF+Joty0BBRQcnRUG4ICPaOpH4yTyUbWAiEA7SKD3LwAgTXzKjv7bmWgSda6xzxDgZ21Q+QVyXIUauc="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"![CircleCI](https://img.shields.io/circleci/build/github/beaugunderson/ip-address)\n[![codecov]](https://codecov.io/github/beaugunderson/ip-address?branch=master)\n[![downloads]](https://www.npmjs.com/package/ip-address)\n[![npm]](https://www.npmjs.com/package/ip-address)\n[![snyk]](https://snyk.io/test/github/beaugunderson/ip-address)\n\n[codecov]: https://codecov.io/github/beaugunderson/ip-address/coverage.svg?branch=master\n[downloads]: https://img.shields.io/npm/dm/ip-address.svg\n[npm]: https://img.shields.io/npm/v/ip-address.svg\n[snyk]: https://snyk.io/test/github/beaugunderson/ip-address/badge.svg\n\n## ip-address\n\n`ip-address` is a library for validating and manipulating IPv4 and IPv6\naddresses in JavaScript.\n\n\n### Migrating from 6.x to 7.x\n\n`ip-address` was rewritten in TypeScript for version 7. If you were using\nversion 6 you'll need to make these changes to upgrade:\n\n- Instead of checking `isValid()`, which has been removed, you'll need to use a\n `try`/`catch` if you're accepting unknown input. This made the TypeScript\n types substantially easier as well as allowed the use of an `AddressError`\n class which will contain a `parseMessage` if an error occurred in the parsing\n step.\n- Instead of using the `error`, `parseError`, and `valid` attributes you'll\n need to use the `message` and `parseMessage` of the thrown `AddressError`.\n\n### Documentation\n\nDocumentation is available at [ip-address.js.org](http://ip-address.js.org/).\n\n### Examples\n\n```js\nvar Address6 = require('ip-address').Address6;\n\nvar address = new Address6('2001:0:ce49:7601:e866:efff:62c3:fffe');\n\nvar teredo = address.inspectTeredo();\n\nteredo.client4; // '157.60.0.1'\n```\n\n### Features\n\n- Usable via CommonJS or ESM\n- Parsing of all IPv6 notations\n- Parsing of IPv6 addresses and ports from URLs with `Address6.fromURL(url)`\n- Validity checking\n- Decoding of the [Teredo\n information](http://en.wikipedia.org/wiki/Teredo_tunneling#IPv6_addressing)\n in an address\n- Whether one address is a valid subnet of another\n- What special properties a given address has (multicast prefix, unique\n local address prefix, etc.)\n- Number of subnets of a certain size in a given address\n- Display methods\n - Hex, binary, and decimal\n - Canonical form\n - Correct form\n - IPv4-compatible (i.e. `::ffff:192.168.0.1`)\n- Works in [node](http://nodejs.org/) and the browser (with browserify)\n- ~1,600 test cases\n\n### Used by\n\n- [anon](https://github.com/edsu/anon) which powers\n [@congressedits](https://twitter.com/congressedits), among\n [many others](https://github.com/edsu/anon#community)\n- [base85](https://github.com/noseglid/base85): base85 encoding/decoding\n- [contrail-web-core](https://github.com/Juniper/contrail-web-core): part of\n Contrail, a network virtualization solution made by Juniper Networks\n- [dhcpjs](https://github.com/apaprocki/node-dhcpjs): a DHCP client and server\n- [epochtalk](https://github.com/epochtalk/epochtalk): next generation forum\n software\n- [geoip-web](https://github.com/tfrce/node-geoip-web): a server for\n quickly geolocating IP addresses\n- [hexabus](https://github.com/mysmartgrid/hexabus): an IPv6-based home\n automation bus\n- [hubot-deploy](https://github.com/atmos/hubot-deploy): GitHub Flow via hubot\n- [heroku-portscanner](https://github.com/robison/heroku-portscanner): nmap\n hosted on Heroku\n- [ipfs-swarm](https://github.com/diasdavid/node-ipfs-swarm): a swarm\n implementation based on IPFS\n- [javascript-x-server](https://github.com/GothAck/javascript-x-server): an X\n server written in JavaScript\n- [libnmap](https://github.com/jas-/node-libnmap): a node API for nmap\n- [mail-io](https://github.com/mofux/mail-io): a lightweight SMTP server\n- [maxmind-db-reader](https://github.com/PaddeK/node-maxmind-db): a library for\n reading MaxMind database files\n- [proxy-protocol-v2](https://github.com/ably/proxy-protocol-v2): a proxy\n protocol encoder/decoder built by [Ably](https://www.ably.io/)\n- [Samsara](https://github.com/mariusGundersen/Samsara): a Docker web interface\n- [sis-api](https://github.com/sis-cmdb/sis-api): a configuration management\n database API\n- [socks5-client](https://github.com/mattcg/socks5-client): a SOCKS v5 client\n- [socksified](https://github.com/vially/node-socksified): a SOCKS v5 client\n- [socksv5](https://github.com/mscdex/socksv5): a SOCKS v5 server/client\n- [ssdapi](https://github.com/rsolomou/ssdapi): an API created by the\n University of Portsmouth\n- [SwitchyOmega](https://github.com/FelisCatus/SwitchyOmega): a [Chrome\n extension](https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)\n for switching between multiple proxies with ~311k users!\n- [swiz](https://github.com/racker/node-swiz): a serialization framework built\n and used by [Rackspace](http://www.rackspace.com/)\n","homepage":"https://github.com/beaugunderson/ip-address#readme","repository":{"type":"git","url":"git://github.com/beaugunderson/ip-address.git"},"author":{"name":"Beau Gunderson","email":"beau@beaugunderson.com","url":"https://beaugunderson.com/"},"bugs":{"url":"https://github.com/beaugunderson/ip-address/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "ip-address",
+ "description": "A library for parsing IPv4 and IPv6 IP addresses in node and the browser.",
+ "dist-tags": {
+ "latest": "9.0.5"
+ },
+ "versions": {
+ "9.0.5": {
+ "name": "ip-address",
+ "description": "A library for parsing IPv4 and IPv6 IP addresses in node and the browser.",
+ "version": "9.0.5",
+ "author": {
+ "name": "Beau Gunderson",
+ "email": "beau@beaugunderson.com",
+ "url": "https://beaugunderson.com/"
+ },
+ "license": "MIT",
+ "main": "dist/ip-address.js",
+ "types": "dist/ip-address.d.ts",
+ "scripts": {
+ "docs": "documentation build --github --output docs --format html ./ip-address.js",
+ "build": "rm -rf dist; mkdir dist; tsc",
+ "prepack": "npm run build",
+ "release": "release-it",
+ "test-ci": "nyc mocha",
+ "test": "mocha",
+ "watch": "mocha --watch"
+ },
+ "nyc": {
+ "extension": [
+ ".ts"
+ ],
+ "exclude": [
+ "**/*.d.ts",
+ ".eslintrc.js",
+ "coverage/",
+ "dist/",
+ "test/",
+ "tmp/"
+ ],
+ "reporter": [
+ "html",
+ "lcov",
+ "text"
+ ],
+ "all": true
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/beaugunderson/ip-address.git"
+ },
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "devDependencies": {
+ "@types/chai": "^4.2.18",
+ "@types/jsbn": "^1.2.31",
+ "@types/mocha": "^10.0.1",
+ "@types/sprintf-js": "^1.1.2",
+ "@typescript-eslint/eslint-plugin": "^6.7.2",
+ "@typescript-eslint/parser": "^6.7.2",
+ "browserify": "^17.0.0",
+ "chai": "^4.3.4",
+ "codecov": "^3.8.2",
+ "documentation": "^14.0.2",
+ "eslint": "^8.50.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-filenames": "^1.3.2",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-jsx-a11y": "^6.4.1",
+ "eslint-plugin-prettier": "^5.0.0",
+ "eslint-plugin-react": "^7.24.0",
+ "eslint-plugin-react-hooks": "^4.2.0",
+ "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
+ "mocha": "^10.2.0",
+ "nyc": "^15.1.0",
+ "prettier": "^3.0.3",
+ "release-it": "^16.2.0",
+ "source-map-support": "^0.5.19",
+ "ts-node": "^10.0.0",
+ "typescript": "^5.2.2"
+ },
+ "_id": "ip-address@9.0.5",
+ "gitHead": "9a1a7c401ed754a978f7a0fe8dd352eb413798b9",
+ "bugs": {
+ "url": "https://github.com/beaugunderson/ip-address/issues"
+ },
+ "_nodeVersion": "20.5.1",
+ "_npmVersion": "10.1.0",
+ "dist": {
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "shasum": "117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a",
+ "tarball": "http://localhost:4260/ip-address/ip-address-9.0.5.tgz",
+ "fileCount": 48,
+ "unpackedSize": 176898
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/beaugunderson/ip-address#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/beaugunderson/ip-address.git"
+ },
+ "author": {
+ "name": "Beau Gunderson",
+ "email": "beau@beaugunderson.com",
+ "url": "https://beaugunderson.com/"
+ },
+ "bugs": {
+ "url": "https://github.com/beaugunderson/ip-address/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/is-fullwidth-code-point/registry.json b/tests/registry/npm/is-fullwidth-code-point/registry.json
index 39c93811e..6ce84854f 100644
--- a/tests/registry/npm/is-fullwidth-code-point/registry.json
+++ b/tests/registry/npm/is-fullwidth-code-point/registry.json
@@ -1 +1,112 @@
-{"name":"is-fullwidth-code-point","description":"Check if the character represented by a given Unicode code point is fullwidth","dist-tags":{"latest":"3.0.0"},"versions":{"2.0.0":{"name":"is-fullwidth-code-point","version":"2.0.0","description":"Check if the character represented by a given Unicode code point is fullwidth","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/is-fullwidth-code-point.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=4"},"scripts":{"test":"xo && ava"},"files":["index.js"],"devDependencies":{"ava":"*","xo":"*"},"xo":{"esnext":true},"gitHead":"e94a78056056c5546f2bf4c4cf812a2163a46dae","bugs":{"url":"https://github.com/sindresorhus/is-fullwidth-code-point/issues"},"_id":"is-fullwidth-code-point@2.0.0","_shasum":"a3b30a5c4f199183167aaab93beefae3ddfb654f","_from":".","_npmVersion":"3.10.7","_nodeVersion":"4.5.0","dist":{"shasum":"a3b30a5c4f199183167aaab93beefae3ddfb654f","tarball":"http://localhost:4260/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz","integrity":"sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSW/cIb2AC9PUmuDvt3vURWZEjYEv+/Z+qXFcaI3He9wIhAJplGEI7JWtosgwWrXJjQD9IYNK5KNVtWFv31JFxRyHm"}]},"directories":{}},"3.0.0":{"name":"is-fullwidth-code-point","version":"3.0.0","description":"Check if the character represented by a given Unicode code point is fullwidth","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/is-fullwidth-code-point.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd-check"},"devDependencies":{"ava":"^1.3.1","tsd-check":"^0.5.0","xo":"^0.24.0"},"gitHead":"80e5e314d86e5f76bd1b0573aa9d33e615a372db","bugs":{"url":"https://github.com/sindresorhus/is-fullwidth-code-point/issues"},"_id":"is-fullwidth-code-point@3.0.0","_nodeVersion":"8.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==","shasum":"f116f8064fe90b3f7844a38997c0b75051269f1d","tarball":"http://localhost:4260/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz","fileCount":5,"unpackedSize":4994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcj1IhCRA9TVsSAnZWagAAXfQQAINQrkV7QJDGobc762SJ\nTQP45A1CPt+R4IrE6kzoZgbu9aVlK/1/ovrehQ3pkUYLdK+FLwkijHHNkP74\ntK/poxvNxDPUQbBUM/j73RmoTUye16j7bLIkoFQ5a9mgnjy35ZPUUARaw9Ad\nXLHa33xcp1v1dzg7fKrRicfqyIbv780zQRnrKCdE1Vw2G/wDO9R2xBbjhsFd\nni8GhNIHcmG9PDcg1B5vlTxrMPfhMPY4mw4j7V9IgDBbFU2r2L9hGVJYIa6s\nHDiQJYUeqyh/pKlvjI6O/GQPE+AB8IduBxMk+hRHaONTIX/F3RPFmkbwBpTW\nqF6yfoC7roALJrxeJwRooir4h7rChPXLf2UfzDMXYbo/srJ62Gw9ZYnYk/KQ\nA0Ve8GMXiPw3g9ow882INpTGRfql2szTuv8Lmz/vLW1XzcS+AewI72LKM+Kw\nRDwIVsjlORm836UKa8Or6JoGA1jBxIde+ETNXez9c8zAHr4O3zg+ySuAEN2S\nzswpng5xcjhPrgXp2OgkBG8LJBnvPNa2fAT5UPuEcMZhUxHNezSNDIih6weX\nb1YgjtrDOh5qIHaLbR9BJBYC6Vk+gvTK2m6/vDLqmH8P/cvvFkCX2qKgV3wC\n3vPowzeDopsNnA6YvIztI/uk/KV4B1i3Y5eFaylbzqUt23OPf1RrbzL9E0q3\ngPCe\r\n=DL3r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFqdK0e+RN4xM+7IrAyYmqvTaNg8MFEzwF42BtAoAgitAiEA/9YISFLSR/ut9zSkO4XG67As7nGNUWRBkhM21Q+8foU="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# is-fullwidth-code-point\n\n> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)\n\n## Install\n\n```\n$ npm install is-fullwidth-code-point\n```\n\n## Usage\n\n```js\nimport isFullwidthCodePoint from 'is-fullwidth-code-point';\n\nisFullwidthCodePoint('谢'.codePointAt(0));\n//=> true\n\nisFullwidthCodePoint('a'.codePointAt(0));\n//=> false\n```\n\n## API\n\n### isFullwidthCodePoint(codePoint)\n\n#### codePoint\n\nType: `number`\n\nThe [code point](https://en.wikipedia.org/wiki/Code_point) of a character.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-is-fullwidth-code-point?utm_source=npm-is-fullwidth-code-point&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/is-fullwidth-code-point#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/is-fullwidth-code-point.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/is-fullwidth-code-point/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "is-fullwidth-code-point",
+ "description": "Check if the character represented by a given Unicode code point is fullwidth",
+ "dist-tags": {
+ "latest": "3.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "is-fullwidth-code-point",
+ "version": "2.0.0",
+ "description": "Check if the character represented by a given Unicode code point is fullwidth",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "xo": {
+ "esnext": true
+ },
+ "gitHead": "e94a78056056c5546f2bf4c4cf812a2163a46dae",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues"
+ },
+ "_id": "is-fullwidth-code-point@2.0.0",
+ "_shasum": "a3b30a5c4f199183167aaab93beefae3ddfb654f",
+ "_from": ".",
+ "_npmVersion": "3.10.7",
+ "_nodeVersion": "4.5.0",
+ "dist": {
+ "shasum": "a3b30a5c4f199183167aaab93beefae3ddfb654f",
+ "tarball": "http://localhost:4260/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="
+ },
+ "directories": {}
+ },
+ "3.0.0": {
+ "name": "is-fullwidth-code-point",
+ "version": "3.0.0",
+ "description": "Check if the character represented by a given Unicode code point is fullwidth",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd-check"
+ },
+ "devDependencies": {
+ "ava": "^1.3.1",
+ "tsd-check": "^0.5.0",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "80e5e314d86e5f76bd1b0573aa9d33e615a372db",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues"
+ },
+ "_id": "is-fullwidth-code-point@3.0.0",
+ "_nodeVersion": "8.15.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "shasum": "f116f8064fe90b3f7844a38997c0b75051269f1d",
+ "tarball": "http://localhost:4260/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4994
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/is-lambda/registry.json b/tests/registry/npm/is-lambda/registry.json
index d51d255ff..847c7a48f 100644
--- a/tests/registry/npm/is-lambda/registry.json
+++ b/tests/registry/npm/is-lambda/registry.json
@@ -1 +1,66 @@
-{"name":"is-lambda","description":"Detect if your code is running on an AWS Lambda server","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"is-lambda","version":"1.0.1","description":"Detect if your code is running on an AWS Lambda server","main":"index.js","dependencies":{},"devDependencies":{"clear-require":"^1.0.1","standard":"^10.0.2"},"scripts":{"test":"standard && node test.js"},"repository":{"type":"git","url":"git+https://github.com/watson/is-lambda.git"},"author":{"name":"Thomas Watson Steen","email":"w@tson.dk","url":"https://twitter.com/wa7son"},"license":"MIT","bugs":{"url":"https://github.com/watson/is-lambda/issues"},"coordinates":[37.3859955,-122.0838831],"gitHead":"9e6734e406f4f84f1f5540a8e5115d6e00f860ff","_id":"is-lambda@1.0.1","_shasum":"3d9877899e6a53efc0160504cde15f82e6f061d5","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.0","dist":{"shasum":"3d9877899e6a53efc0160504cde15f82e6f061d5","tarball":"http://localhost:4260/is-lambda/is-lambda-1.0.1.tgz","integrity":"sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHWpJi2/bQUyBW7NDenjkyIbtXFZWLcIcpU1QjUbyp3XAiAtuGpqcPbXMtAMcDVHbc0whQvcNPh5129edWIKXieCnA=="}]}}},"readme":"# is-lambda\n\nReturns `true` if the current environment is an [AWS\nLambda](https://aws.amazon.com/lambda/) server.\n\n[![Build status](https://travis-ci.org/watson/is-lambda.svg?branch=master)](https://travis-ci.org/watson/is-lambda)\n[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)\n\n## Installation\n\n```\nnpm install is-lambda\n```\n\n## Usage\n\n```js\nvar isLambda = require('is-lambda')\n\nif (isLambda) {\n console.log('The code is running on a AWS Lambda')\n}\n```\n\n## License\n\nMIT\n","homepage":"https://github.com/watson/is-lambda","repository":{"type":"git","url":"git+https://github.com/watson/is-lambda.git"},"author":{"name":"Thomas Watson Steen","email":"w@tson.dk","url":"https://twitter.com/wa7son"},"bugs":{"url":"https://github.com/watson/is-lambda/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "is-lambda",
+ "description": "Detect if your code is running on an AWS Lambda server",
+ "dist-tags": {
+ "latest": "1.0.1"
+ },
+ "versions": {
+ "1.0.1": {
+ "name": "is-lambda",
+ "version": "1.0.1",
+ "description": "Detect if your code is running on an AWS Lambda server",
+ "main": "index.js",
+ "dependencies": {},
+ "devDependencies": {
+ "clear-require": "^1.0.1",
+ "standard": "^10.0.2"
+ },
+ "scripts": {
+ "test": "standard && node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/watson/is-lambda.git"
+ },
+ "author": {
+ "name": "Thomas Watson Steen",
+ "email": "w@tson.dk",
+ "url": "https://twitter.com/wa7son"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/watson/is-lambda/issues"
+ },
+ "coordinates": [
+ 37.3859955,
+ -122.0838831
+ ],
+ "gitHead": "9e6734e406f4f84f1f5540a8e5115d6e00f860ff",
+ "_id": "is-lambda@1.0.1",
+ "_shasum": "3d9877899e6a53efc0160504cde15f82e6f061d5",
+ "_from": ".",
+ "_npmVersion": "4.2.0",
+ "_nodeVersion": "7.10.0",
+ "dist": {
+ "shasum": "3d9877899e6a53efc0160504cde15f82e6f061d5",
+ "tarball": "http://localhost:4260/is-lambda/is-lambda-1.0.1.tgz",
+ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="
+ }
+ }
+ },
+ "homepage": "https://github.com/watson/is-lambda",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/watson/is-lambda.git"
+ },
+ "author": {
+ "name": "Thomas Watson Steen",
+ "email": "w@tson.dk",
+ "url": "https://twitter.com/wa7son"
+ },
+ "bugs": {
+ "url": "https://github.com/watson/is-lambda/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/isexe/registry.json b/tests/registry/npm/isexe/registry.json
index 3621c8146..f57bf81d4 100644
--- a/tests/registry/npm/isexe/registry.json
+++ b/tests/registry/npm/isexe/registry.json
@@ -1 +1,184 @@
-{"name":"isexe","description":"Minimal module to check if a file is executable.","dist-tags":{"latest":"3.1.1"},"versions":{"2.0.0":{"name":"isexe","version":"2.0.0","description":"Minimal module to check if a file is executable.","main":"index.js","directories":{"test":"test"},"devDependencies":{"mkdirp":"^0.5.1","rimraf":"^2.5.0","tap":"^10.3.0"},"scripts":{"test":"tap test/*.js --100","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --all; git push origin --tags"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/isaacs/isexe.git"},"bugs":{"url":"https://github.com/isaacs/isexe/issues"},"gitHead":"10f8be491aab2e158c7e20df64a7f90ab5b5475c","_id":"isexe@2.0.0","_shasum":"e8fbf374dc556ff8947a10dcb0572d633f2cfa10","_from":".","_npmVersion":"4.4.2","_nodeVersion":"8.0.0-pre","dist":{"shasum":"e8fbf374dc556ff8947a10dcb0572d633f2cfa10","tarball":"http://localhost:4260/isexe/isexe-2.0.0.tgz","integrity":"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIADIHL0vHAyBDSHK5BeCzNQb3ooCTHoBU+bp0my0d0pwAiAEzxUmLzKn2xsUOTDZngxVYgQ+2BELnj8z+ZNAJWENzA=="}]}},"3.1.1":{"name":"isexe","version":"3.1.1","description":"Minimal module to check if a file is executable.","main":"./dist/cjs/index.js","module":"./dist/mjs/index.js","types":"./dist/cjs/index.js","exports":{".":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./posix":{"import":{"types":"./dist/mjs/posix.d.ts","default":"./dist/mjs/posix.js"},"require":{"types":"./dist/cjs/posix.d.ts","default":"./dist/cjs/posix.js"}},"./win32":{"import":{"types":"./dist/mjs/win32.d.ts","default":"./dist/mjs/win32.js"},"require":{"types":"./dist/cjs/win32.d.ts","default":"./dist/cjs/win32.js"}},"./package.json":"./package.json"},"devDependencies":{"@types/node":"^20.4.5","@types/tap":"^15.0.8","c8":"^8.0.1","mkdirp":"^0.5.1","prettier":"^2.8.8","rimraf":"^2.5.0","sync-content":"^1.0.2","tap":"^16.3.8","ts-node":"^10.9.1","typedoc":"^0.24.8","typescript":"^5.1.6"},"scripts":{"preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","prepare":"tsc -p tsconfig/cjs.json && tsc -p tsconfig/esm.json && bash ./scripts/fixup.sh","pretest":"npm run prepare","presnap":"npm run prepare","test":"c8 tap","snap":"c8 tap","format":"prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache","typedoc":"typedoc --tsconfig tsconfig/esm.json ./src/*.ts"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","tap":{"coverage":false,"node-arg":["--enable-source-maps","--no-warnings","--loader","ts-node/esm"],"ts":false},"prettier":{"semi":false,"printWidth":75,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"repository":{"type":"git","url":"git+https://github.com/isaacs/isexe.git"},"engines":{"node":">=16"},"_id":"isexe@3.1.1","gitHead":"8e5d06b2f0e6d7cfe83d19eb0a9c572d2c598232","bugs":{"url":"https://github.com/isaacs/isexe/issues"},"_nodeVersion":"18.16.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==","shasum":"4a407e2bd78ddfb14bea0c27c6f7072dde775f0d","tarball":"http://localhost:4260/isexe/isexe-3.1.1.tgz","fileCount":37,"unpackedSize":42976,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBt7dbhTPX0ky58uojKSFYst9buz67jou2hy++gCFoGJAiEA6bCzyCRapCKkPSJwo7lcebsUmoRa25od3DcKmMtaygM="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# isexe\n\nMinimal module to check if a file is executable, and a normal file.\n\nUses `fs.stat` and tests against the `PATHEXT` environment variable on\nWindows.\n\n## USAGE\n\n```js\nimport { isexe, sync } from 'isexe'\n// or require() works too\n// const { isexe } = require('isexe')\nisexe('some-file-name').then(isExe => {\n if (isExe) {\n console.error('this thing can be run')\n } else {\n console.error('cannot be run')\n }\n}, (err) => {\n console.error('probably file doesnt exist or something')\n})\n\n// same thing but synchronous, throws errors\nisExe = sync('some-file-name')\n\n// treat errors as just \"not executable\"\nconst isExe = await isexe('maybe-missing-file', { ignoreErrors: true })\nconst isExe = sync('maybe-missing-file', { ignoreErrors: true })\n```\n\n## API\n\n### `isexe(path, [options]) => Promise<boolean>`\n\nCheck if the path is executable.\n\nWill raise whatever errors may be raised by `fs.stat`, unless\n`options.ignoreErrors` is set to true.\n\n### `sync(path, [options]) => boolean`\n\nSame as `isexe` but returns the value and throws any errors raised.\n\n## Platform Specific Implementations\n\nIf for some reason you want to use the implementation for a\nspecific platform, you can do that.\n\n```js\nimport { win32, posix } from 'isexe'\nwin32.isexe(...)\nwin32.sync(...)\n// etc\n\n// or:\nimport { isexe, sync } from 'isexe/posix'\n```\n\nThe default exported implementation will be chosen based on\n`process.platform`.\n\n### Options\n\n```ts\nimport type IsexeOptions from 'isexe'\n```\n\n* `ignoreErrors` Treat all errors as \"no, this is not\n executable\", but don't raise them.\n* `uid` Number to use as the user id on posix\n* `gid` Number to use as the group id on posix\n* `pathExt` List of path extensions to use instead of `PATHEXT`\n environment variable on Windows.\n","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","readmeFilename":"README.md","homepage":"https://github.com/isaacs/isexe#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/isexe.git"},"bugs":{"url":"https://github.com/isaacs/isexe/issues"}}
+{
+ "name": "isexe",
+ "description": "Minimal module to check if a file is executable.",
+ "dist-tags": {
+ "latest": "3.1.1"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "isexe",
+ "version": "2.0.0",
+ "description": "Minimal module to check if a file is executable.",
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "devDependencies": {
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.0",
+ "tap": "^10.3.0"
+ },
+ "scripts": {
+ "test": "tap test/*.js --100",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --all; git push origin --tags"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/isexe.git"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/isexe/issues"
+ },
+ "gitHead": "10f8be491aab2e158c7e20df64a7f90ab5b5475c",
+ "_id": "isexe@2.0.0",
+ "_shasum": "e8fbf374dc556ff8947a10dcb0572d633f2cfa10",
+ "_from": ".",
+ "_npmVersion": "4.4.2",
+ "_nodeVersion": "8.0.0-pre",
+ "dist": {
+ "shasum": "e8fbf374dc556ff8947a10dcb0572d633f2cfa10",
+ "tarball": "http://localhost:4260/isexe/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ }
+ },
+ "3.1.1": {
+ "name": "isexe",
+ "version": "3.1.1",
+ "description": "Minimal module to check if a file is executable.",
+ "main": "./dist/cjs/index.js",
+ "module": "./dist/mjs/index.js",
+ "types": "./dist/cjs/index.js",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/mjs/index.d.ts",
+ "default": "./dist/mjs/index.js"
+ },
+ "require": {
+ "types": "./dist/cjs/index.d.ts",
+ "default": "./dist/cjs/index.js"
+ }
+ },
+ "./posix": {
+ "import": {
+ "types": "./dist/mjs/posix.d.ts",
+ "default": "./dist/mjs/posix.js"
+ },
+ "require": {
+ "types": "./dist/cjs/posix.d.ts",
+ "default": "./dist/cjs/posix.js"
+ }
+ },
+ "./win32": {
+ "import": {
+ "types": "./dist/mjs/win32.d.ts",
+ "default": "./dist/mjs/win32.js"
+ },
+ "require": {
+ "types": "./dist/cjs/win32.d.ts",
+ "default": "./dist/cjs/win32.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "devDependencies": {
+ "@types/node": "^20.4.5",
+ "@types/tap": "^15.0.8",
+ "c8": "^8.0.1",
+ "mkdirp": "^0.5.1",
+ "prettier": "^2.8.8",
+ "rimraf": "^2.5.0",
+ "sync-content": "^1.0.2",
+ "tap": "^16.3.8",
+ "ts-node": "^10.9.1",
+ "typedoc": "^0.24.8",
+ "typescript": "^5.1.6"
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tsc -p tsconfig/cjs.json && tsc -p tsconfig/esm.json && bash ./scripts/fixup.sh",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "c8 tap",
+ "snap": "c8 tap",
+ "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache",
+ "typedoc": "typedoc --tsconfig tsconfig/esm.json ./src/*.ts"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "tap": {
+ "coverage": false,
+ "node-arg": [
+ "--enable-source-maps",
+ "--no-warnings",
+ "--loader",
+ "ts-node/esm"
+ ],
+ "ts": false
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/isexe.git"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "_id": "isexe@3.1.1",
+ "gitHead": "8e5d06b2f0e6d7cfe83d19eb0a9c572d2c598232",
+ "bugs": {
+ "url": "https://github.com/isaacs/isexe/issues"
+ },
+ "_nodeVersion": "18.16.0",
+ "_npmVersion": "9.8.1",
+ "dist": {
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "shasum": "4a407e2bd78ddfb14bea0c27c6f7072dde775f0d",
+ "tarball": "http://localhost:4260/isexe/isexe-3.1.1.tgz",
+ "fileCount": 37,
+ "unpackedSize": 42976
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/isaacs/isexe#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/isexe.git"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/isexe/issues"
+ }
+}
diff --git a/tests/registry/npm/jackspeak/registry.json b/tests/registry/npm/jackspeak/registry.json
index eba0cabc2..d5da95d53 100644
--- a/tests/registry/npm/jackspeak/registry.json
+++ b/tests/registry/npm/jackspeak/registry.json
@@ -1 +1,122 @@
-{"name":"jackspeak","dist-tags":{"latest":"3.4.2"},"versions":{"3.4.2":{"name":"jackspeak","version":"3.4.2","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"BlueOak-1.0.0","_id":"jackspeak@3.4.2","bugs":{"url":"https://github.com/isaacs/jackspeak/issues"},"dist":{"shasum":"c3d1e00071d52dba8b0dac17cd2a12d0187d2989","tarball":"http://localhost:4260/jackspeak/jackspeak-3.4.2.tgz","fileCount":21,"integrity":"sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==","signatures":[{"sig":"MEYCIQDQjdGlw/fkPqtOMv0ucXnRk/TkZ7m8bjI2nqJOW+BxKwIhAPHs+uDvbBHMqu25nIadbvcYqmBpXJoGiC6V3SFfUxkl","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":297035},"main":"./dist/commonjs/index.js","tshy":{"main":true,"exports":{".":"./src/index.js","./package.json":"./package.json"}},"type":"module","types":"./dist/commonjs/index.d.ts","engines":{"node":"14 >=14.21 || 16 >=16.20 || >=18"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/isaacs"},"gitHead":"82d3614e0715078b922819785abd1e534121b51c","scripts":{"snap":"tap","test":"tap","format":"prettier --write . --log-level warn","prepare":"tshy","presnap":"npm run prepare","pretest":"npm run prepare","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts","preversion":"npm test","postversion":"npm publish","build-examples":"for i in examples/*.js ; do node $i -h > ${i/.js/.txt}; done","prepublishOnly":"git push origin --follow-tags"},"prettier":{"semi":false,"useTabs":false,"tabWidth":2,"endOfLine":"lf","printWidth":75,"arrowParens":"avoid","singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"experimentalTernaries":true},"repository":{"url":"git+https://github.com/isaacs/jackspeak.git","type":"git"},"_npmVersion":"10.7.0","description":"A very strict and proper argument parser.","directories":{},"_nodeVersion":"20.13.1","dependencies":{"@isaacs/cliui":"^8.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^18.8.0","tshy":"^1.14.0","typedoc":"^0.25.1","prettier":"^3.2.5","typescript":"^5.2.2","@types/node":"^20.7.0","@types/pkgjs__parseargs":"^0.10.1"},"optionalDependencies":{"@pkgjs/parseargs":"^0.11.0"}}},"bugs":{"url":"https://github.com/isaacs/jackspeak/issues"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"BlueOak-1.0.0","homepage":"https://github.com/isaacs/jackspeak#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/jackspeak.git"},"description":"A very strict and proper argument parser.","readme":"# jackspeak\n\nA very strict and proper argument parser.\n\nValidate string, boolean, and number options, from the command\nline and the environment.\n\nCall the `jack` method with a config object, and then chain\nmethods off of it.\n\nAt the end, call the `.parse()` method, and you'll get an object\nwith `positionals` and `values` members.\n\nAny unrecognized configs or invalid values will throw an error.\n\nAs long as you define configs using object literals, types will\nbe properly inferred and TypeScript will know what kinds of\nthings you got.\n\nIf you give it a prefix for environment variables, then defaults\nwill be read from the environment, and parsed values written back\nto it, so you can easily pass configs through to child processes.\n\nAutomatically generates a `usage`/`help` banner by calling the\n`.usage()` method.\n\nUnless otherwise noted, all methods return the object itself.\n\n## USAGE\n\n```js\nimport { jack } from 'jackspeak'\n// this works too:\n// const { jack } = require('jackspeak')\n\nconst { positionals, values } = jack({ envPrefix: 'FOO' })\n .flag({\n asdf: { description: 'sets the asfd flag', short: 'a', default: true },\n 'no-asdf': { description: 'unsets the asdf flag', short: 'A' },\n foo: { description: 'another boolean', short: 'f' },\n })\n .optList({\n 'ip-addrs': {\n description: 'addresses to ip things',\n delim: ',', // defaults to '\\n'\n default: ['127.0.0.1'],\n },\n })\n .parse([\n 'some',\n 'positional',\n '--ip-addrs',\n '192.168.0.1',\n '--ip-addrs',\n '1.1.1.1',\n 'args',\n '--foo', // sets the foo flag\n '-A', // short for --no-asdf, sets asdf flag to false\n ])\n\nconsole.log(process.env.FOO_ASDF) // '0'\nconsole.log(process.env.FOO_FOO) // '1'\nconsole.log(values) // {\n// 'ip-addrs': ['192.168.0.1', '1.1.1.1'],\n// foo: true,\n// asdf: false,\n// }\nconsole.log(process.env.FOO_IP_ADDRS) // '192.168.0.1,1.1.1.1'\nconsole.log(positionals) // ['some', 'positional', 'args']\n```\n\n## `jack(options: JackOptions = {}) => Jack`\n\nReturns a `Jack` object that can be used to chain and add\nfield definitions. The other methods (apart from `validate()`,\n`parse()`, and `usage()` obviously) return the same Jack object,\nupdated with the new types, so they can be chained together as\nshown in the code examples.\n\nOptions:\n\n- `allowPositionals` Defaults to true. Set to `false` to not\n allow any positional arguments.\n\n- `envPrefix` Set to a string to write configs to and read\n configs from the environment. For example, if set to `MY_APP`\n then the `foo-bar` config will default based on the value of\n `env.MY_APP_FOO_BAR` and will write back to that when parsed.\n\n Boolean values are written as `'1'` and `'0'`, and will be\n treated as `true` if they're `'1'` or false otherwise.\n\n Number values are written with their `toString()`\n representation.\n\n Strings are just strings.\n\n Any value with `multiple: true` will be represented in the\n environment split by a delimiter, which defaults to `\\n`.\n\n- `env` The place to read/write environment variables. Defaults\n to `process.env`.\n\n- `usage` A short usage string to print at the top of the help\n banner.\n\n- `stopAtPositional` Boolean, default false. Stop parsing opts\n and flags at the first positional argument. This is useful if\n you want to pass certain options to subcommands, like some\n programs do, so you can stop parsing and pass the positionals\n to the subcommand to parse.\n\n- `stopAtPositionalTest` Conditional `stopAtPositional`. Provide\n a function that takes a positional argument string and returns\n boolean. If it returns `true`, then parsing will stop. Useful\n when _some_ subcommands should parse the rest of the command\n line options, and others should not.\n\n### `Jack.heading(text: string, level?: 1 | 2 | 3 | 4 | 5 | 6)`\n\nDefine a short string heading, used in the `usage()` output.\n\nIndentation of the heading and subsequent description/config\nusage entries (up until the next heading) is set by the heading\nlevel.\n\nIf the first usage item defined is a heading, it is always\ntreated as level 1, regardless of the argument provided.\n\nHeadings level 1 and 2 will have a line of padding underneath\nthem. Headings level 3 through 6 will not.\n\n### `Jack.description(text: string, { pre?: boolean } = {})`\n\nDefine a long string description, used in the `usage()` output.\n\nIf the `pre` option is set to `true`, then whitespace will not be\nnormalized. However, if any line is too long for the width\nallotted, it will still be wrapped.\n\n## Option Definitions\n\nConfigs are defined by calling the appropriate field definition\nmethod with an object where the keys are the long option name,\nand the value defines the config.\n\nOptions:\n\n- `type` Only needed for the `addFields` method, as the others\n set it implicitly. Can be `'string'`, `'boolean'`, or\n `'number'`.\n- `multiple` Only needed for the `addFields` method, as the\n others set it implicitly. Set to `true` to define an array\n type. This means that it can be set on the CLI multiple times,\n set as an array in the `values`\n and it is represented in the environment as a delimited string.\n- `short` A one-character shorthand for the option.\n- `description` Some words to describe what this option is and\n why you'd set it.\n- `hint` (Only relevant for non-boolean types) The thing to show\n in the usage output, like `--option=<hint>`\n- `validate` A function that returns false (or throws) if an\n option value is invalid.\n- `validOptions` An array of strings or numbers that define the\n valid values that can be set. This is not allowed on `boolean`\n (flag) options. May be used along with a `validate()` method.\n- `default` A default value for the field. Note that this may be\n overridden by an environment variable, if present.\n\n### `Jack.flag({ [option: string]: definition, ... })`\n\nDefine one or more boolean fields.\n\nBoolean options may be set to `false` by using a\n`--no-${optionName}` argument, which will be implicitly created\nif it's not defined to be something else.\n\nIf a boolean option named `no-${optionName}` with the same\n`multiple` setting is in the configuration, then that will be\ntreated as a negating flag.\n\n### `Jack.flagList({ [option: string]: definition, ... })`\n\nDefine one or more boolean array fields.\n\n### `Jack.num({ [option: string]: definition, ... })`\n\nDefine one or more number fields. These will be set in the\nenvironment as a stringified number, and included in the `values`\nobject as a number.\n\n### `Jack.numList({ [option: string]: definition, ... })`\n\nDefine one or more number list fields. These will be set in the\nenvironment as a delimited set of stringified numbers, and\nincluded in the `values` as a number array.\n\n### `Jack.opt({ [option: string]: definition, ... })`\n\nDefine one or more string option fields.\n\n### `Jack.optList({ [option: string]: definition, ... })`\n\nDefine one or more string list fields.\n\n### `Jack.addFields({ [option: string]: definition, ... })`\n\nDefine one or more fields of any type. Note that `type` and\n`multiple` must be set explicitly on each definition when using\nthis method.\n\n## Actions\n\nUse these methods on a Jack object that's already had its config\nfields defined.\n\n### `Jack.parse(args: string[] = process.argv): { positionals: string[], values: OptionsResults }`\n\nParse the arguments list, write to the environment if `envPrefix`\nis set, and returned the parsed values and remaining positional\narguments.\n\n### `Jack.validate(o: any): asserts o is OptionsResults`\n\nThrows an error if the object provided is not a valid result set,\nfor the configurations defined thusfar.\n\n### `Jack.usage(): string`\n\nReturns the compiled `usage` string, with all option descriptions\nand heading/description text, wrapped to the appropriate width\nfor the terminal.\n\n### `Jack.setConfigValues(options: OptionsResults, src?: string)`\n\nValidate the `options` argument, and set the default value for\neach field that appears in the options.\n\nValues provided will be overridden by environment variables or\ncommand line arguments.\n\n### `Jack.usageMarkdown(): string`\n\nReturns the compiled `usage` string, with all option descriptions\nand heading/description text, but as markdown instead of\nformatted for a terminal, for generating HTML documentation for\nyour CLI.\n\n## Some Example Code\n\nAlso see [the examples\nfolder](https://github.com/isaacs/jackspeak/tree/master/examples)\n\n```js\nimport { jack } from 'jackspeak'\n\nconst j = jack({\n // Optional\n // This will be auto-generated from the descriptions if not supplied\n // top level usage line, printed by -h\n // will be auto-generated if not specified\n usage: 'foo [options] <files>',\n})\n .heading('The best Foo that ever Fooed')\n .description(\n `\n Executes all the files and interprets their output as\n TAP formatted test result data.\n\n To parse TAP data from stdin, specify \"-\" as a filename.\n `,\n )\n\n // flags don't take a value, they're boolean on or off, and can be\n // turned off by prefixing with `--no-`\n // so this adds support for -b to mean --bail, or -B to mean --no-bail\n .flag({\n flag: {\n // specify a short value if you like. this must be a single char\n short: 'f',\n // description is optional as well.\n description: `Make the flags wave`,\n // default value for flags is 'false', unless you change it\n default: true,\n },\n 'no-flag': {\n // you can can always negate a flag with `--no-flag`\n // specifying a negate option will let you define a short\n // single-char option for negation.\n short: 'F',\n description: `Do not wave the flags`,\n },\n })\n\n // Options that take a value are specified with `opt()`\n .opt({\n reporter: {\n short: 'R',\n description: 'the style of report to display',\n },\n })\n\n // if you want a number, say so, and jackspeak will enforce it\n .num({\n jobs: {\n short: 'j',\n description: 'how many jobs to run in parallel',\n default: 1,\n },\n })\n\n // A list is an option that can be specified multiple times,\n // to expand into an array of all the settings. Normal opts\n // will just give you the last value specified.\n .optList({\n 'node-arg': {},\n })\n\n // a flagList is an array of booleans, so `-ddd` is [true, true, true]\n // count the `true` values to treat it as a counter.\n .flagList({\n debug: { short: 'd' },\n })\n\n // opts take a value, and is set to the string in the results\n // you can combine multiple short-form flags together, but\n // an opt will end the combine chain, posix-style. So,\n // -bofilename would be like --bail --output-file=filename\n .opt({\n 'output-file': {\n short: 'o',\n // optional: make it -o<file> in the help output insead of -o<value>\n hint: 'file',\n description: `Send the raw output to the specified file.`,\n },\n })\n\n// now we can parse argv like this:\nconst { values, positionals } = j.parse(process.argv)\n\n// or decide to show the usage banner\nconsole.log(j.usage())\n\n// or validate an object config we got from somewhere else\ntry {\n j.validate(someConfig)\n} catch (er) {\n console.error('someConfig is not valid!', er)\n}\n```\n\n## Name\n\nThe inspiration for this module is [yargs](http://npm.im/yargs), which\nis pirate talk themed. Yargs has all the features, and is infinitely\nflexible. \"Jackspeak\" is the slang of the royal navy. This module\ndoes not have all the features. It is declarative and rigid by design.\n","readmeFilename":"README.md"}
+{
+ "name": "jackspeak",
+ "dist-tags": {
+ "latest": "3.4.2"
+ },
+ "versions": {
+ "3.4.2": {
+ "name": "jackspeak",
+ "version": "3.4.2",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "BlueOak-1.0.0",
+ "_id": "jackspeak@3.4.2",
+ "bugs": {
+ "url": "https://github.com/isaacs/jackspeak/issues"
+ },
+ "dist": {
+ "shasum": "c3d1e00071d52dba8b0dac17cd2a12d0187d2989",
+ "tarball": "http://localhost:4260/jackspeak/jackspeak-3.4.2.tgz",
+ "fileCount": 21,
+ "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==",
+ "unpackedSize": 297035
+ },
+ "main": "./dist/commonjs/index.js",
+ "tshy": {
+ "main": true,
+ "exports": {
+ ".": "./src/index.js",
+ "./package.json": "./package.json"
+ }
+ },
+ "type": "module",
+ "types": "./dist/commonjs/index.d.ts",
+ "engines": {
+ "node": "14 >=14.21 || 16 >=16.20 || >=18"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "82d3614e0715078b922819785abd1e534121b51c",
+ "scripts": {
+ "snap": "tap",
+ "test": "tap",
+ "format": "prettier --write . --log-level warn",
+ "prepare": "tshy",
+ "presnap": "npm run prepare",
+ "pretest": "npm run prepare",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "build-examples": "for i in examples/*.js ; do node $i -h > ${i/.js/.txt}; done",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "prettier": {
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "endOfLine": "lf",
+ "printWidth": 75,
+ "arrowParens": "avoid",
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "experimentalTernaries": true
+ },
+ "repository": {
+ "url": "git+https://github.com/isaacs/jackspeak.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "A very strict and proper argument parser.",
+ "directories": {},
+ "_nodeVersion": "20.13.1",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^18.8.0",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.1",
+ "prettier": "^3.2.5",
+ "typescript": "^5.2.2",
+ "@types/node": "^20.7.0",
+ "@types/pkgjs__parseargs": "^0.10.1"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ }
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/jackspeak/issues"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "BlueOak-1.0.0",
+ "homepage": "https://github.com/isaacs/jackspeak#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/jackspeak.git"
+ },
+ "description": "A very strict and proper argument parser.",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/js-tokens/registry.json b/tests/registry/npm/js-tokens/registry.json
index 511492101..df4e1469d 100644
--- a/tests/registry/npm/js-tokens/registry.json
+++ b/tests/registry/npm/js-tokens/registry.json
@@ -1 +1,63 @@
-{"name":"js-tokens","description":"Tiny JavaScript tokenizer.","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"js-tokens","version":"4.0.0","author":{"name":"Simon Lydell"},"license":"MIT","description":"A regex that tokenizes JavaScript.","files":["index.js"],"repository":{"type":"git","url":"git+https://github.com/lydell/js-tokens.git"},"scripts":{"test":"mocha --ui tdd","esprima-compare":"node esprima-compare ./index.js everything.js/es5.js","build":"node generate-index.js","dev":"npm run build && npm test"},"devDependencies":{"coffeescript":"2.1.1","esprima":"4.0.0","everything.js":"1.0.3","mocha":"5.0.0"},"gitHead":"0eb6e9daee32160ab0fca979b6dc91a1991b720c","bugs":{"url":"https://github.com/lydell/js-tokens/issues"},"_id":"js-tokens@4.0.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","dist":{"integrity":"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==","shasum":"19203fb59991df98e3a287050d4647cdeaf32499","tarball":"http://localhost:4260/js-tokens/js-tokens-4.0.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHTFYsC9RMPKFuD2Ff2bRCSWNb36hIt4dZfUv4vusrrOAiEAp3qTBJDVdCmqIySFXqJpqfON89dldxEoM1XZQXYkKkg="}]},"directories":{}}},"readme":"# js-tokens\n\nThe tiny, regex powered, lenient, _almost_ spec-compliant JavaScript tokenizer that never fails.\n\n```js\nconst jsTokens = require(\"js-tokens\");\n\nconst jsString = 'JSON.stringify({k:3.14**2}, null /*replacer*/, \"\\\\t\")';\n\nArray.from(jsTokens(jsString), (token) => token.value).join(\"|\");\n// JSON|.|stringify|(|{|k|:|3.14|**|2|}|,| |null| |/*replacer*/|,| |\"\\t\"|)\n```\n\n**[➡️ Full readme](https://github.com/lydell/js-tokens/)**","homepage":"https://github.com/lydell/js-tokens#readme","repository":{"type":"git","url":"git+https://github.com/lydell/js-tokens.git"},"author":{"name":"Simon Lydell"},"bugs":{"url":"https://github.com/lydell/js-tokens/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "js-tokens",
+ "description": "Tiny JavaScript tokenizer.",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "js-tokens",
+ "version": "4.0.0",
+ "author": {
+ "name": "Simon Lydell"
+ },
+ "license": "MIT",
+ "description": "A regex that tokenizes JavaScript.",
+ "files": [
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/lydell/js-tokens.git"
+ },
+ "scripts": {
+ "test": "mocha --ui tdd",
+ "esprima-compare": "node esprima-compare ./index.js everything.js/es5.js",
+ "build": "node generate-index.js",
+ "dev": "npm run build && npm test"
+ },
+ "devDependencies": {
+ "coffeescript": "2.1.1",
+ "esprima": "4.0.0",
+ "everything.js": "1.0.3",
+ "mocha": "5.0.0"
+ },
+ "gitHead": "0eb6e9daee32160ab0fca979b6dc91a1991b720c",
+ "bugs": {
+ "url": "https://github.com/lydell/js-tokens/issues"
+ },
+ "_id": "js-tokens@4.0.0",
+ "_npmVersion": "5.6.0",
+ "_nodeVersion": "8.9.4",
+ "dist": {
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "shasum": "19203fb59991df98e3a287050d4647cdeaf32499",
+ "tarball": "http://localhost:4260/js-tokens/js-tokens-4.0.0.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "homepage": "https://github.com/lydell/js-tokens#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/lydell/js-tokens.git"
+ },
+ "author": {
+ "name": "Simon Lydell"
+ },
+ "bugs": {
+ "url": "https://github.com/lydell/js-tokens/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/jsbn/registry.json b/tests/registry/npm/jsbn/registry.json
index 9d7ee9ba0..b70c34d6d 100644
--- a/tests/registry/npm/jsbn/registry.json
+++ b/tests/registry/npm/jsbn/registry.json
@@ -1 +1,53 @@
-{"name":"jsbn","description":"The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"name":"jsbn","version":"1.1.0","description":"The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.","main":"index.js","scripts":{"test":"mocha test.js"},"repository":{"type":"git","url":"git+https://github.com/andyperlitch/jsbn.git"},"author":{"name":"Tom Wu"},"license":"MIT","gitHead":"038459dc74668bfb43b45d78b33ffc9c8e7bf34a","bugs":{"url":"https://github.com/andyperlitch/jsbn/issues"},"_id":"jsbn@1.1.0","_shasum":"b01307cb29b618a1ed26ec79e911f803c4da0040","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.3.1","dist":{"shasum":"b01307cb29b618a1ed26ec79e911f803c4da0040","tarball":"http://localhost:4260/jsbn/jsbn-1.1.0.tgz","integrity":"sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfJzg5+rvckY7nqgg7aTMuYjwBDvKXH5BcVsTfxV+YNAIhANWVA/9k8GQvH9wvGEr+V8bayMMkhduMellPjQv/T0A+"}]}}},"readme":"# jsbn: javascript big number\n\n[Tom Wu's Original Website](http://www-cs-students.stanford.edu/~tjw/jsbn/)\n\nI felt compelled to put this on github and publish to npm. I haven't tested every other big integer library out there, but the few that I have tested in comparison to this one have not even come close in performance. I am aware of the `bi` module on npm, however it has been modified and I wanted to publish the original without modifications. This is jsbn and jsbn2 from Tom Wu's original website above, with the module pattern applied to prevent global leaks and to allow for use with node.js on the server side.\n\n## usage\n\n var BigInteger = require('jsbn').BigInteger;\n\n var bi = new BigInteger('91823918239182398123');\n console.log(bi.bitLength()); // 67\n\n\n## API\n\n### bi.toString()\n\nreturns the base-10 number as a string\n\n### bi.negate()\n\nreturns a new BigInteger equal to the negation of `bi`\n\n### bi.abs\n\nreturns new BI of absolute value\n\n### bi.compareTo\n\n\n\n### bi.bitLength\n\n\n\n### bi.mod\n\n\n\n### bi.modPowInt\n\n\n\n### bi.clone\n\n\n\n### bi.intValue\n\n\n\n### bi.byteValue\n\n\n\n### bi.shortValue\n\n\n\n### bi.signum\n\n\n\n### bi.toByteArray\n\n\n\n### bi.equals\n\n\n\n### bi.min\n\n\n\n### bi.max\n\n\n\n### bi.and\n\n\n\n### bi.or\n\n\n\n### bi.xor\n\n\n\n### bi.andNot\n\n\n\n### bi.not\n\n\n\n### bi.shiftLeft\n\n\n\n### bi.shiftRight\n\n\n\n### bi.getLowestSetBit\n\n\n\n### bi.bitCount\n\n\n\n### bi.testBit\n\n\n\n### bi.setBit\n\n\n\n### bi.clearBit\n\n\n\n### bi.flipBit\n\n\n\n### bi.add\n\n\n\n### bi.subtract\n\n\n\n### bi.multiply\n\n\n\n### bi.divide\n\n\n\n### bi.remainder\n\n\n\n### bi.divideAndRemainder\n\n\n\n### bi.modPow\n\n\n\n### bi.modInverse\n\n\n\n### bi.pow\n\n\n\n### bi.gcd\n\n\n\n### bi.isProbablePrime\n","author":{"name":"Tom Wu"},"repository":{"type":"git","url":"git+https://github.com/andyperlitch/jsbn.git"},"homepage":"https://github.com/andyperlitch/jsbn#readme","bugs":{"url":"https://github.com/andyperlitch/jsbn/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "jsbn",
+ "description": "The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.",
+ "dist-tags": {
+ "latest": "1.1.0"
+ },
+ "versions": {
+ "1.1.0": {
+ "name": "jsbn",
+ "version": "1.1.0",
+ "description": "The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.",
+ "main": "index.js",
+ "scripts": {
+ "test": "mocha test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/andyperlitch/jsbn.git"
+ },
+ "author": {
+ "name": "Tom Wu"
+ },
+ "license": "MIT",
+ "gitHead": "038459dc74668bfb43b45d78b33ffc9c8e7bf34a",
+ "bugs": {
+ "url": "https://github.com/andyperlitch/jsbn/issues"
+ },
+ "_id": "jsbn@1.1.0",
+ "_shasum": "b01307cb29b618a1ed26ec79e911f803c4da0040",
+ "_from": ".",
+ "_npmVersion": "3.10.3",
+ "_nodeVersion": "6.3.1",
+ "dist": {
+ "shasum": "b01307cb29b618a1ed26ec79e911f803c4da0040",
+ "tarball": "http://localhost:4260/jsbn/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
+ }
+ }
+ },
+ "author": {
+ "name": "Tom Wu"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/andyperlitch/jsbn.git"
+ },
+ "homepage": "https://github.com/andyperlitch/jsbn#readme",
+ "bugs": {
+ "url": "https://github.com/andyperlitch/jsbn/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/json-schema-traverse/registry.json b/tests/registry/npm/json-schema-traverse/registry.json
index e7f48d897..42cd33a51 100644
--- a/tests/registry/npm/json-schema-traverse/registry.json
+++ b/tests/registry/npm/json-schema-traverse/registry.json
@@ -1 +1,74 @@
-{"name":"json-schema-traverse","description":"Traverse JSON Schema passing each schema object to callback","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"json-schema-traverse","version":"1.0.0","description":"Traverse JSON Schema passing each schema object to callback","main":"index.js","types":"index.d.ts","scripts":{"eslint":"eslint index.js spec","test-spec":"mocha spec -R spec","test":"npm run eslint && nyc npm run test-spec"},"repository":{"type":"git","url":"git+https://github.com/epoberezkin/json-schema-traverse.git"},"author":{"name":"Evgeny Poberezkin"},"license":"MIT","bugs":{"url":"https://github.com/epoberezkin/json-schema-traverse/issues"},"devDependencies":{"eslint":"^7.3.1","mocha":"^8.0.1","nyc":"^15.0.0","pre-commit":"^1.2.2"},"nyc":{"exclude":["**/spec/**","node_modules"],"reporter":["lcov","text-summary"]},"gitHead":"6b45983cd76270042cc79527da5c8972f13599ec","_id":"json-schema-traverse@1.0.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==","shasum":"ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2","tarball":"http://localhost:4260/json-schema-traverse/json-schema-traverse-1.0.0.tgz","fileCount":12,"unpackedSize":22220,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1fN3CRA9TVsSAnZWagAAOvgP/RW4IyNaG+9p/oIa6WhS\nu0try6lP7Hym+dFd2utH5S19/K2IPoFXP7CFvq1blPVc1adUBBRdfdz7SJ9J\nVJr0Hdzpvrzhkzfod9SyGcjmwOIZDGmI7mhwxTuqYCN1kOWpAY0gnzfV+n5p\nZxDGKLieCqCzmKc1TsSb/aUtWndUmcs8UsUZI5mjqSTajcqRSX11Fillmor8\nZVFzyKWhwEmDFRQlFRR3cTEbytvs55sqTdpWxaZDh7g8UrxdhUQIoI0SnQFO\n3pWaMCf+fM9SGY2JUlMLhr6n3ui5OBqkgjfw5AUtld405fyNbPQlJu7QxATo\nMU7npmYHcoinMOpciVD/tLNxD+OQKyOZ/NlL+XXBdCWQhLIuF+Rnb+raUiSC\nw8q8W5Vba/JN9/pHs8x+3P1eZFIM+cxMQk9RYFuEqtHkGhDiVthpyMsK5h0K\n2Nu7nLBVsnEEid9UggwPep2ua1JO5YETsAtwwo0RFuhRhs3I37eKloiI+NmJ\nCBASUczFiT2vE5ySGPHWMteTjL/5uUU+a+IZhqA/o2Wsmnw4Kxln5npF0kjg\njAQnn/t7QQcWhNGqsFnKEg2rv6cUgj9MoZdxHsyyyCnZ4qEBLByv83zOpigR\nfyxhFwV8uGKg1IZmeNQn+Kj/pBpifoUSbR4LGr54MVSuUrkjIdBv/sCLVC3c\n3vaz\r\n=T5IW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNOIFNJRe2jcKCXH4ICrcSvZnowa7w+vu8ftVn1ma0LAIgVov161AURGFLhlj5B6eSkke5RxOlmvY3avjHP8IvUTo="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# json-schema-traverse\nTraverse JSON Schema passing each schema object to callback\n\n[![build](https://github.com/epoberezkin/json-schema-traverse/workflows/build/badge.svg)](https://github.com/epoberezkin/json-schema-traverse/actions?query=workflow%3Abuild)\n[![npm](https://img.shields.io/npm/v/json-schema-traverse)](https://www.npmjs.com/package/json-schema-traverse)\n[![coverage](https://coveralls.io/repos/github/epoberezkin/json-schema-traverse/badge.svg?branch=master)](https://coveralls.io/github/epoberezkin/json-schema-traverse?branch=master)\n\n\n## Install\n\n```\nnpm install json-schema-traverse\n```\n\n\n## Usage\n\n```javascript\nconst traverse = require('json-schema-traverse');\nconst schema = {\n properties: {\n foo: {type: 'string'},\n bar: {type: 'integer'}\n }\n};\n\ntraverse(schema, {cb});\n// cb is called 3 times with:\n// 1. root schema\n// 2. {type: 'string'}\n// 3. {type: 'integer'}\n\n// Or:\n\ntraverse(schema, {cb: {pre, post}});\n// pre is called 3 times with:\n// 1. root schema\n// 2. {type: 'string'}\n// 3. {type: 'integer'}\n//\n// post is called 3 times with:\n// 1. {type: 'string'}\n// 2. {type: 'integer'}\n// 3. root schema\n\n```\n\nCallback function `cb` is called for each schema object (not including draft-06 boolean schemas), including the root schema, in pre-order traversal. Schema references ($ref) are not resolved, they are passed as is. Alternatively, you can pass a `{pre, post}` object as `cb`, and then `pre` will be called before traversing child elements, and `post` will be called after all child elements have been traversed.\n\nCallback is passed these parameters:\n\n- _schema_: the current schema object\n- _JSON pointer_: from the root schema to the current schema object\n- _root schema_: the schema passed to `traverse` object\n- _parent JSON pointer_: from the root schema to the parent schema object (see below)\n- _parent keyword_: the keyword inside which this schema appears (e.g. `properties`, `anyOf`, etc.)\n- _parent schema_: not necessarily parent object/array; in the example above the parent schema for `{type: 'string'}` is the root schema\n- _index/property_: index or property name in the array/object containing multiple schemas; in the example above for `{type: 'string'}` the property name is `'foo'`\n\n\n## Traverse objects in all unknown keywords\n\n```javascript\nconst traverse = require('json-schema-traverse');\nconst schema = {\n mySchema: {\n minimum: 1,\n maximum: 2\n }\n};\n\ntraverse(schema, {allKeys: true, cb});\n// cb is called 2 times with:\n// 1. root schema\n// 2. mySchema\n```\n\nWithout option `allKeys: true` callback will be called only with root schema.\n\n\n## Enterprise support\n\njson-schema-traverse package is a part of [Tidelift enterprise subscription](https://tidelift.com/subscription/pkg/npm-json-schema-traverse?utm_source=npm-json-schema-traverse&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - it provides a centralised commercial support to open-source software users, in addition to the support provided by software maintainers.\n\n\n## Security contact\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerability via GitHub issues.\n\n\n## License\n\n[MIT](https://github.com/epoberezkin/json-schema-traverse/blob/master/LICENSE)\n","homepage":"https://github.com/epoberezkin/json-schema-traverse#readme","repository":{"type":"git","url":"git+https://github.com/epoberezkin/json-schema-traverse.git"},"author":{"name":"Evgeny Poberezkin"},"bugs":{"url":"https://github.com/epoberezkin/json-schema-traverse/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "json-schema-traverse",
+ "description": "Traverse JSON Schema passing each schema object to callback",
+ "dist-tags": {
+ "latest": "1.0.0"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "json-schema-traverse",
+ "version": "1.0.0",
+ "description": "Traverse JSON Schema passing each schema object to callback",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "scripts": {
+ "eslint": "eslint index.js spec",
+ "test-spec": "mocha spec -R spec",
+ "test": "npm run eslint && nyc npm run test-spec"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/epoberezkin/json-schema-traverse.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/epoberezkin/json-schema-traverse/issues"
+ },
+ "devDependencies": {
+ "eslint": "^7.3.1",
+ "mocha": "^8.0.1",
+ "nyc": "^15.0.0",
+ "pre-commit": "^1.2.2"
+ },
+ "nyc": {
+ "exclude": [
+ "**/spec/**",
+ "node_modules"
+ ],
+ "reporter": [
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "gitHead": "6b45983cd76270042cc79527da5c8972f13599ec",
+ "_id": "json-schema-traverse@1.0.0",
+ "_nodeVersion": "14.15.1",
+ "_npmVersion": "6.14.8",
+ "dist": {
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "shasum": "ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2",
+ "tarball": "http://localhost:4260/json-schema-traverse/json-schema-traverse-1.0.0.tgz",
+ "fileCount": 12,
+ "unpackedSize": 22220
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/epoberezkin/json-schema-traverse#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/epoberezkin/json-schema-traverse.git"
+ },
+ "author": {
+ "name": "Evgeny Poberezkin"
+ },
+ "bugs": {
+ "url": "https://github.com/epoberezkin/json-schema-traverse/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/jsonfile/registry.json b/tests/registry/npm/jsonfile/registry.json
index 3fcd3f444..1e4456393 100644
--- a/tests/registry/npm/jsonfile/registry.json
+++ b/tests/registry/npm/jsonfile/registry.json
@@ -1 +1,71 @@
-{"name":"jsonfile","description":"Easily read/write JSON files.","dist-tags":{"latest":"6.1.0"},"versions":{"6.1.0":{"name":"jsonfile","version":"6.1.0","description":"Easily read/write JSON files.","repository":{"type":"git","url":"git+ssh://git@github.com/jprichardson/node-jsonfile.git"},"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"license":"MIT","dependencies":{"universalify":"^2.0.0","graceful-fs":"^4.1.6"},"optionalDependencies":{"graceful-fs":"^4.1.6"},"devDependencies":{"mocha":"^8.2.0","rimraf":"^2.4.0","standard":"^16.0.1"},"main":"index.js","scripts":{"lint":"standard","test":"npm run lint && npm run unit","unit":"mocha"},"gitHead":"9c6478a85899a9318547a6e9514b0403166d8c5c","bugs":{"url":"https://github.com/jprichardson/node-jsonfile/issues"},"_id":"jsonfile@6.1.0","_nodeVersion":"14.10.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==","shasum":"bc55b2634793c679ec6403094eb13698a6ec0aae","tarball":"http://localhost:4260/jsonfile/jsonfile-6.1.0.tgz","fileCount":6,"unpackedSize":19750,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnZgpCRA9TVsSAnZWagAAyvEP/1U+F1C6bK4oaOU/aMsR\nTdH3fyS8nowKmwtBOmnm3rVCJMbj1CcWD0IVO4IVICu16+VUVhk6VyhVzqK4\nInLFo6tqQ9VSsCyFuOYH3+lDW1VvP8oUr7dA2uVPSp2WUFD4BUlYUBrlvHi+\n5TBqtXbmIVcoAYcynAfLYKHD20f+NwLoJr2CvTh1+1nl2TxCePA4EZ5BBF3g\nzc2MlrlihyWHGRD22qASr7Io0SeblavZvb+HCTiHkKu4NqxWY+bfqfX4mLh4\n1vhDw3lHy2SUi/7jfKM9VAx9r+jfxm3nJs9SJFs+cKap7q1n7a7ilWZ1H7tJ\nkdjMtBjynibaF8EP8Emdx2tXOBxCz7YWqEBxssDpokT5/Y8e/YPRfFODvepn\nsAxudDQ1SCnm9GtomOymm5Di3g4xB1Eeb2d5NvWFxB4Pd/DhjeyGg0/dRLhY\nu7Ue9nY0Z0WV7LbkUzx7bWlIkRk+qhTh9SbarhWj7Ym4b6mgfPeEPQbtPz7o\nqHw4OJcdwvf/kXuAz5gKCjPjKwTHetylhzTA1Zx9b++JNDAj5Y1fcWStQj/Y\nuJoe4ZhSS2WgtG1o4Y9zuAlDInF1cb5pGojHuKpaZHUj1Vy1CB2m/evsA+yb\npum19tfmbP7xAz1MF4HFmbXAK/XBSN2J/xSxIsZnUnTzThcHQAEkDTNUQ6p5\nQPym\r\n=h240\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQVRI3EQyvWuTYfa6DQPlNoAI/usb6HNnGplMg437AJwIhAI4YR6cC9kPQGesWlO/LAnCo//eyfDm9MrVNXwfrH6Lf"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"Node.js - jsonfile\n================\n\nEasily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._\n\n[![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile)\n[![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile)\n[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-jsonfile/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master)\n\n<a href=\"https://github.com/feross/standard\"><img src=\"https://cdn.rawgit.com/feross/standard/master/sticker.svg\" alt=\"Standard JavaScript\" width=\"100\"></a>\n\nWhy?\n----\n\nWriting `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying.\n\n\n\nInstallation\n------------\n\n npm install --save jsonfile\n\n\n\nAPI\n---\n\n* [`readFile(filename, [options], callback)`](#readfilefilename-options-callback)\n* [`readFileSync(filename, [options])`](#readfilesyncfilename-options)\n* [`writeFile(filename, obj, [options], callback)`](#writefilefilename-obj-options-callback)\n* [`writeFileSync(filename, obj, [options])`](#writefilesyncfilename-obj-options)\n\n----\n\n### readFile(filename, [options], callback)\n\n`options` (`object`, default `undefined`): Pass in any [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).\n - `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback.\n If `false`, returns `null` for the object.\n\n\n```js\nconst jsonfile = require('jsonfile')\nconst file = '/tmp/data.json'\njsonfile.readFile(file, function (err, obj) {\n if (err) console.error(err)\n console.dir(obj)\n})\n```\n\nYou can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function.\n\n```js\nconst jsonfile = require('jsonfile')\nconst file = '/tmp/data.json'\njsonfile.readFile(file)\n .then(obj => console.dir(obj))\n .catch(error => console.error(error))\n```\n\n----\n\n### readFileSync(filename, [options])\n\n`options` (`object`, default `undefined`): Pass in any [`fs.readFileSync`](https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).\n- `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object.\n\n```js\nconst jsonfile = require('jsonfile')\nconst file = '/tmp/data.json'\n\nconsole.dir(jsonfile.readFileSync(file))\n```\n\n----\n\n### writeFile(filename, obj, [options], callback)\n\n`options`: Pass in any [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.\n\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj, function (err) {\n if (err) console.error(err)\n})\n```\nOr use with promises as follows:\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj)\n .then(res => {\n console.log('Write complete')\n })\n .catch(error => console.error(error))\n```\n\n\n**formatting with spaces:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj, { spaces: 2 }, function (err) {\n if (err) console.error(err)\n})\n```\n\n**overriding EOL:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj, { spaces: 2, EOL: '\\r\\n' }, function (err) {\n if (err) console.error(err)\n})\n```\n\n\n**disabling the EOL at the end of file:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj, { spaces: 2, finalEOL: false }, function (err) {\n if (err) console.log(err)\n})\n```\n\n**appending to an existing JSON file:**\n\nYou can use `fs.writeFile` option `{ flag: 'a' }` to achieve this.\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/mayAlreadyExistedData.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFile(file, obj, { flag: 'a' }, function (err) {\n if (err) console.error(err)\n})\n```\n\n----\n\n### writeFileSync(filename, obj, [options])\n\n`options`: Pass in any [`fs.writeFileSync`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFileSync(file, obj)\n```\n\n**formatting with spaces:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFileSync(file, obj, { spaces: 2 })\n```\n\n**overriding EOL:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\\r\\n' })\n```\n\n**disabling the EOL at the end of file:**\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/data.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFileSync(file, obj, { spaces: 2, finalEOL: false })\n```\n\n**appending to an existing JSON file:**\n\nYou can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this.\n\n```js\nconst jsonfile = require('jsonfile')\n\nconst file = '/tmp/mayAlreadyExistedData.json'\nconst obj = { name: 'JP' }\n\njsonfile.writeFileSync(file, obj, { flag: 'a' })\n```\n\nLicense\n-------\n\n(MIT License)\n\nCopyright 2012-2016, JP Richardson <jprichardson@gmail.com>\n","author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/jprichardson/node-jsonfile.git"},"homepage":"https://github.com/jprichardson/node-jsonfile#readme","bugs":{"url":"https://github.com/jprichardson/node-jsonfile/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "jsonfile",
+ "description": "Easily read/write JSON files.",
+ "dist-tags": {
+ "latest": "6.1.0"
+ },
+ "versions": {
+ "6.1.0": {
+ "name": "jsonfile",
+ "version": "6.1.0",
+ "description": "Easily read/write JSON files.",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/jprichardson/node-jsonfile.git"
+ },
+ "author": {
+ "name": "JP Richardson",
+ "email": "jprichardson@gmail.com"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0",
+ "graceful-fs": "^4.1.6"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ },
+ "devDependencies": {
+ "mocha": "^8.2.0",
+ "rimraf": "^2.4.0",
+ "standard": "^16.0.1"
+ },
+ "main": "index.js",
+ "scripts": {
+ "lint": "standard",
+ "test": "npm run lint && npm run unit",
+ "unit": "mocha"
+ },
+ "gitHead": "9c6478a85899a9318547a6e9514b0403166d8c5c",
+ "bugs": {
+ "url": "https://github.com/jprichardson/node-jsonfile/issues"
+ },
+ "_id": "jsonfile@6.1.0",
+ "_nodeVersion": "14.10.1",
+ "_npmVersion": "6.14.8",
+ "dist": {
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "shasum": "bc55b2634793c679ec6403094eb13698a6ec0aae",
+ "tarball": "http://localhost:4260/jsonfile/jsonfile-6.1.0.tgz",
+ "fileCount": 6,
+ "unpackedSize": 19750
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "JP Richardson",
+ "email": "jprichardson@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/jprichardson/node-jsonfile.git"
+ },
+ "homepage": "https://github.com/jprichardson/node-jsonfile#readme",
+ "bugs": {
+ "url": "https://github.com/jprichardson/node-jsonfile/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/locate-path/registry.json b/tests/registry/npm/locate-path/registry.json
index b01269277..f090b7a1d 100644
--- a/tests/registry/npm/locate-path/registry.json
+++ b/tests/registry/npm/locate-path/registry.json
@@ -1 +1,69 @@
-{"name":"locate-path","description":"Get the first path that exists on disk of multiple paths","dist-tags":{"latest":"5.0.0"},"versions":{"5.0.0":{"name":"locate-path","version":"5.0.0","description":"Get the first path that exists on disk of multiple paths","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/locate-path.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"p-locate":"^4.1.0"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"630c0bbd609055c1895089c715649e21000a1ab7","bugs":{"url":"https://github.com/sindresorhus/locate-path/issues"},"_id":"locate-path@5.0.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==","shasum":"1afba396afd676a6d42504d0a67a3a7eb9f62aa0","tarball":"http://localhost:4260/locate-path/locate-path-5.0.0.tgz","fileCount":5,"unpackedSize":6584,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJczYzYCRA9TVsSAnZWagAAoH4QAJ55Du9nat4GZgsgC/+d\nU8skY+UkpMg7sYrxcLFg7iL/6DUrc1QcavNPbQxANFOubfMvadGmSOZjiZeD\nMY2Sf+01Odcj6kW+hpzO3X03by1zzggXvuX4Wzw2L+XPK9yd2zhQViblkr27\nJzp68UqKwEpq4tQtld0nS31cxEe4Rqjeh7i4f1sDJBxix2CEglgX2/HcnAcU\n/SELUZtunAgRBBIons8FdjL2VOhcesPD2fh8ebBpoSmojDUgzlGIWagsmO6X\nYn0ftdcv77ILQBDitLjPWTGK1riAvfJkSOlK2J0LEFLR//yQByICmvPzXr0x\nZom6AYCdhUy5PJkaPuxEMuKJo5DrXuV+cKN9z4Ek5kumOl4H4sR+viKC+/b4\nX96Vxt0eZfT2nERjA31raJtQQVjyJUrt3QZRhf3CUItMDqE0s6+R2abAzUoA\nmF+dIzizSSZKdfy6/sVVcht4ZyxkgMSBtN6q4Pw/aNUDJEWYfqUZ1b9ucMif\nwLpP2MIH6GLQhKoFymqZx7jWzqGduKX25vS9RLZh6keyF3sZMQ618qfbX5cv\n0PJqf/YOx9N+PUeSW+Eu+JFlXlGvpZV4gLlTIlNIRsyHHavLWpw58q9fuLGy\nqFn1eegD45ITp3WdCCqRT+FTrQwomNcnLoN1ESw/fpJVWRG81RWGwaEj43NO\ntmj8\r\n=qQUv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF++mOopsOXeFIQqhPvLx8mgWBCx8VcO2mxuq6Fwv2/dAiEA2AG4MBpSq944pjJqxWTDhoYUIEgjI4nWP7GEtqc4OIY="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# locate-path\n\n> Get the first path that exists on disk of multiple paths\n\n## Install\n\n```\n$ npm install locate-path\n```\n\n## Usage\n\nHere we find the first file that exists on disk, in array order.\n\n```js\nimport {locatePath} from 'locate-path';\n\nconst files = [\n\t'unicorn.png',\n\t'rainbow.png', // Only this one actually exists on disk\n\t'pony.png'\n];\n\nconsole(await locatePath(files));\n//=> 'rainbow'\n```\n\n## API\n\n### locatePath(paths, options?)\n\nReturns a `Promise<string>` for the first path that exists or `undefined` if none exists.\n\n#### paths\n\nType: `Iterable<string>`\n\nThe paths to check.\n\n#### options\n\nType: `object`\n\n##### concurrency\n\nType: `number`\\\nDefault: `Infinity`\\\nMinimum: `1`\n\nThe number of concurrently pending promises.\n\n##### preserveOrder\n\nType: `boolean`\\\nDefault: `true`\n\nPreserve `paths` order when searching.\n\nDisable this to improve performance if you don't care about the order.\n\n##### cwd\n\nType: `URL | string`\\\nDefault: `process.cwd()`\n\nThe current working directory.\n\n##### type\n\nType: `string`\\\nDefault: `'file'`\\\nValues: `'file' | 'directory'`\n\nThe type of paths that can match.\n\n##### allowSymlinks\n\nType: `boolean`\\\nDefault: `true`\n\nAllow symbolic links to match if they point to the chosen path type.\n\n### locatePathSync(paths, options?)\n\nReturns the first path that exists or `undefined` if none exists.\n\n#### paths\n\nType: `Iterable<string>`\n\nThe paths to check.\n\n#### options\n\nType: `object`\n\n##### cwd\n\nSame as above.\n\n##### type\n\nSame as above.\n\n##### allowSymlinks\n\nSame as above.\n\n## Related\n\n- [path-exists](https://github.com/sindresorhus/path-exists) - Check if a path exists\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-locate-path?utm_source=npm-locate-path&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/locate-path#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/locate-path.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/locate-path/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "locate-path",
+ "description": "Get the first path that exists on disk of multiple paths",
+ "dist-tags": {
+ "latest": "5.0.0"
+ },
+ "versions": {
+ "5.0.0": {
+ "name": "locate-path",
+ "version": "5.0.0",
+ "description": "Get the first path that exists on disk of multiple paths",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/locate-path.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "630c0bbd609055c1895089c715649e21000a1ab7",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/locate-path/issues"
+ },
+ "_id": "locate-path@5.0.0",
+ "_nodeVersion": "8.16.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "shasum": "1afba396afd676a6d42504d0a67a3a7eb9f62aa0",
+ "tarball": "http://localhost:4260/locate-path/locate-path-5.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 6584
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/locate-path#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/locate-path.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/locate-path/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/loose-envify/registry.json b/tests/registry/npm/loose-envify/registry.json
index 40f63485f..21f63716a 100644
--- a/tests/registry/npm/loose-envify/registry.json
+++ b/tests/registry/npm/loose-envify/registry.json
@@ -1 +1,68 @@
-{"name":"loose-envify","description":"Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST","dist-tags":{"latest":"1.4.0"},"versions":{"1.4.0":{"name":"loose-envify","version":"1.4.0","description":"Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST","license":"MIT","author":{"name":"Andres Suarez","email":"zertosh@gmail.com"},"main":"index.js","bin":{"loose-envify":"cli.js"},"repository":{"type":"git","url":"git://github.com/zertosh/loose-envify.git"},"scripts":{"test":"tap test/*.js"},"dependencies":{"js-tokens":"^3.0.0 || ^4.0.0"},"devDependencies":{"browserify":"^13.1.1","envify":"^3.4.0","tap":"^8.0.0"},"gitHead":"a8fdd02e3a435195f526053882d64537d627b3e6","bugs":{"url":"https://github.com/zertosh/loose-envify/issues"},"_id":"loose-envify@1.4.0","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","dist":{"integrity":"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==","shasum":"71ee51fa7be4caec1a63839f7e682d8132d30caf","tarball":"http://localhost:4260/loose-envify/loose-envify-1.4.0.tgz","fileCount":8,"unpackedSize":5814,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRJP5CRA9TVsSAnZWagAAQQ4P+wRneDh61dzk3uPX6QCb\nZ97i+VxSY74ti8gVGSCryXFkL8zPsjlBd1/yADnaS5y6InlHuHQZQ2820I3x\ngfSjlhCU9drbF8vXw7FSxIRQfFO5JvF7+L5M1mvsDVmz024M+97DQwFnRjo5\nCvSDVLC/HbnnTRX1Cfj9kQlDVS85RhLaDvYWendfUfivp++TwUizDUTS8nOu\nVIiwXygaef55bBmo+yNeQa+GmyAWET3jAaPl0MNBht6jtnMY9ZkgwXc03zaE\n0wRcOZbBfhUKk1VEk2TCN/TtN+AyktbI5rmyQXoHBGn3HjZntI/LjLmAw9dD\ndetTKPf1O2n8KLT/tGZjIRQjQWNbB51thQ4H3KsMBSfbIhdnZvFHmnDKilug\nIGjE4lKa4px0/ac+SBw6wQuZMy4I3xCbZd59qSpPB3IO0E+Qm+rhLdUiMDjf\n2y49xwMB7dixjRv7sLLqYwiSkXGkLp1N81drN7oNoZaLxOVCbJQKYoHwnsY4\ncoRc7W768FaKwZJPIWfZK2u2MAq5TL4v2+2laxAn25K5Qs6hh8rguSho7iPR\nZcaKA/maVJo8BGO+CEqvaysfUbnYZ06VOFnzG/TbLnLlmZUMMex95z8RloP8\n4kcoh3muuqd75sMUDURgjFCvXbQeORMZ3sa+G8h716pUVjvKLu5xNOF7qCN0\npadk\r\n=rcpJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtEQH8N9PyT4xrBOIczpbwwOu4sf2mIqw6XS4KIwV+WgIgQZ76hRyzJ94tUL0jNVJ8VyAx8MoCeb7p0qmyKQUEka8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# loose-envify\n\n[![Build Status](https://travis-ci.org/zertosh/loose-envify.svg?branch=master)](https://travis-ci.org/zertosh/loose-envify)\n\nFast (and loose) selective `process.env` replacer using [js-tokens](https://github.com/lydell/js-tokens) instead of an AST. Works just like [envify](https://github.com/hughsk/envify) but much faster.\n\n## Gotchas\n\n* Doesn't handle broken syntax.\n* Doesn't look inside embedded expressions in template strings.\n - **this won't work:**\n ```js\n console.log(`the current env is ${process.env.NODE_ENV}`);\n ```\n* Doesn't replace oddly-spaced or oddly-commented expressions.\n - **this won't work:**\n ```js\n console.log(process./*won't*/env./*work*/NODE_ENV);\n ```\n\n## Usage/Options\n\nloose-envify has the exact same interface as [envify](https://github.com/hughsk/envify), including the CLI.\n\n## Benchmark\n\n```\nenvify:\n\n $ for i in {1..5}; do node bench/bench.js 'envify'; done\n 708ms\n 727ms\n 791ms\n 719ms\n 720ms\n\nloose-envify:\n\n $ for i in {1..5}; do node bench/bench.js '../'; done\n 51ms\n 52ms\n 52ms\n 52ms\n 52ms\n```\n","homepage":"https://github.com/zertosh/loose-envify","repository":{"type":"git","url":"git://github.com/zertosh/loose-envify.git"},"author":{"name":"Andres Suarez","email":"zertosh@gmail.com"},"bugs":{"url":"https://github.com/zertosh/loose-envify/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "loose-envify",
+ "description": "Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST",
+ "dist-tags": {
+ "latest": "1.4.0"
+ },
+ "versions": {
+ "1.4.0": {
+ "name": "loose-envify",
+ "version": "1.4.0",
+ "description": "Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST",
+ "license": "MIT",
+ "author": {
+ "name": "Andres Suarez",
+ "email": "zertosh@gmail.com"
+ },
+ "main": "index.js",
+ "bin": {
+ "loose-envify": "cli.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/zertosh/loose-envify.git"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "devDependencies": {
+ "browserify": "^13.1.1",
+ "envify": "^3.4.0",
+ "tap": "^8.0.0"
+ },
+ "gitHead": "a8fdd02e3a435195f526053882d64537d627b3e6",
+ "bugs": {
+ "url": "https://github.com/zertosh/loose-envify/issues"
+ },
+ "_id": "loose-envify@1.4.0",
+ "_npmVersion": "6.1.0",
+ "_nodeVersion": "10.6.0",
+ "dist": {
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "shasum": "71ee51fa7be4caec1a63839f7e682d8132d30caf",
+ "tarball": "http://localhost:4260/loose-envify/loose-envify-1.4.0.tgz",
+ "fileCount": 8,
+ "unpackedSize": 5814
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/zertosh/loose-envify",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/zertosh/loose-envify.git"
+ },
+ "author": {
+ "name": "Andres Suarez",
+ "email": "zertosh@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/zertosh/loose-envify/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/loupe/registry.json b/tests/registry/npm/loupe/registry.json
index 39505eb23..56f8e5223 100644
--- a/tests/registry/npm/loupe/registry.json
+++ b/tests/registry/npm/loupe/registry.json
@@ -1 +1,174 @@
-{"name":"loupe","description":"Inspect utility for Node.js and browsers","dist-tags":{"latest":"2.3.4"},"versions":{"2.3.4":{"name":"loupe","version":"2.3.4","description":"Inspect utility for Node.js and browsers","license":"MIT","author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"main":"./loupe.js","module":"./index.js","browser":{"./index.js":"./loupe.js","util":false},"repository":{"type":"git","url":"git+https://github.com/chaijs/loupe.git"},"scripts":{"bench":"node -r esm bench","commit-msg":"commitlint -x angular","lint":"eslint --ignore-path .gitignore .","prepare":"rollup -c rollup.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post","test":"npm run test:node && npm run test:browser","pretest:browser":"npm run prepare","test:browser":"karma start --singleRun=true","posttest:browser":"npm run upload-coverage","test:node":"nyc mocha -r esm","posttest:node":"nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage","upload-coverage":"codecov"},"eslintConfig":{"root":true,"parserOptions":{"ecmaVersion":2020},"env":{"es6":true},"plugins":["filenames","prettier"],"extends":["strict/es6"],"rules":{"comma-dangle":"off","func-style":"off","no-magic-numbers":"off","class-methods-use-this":"off","array-bracket-spacing":"off","array-element-newline":"off","space-before-function-paren":"off","arrow-parens":"off","template-curly-spacing":"off","quotes":"off","generator-star-spacing":"off","prefer-destructuring":"off","no-mixed-operators":"off","id-blacklist":"off","curly":"off","semi":["error","never"],"prettier/prettier":["error",{"printWidth":120,"tabWidth":2,"useTabs":false,"semi":false,"singleQuote":true,"trailingComma":"es5","arrowParens":"avoid","bracketSpacing":true}]}},"prettier":{"printWidth":120,"tabWidth":2,"useTabs":false,"semi":false,"singleQuote":true,"trailingComma":"es5","arrowParens":"avoid","bracketSpacing":true},"dependencies":{"get-func-name":"^2.0.0"},"devDependencies":{"@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","@commitlint/cli":"^11.0.0","@rollup/plugin-commonjs":"^17.0.0","@rollup/plugin-node-resolve":"^11.1.0","benchmark":"^2.1.4","chai":"^4.2.0","codecov":"^3.8.1","commitlint-config-angular":"^11.0.0","core-js":"^3.8.3","cross-env":"^7.0.3","eslint":"^7.18.0","eslint-config-strict":"^14.0.1","eslint-plugin-filenames":"^1.3.2","eslint-plugin-prettier":"^3.3.1","esm":"^3.2.25","husky":"^4.3.8","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-coverage":"^2.0.3","karma-edge-launcher":"^0.4.2","karma-firefox-launcher":"^2.1.0","karma-ie-launcher":"^1.0.0","karma-mocha":"^2.0.1","karma-opera-launcher":"^1.0.0","karma-safari-launcher":"^1.0.0","karma-safaritechpreview-launcher":"^2.0.2","karma-sauce-launcher":"^4.3.4","mocha":"^8.2.1","nyc":"^15.1.0","prettier":"^2.2.1","rollup":"^2.37.1","rollup-plugin-babel":"^4.4.0","rollup-plugin-istanbul":"^3.0.0","semantic-release":"^17.3.6","simple-assert":"^1.0.0"},"gitHead":"b4ee644cedc7d394d979d043da568a999c8a59b1","bugs":{"url":"https://github.com/chaijs/loupe/issues"},"_id":"loupe@2.3.4","_nodeVersion":"12.22.10","_npmVersion":"6.14.3","dist":{"integrity":"sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==","shasum":"7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3","tarball":"http://localhost:4260/loupe/loupe-2.3.4.tgz","fileCount":24,"unpackedSize":56060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiBSvXCRA9TVsSAnZWagAA5GMQAJNuCRvAOABV3NaJwrSn\no46XwR3XBgbKgQUgNqjdZVytQrG7W0N2fFIJEsxrLh8FmV7NewVwZDmUW5ug\nzUDWqnJ8YubHw2+W4b0EJM39nU8iUwR5Gmt5dbbOCGu1QMfVhugBpxFfPr/Y\nkZZ3JToYqjZ523+gL2pollIHMMzJ87o9gRZtWRdiIk9anNHgmhZlB2tPflQ+\ndHSEwpOAHZEWZSNVRoBvFVPagpFqfLP6oiuO1qd8j9xkEu5OHui1A7fUFoiR\nZACUVy1hpSnAM9JjVoUa2saEHWlgprMiww4t7x2eR4x5bB2IYVbN1BAJGYhB\nmzMYJpVT6f0WcNHY82IvKgEZ8bpCxjrYHSLJLf3gP0PYGkkGy4MjtvNmLYIn\n0+ORkJpS94XwS0+RLRkc3mET9Fc7v5tTJVcf+7PGBoLoFJFMq70i3ufhT/+p\nrNlR3CKOImKCaVo4R58uw/zwikkDJEFq+DZtWsq8pJqMuvSTAQl6UEtdKXlw\nDPm+Nx0yXf641CvpUZJ7Ea8QxoOiNRZxzidXqI0rXWZYmTsS8+rvCIgNuSd3\nXhWJtZGG2yY8HSHMFUPY/GVV9Dh1fFL3ZwYLLa/3FhmOY32zlOOBqCQ1onQl\nRbjsDEsUJCgQ5c+vHCncEc+NADSrqNlicMw/SFqeAvbR9S+ZtX+83kw5sq5M\nyuWX\r\n=GAB5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCA3CaA1BAoAU59PGrhQpQxolxvBV2eSQKCoXmsGHPwpgIhAN2osnbK131i8NkfxAmYsFocDdtZxp62muOWECWapmSg"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"![npm](https://img.shields.io/npm/v/loupe?logo=npm)\n![Build](https://github.com/chaijs/loupe/workflows/Build/badge.svg?branch=master)\n![Codecov branch](https://img.shields.io/codecov/c/github/chaijs/loupe/master?logo=codecov)\n\n# What is loupe?\n\nLoupe turns the object you give it into a string. It's similar to Node.js' `util.inspect()` function, but it works cross platform, in most modern browsers as well as Node.\n\n## Installation\n\n### Node.js\n\n`loupe` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install loupe\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `loupe.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/loupe/loupe.js\"></script>\n```\n\n## Usage\n\n``` js\nconst { inspect } = require('loupe');\n```\n\n```js\ninspect({ foo: 'bar' }); // => \"{ foo: 'bar' }\"\ninspect(1); // => '1'\ninspect('foo'); // => \"'foo'\"\ninspect([ 1, 2, 3 ]); // => '[ 1, 2, 3 ]'\ninspect(/Test/g); // => '/Test/g'\n\n// ...\n```\n\n## Tests\n\n```bash\n$ npm test\n```\n\nCoverage:\n\n```bash\n$ npm run upload-coverage\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"repository":{"type":"git","url":"git+https://github.com/chaijs/loupe.git"},"homepage":"https://github.com/chaijs/loupe","bugs":{"url":"https://github.com/chaijs/loupe/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "loupe",
+ "description": "Inspect utility for Node.js and browsers",
+ "dist-tags": {
+ "latest": "2.3.4"
+ },
+ "versions": {
+ "2.3.4": {
+ "name": "loupe",
+ "version": "2.3.4",
+ "description": "Inspect utility for Node.js and browsers",
+ "license": "MIT",
+ "author": {
+ "name": "Veselin Todorov",
+ "email": "hi@vesln.com"
+ },
+ "main": "./loupe.js",
+ "module": "./index.js",
+ "browser": {
+ "./index.js": "./loupe.js",
+ "util": false
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chaijs/loupe.git"
+ },
+ "scripts": {
+ "bench": "node -r esm bench",
+ "commit-msg": "commitlint -x angular",
+ "lint": "eslint --ignore-path .gitignore .",
+ "prepare": "rollup -c rollup.conf.js",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "test": "npm run test:node && npm run test:browser",
+ "pretest:browser": "npm run prepare",
+ "test:browser": "karma start --singleRun=true",
+ "posttest:browser": "npm run upload-coverage",
+ "test:node": "nyc mocha -r esm",
+ "posttest:node": "nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage",
+ "upload-coverage": "codecov"
+ },
+ "eslintConfig": {
+ "root": true,
+ "parserOptions": {
+ "ecmaVersion": 2020
+ },
+ "env": {
+ "es6": true
+ },
+ "plugins": [
+ "filenames",
+ "prettier"
+ ],
+ "extends": [
+ "strict/es6"
+ ],
+ "rules": {
+ "comma-dangle": "off",
+ "func-style": "off",
+ "no-magic-numbers": "off",
+ "class-methods-use-this": "off",
+ "array-bracket-spacing": "off",
+ "array-element-newline": "off",
+ "space-before-function-paren": "off",
+ "arrow-parens": "off",
+ "template-curly-spacing": "off",
+ "quotes": "off",
+ "generator-star-spacing": "off",
+ "prefer-destructuring": "off",
+ "no-mixed-operators": "off",
+ "id-blacklist": "off",
+ "curly": "off",
+ "semi": [
+ "error",
+ "never"
+ ],
+ "prettier/prettier": [
+ "error",
+ {
+ "printWidth": 120,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "arrowParens": "avoid",
+ "bracketSpacing": true
+ }
+ ]
+ }
+ },
+ "prettier": {
+ "printWidth": 120,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "arrowParens": "avoid",
+ "bracketSpacing": true
+ },
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.10",
+ "@babel/preset-env": "^7.12.11",
+ "@commitlint/cli": "^11.0.0",
+ "@rollup/plugin-commonjs": "^17.0.0",
+ "@rollup/plugin-node-resolve": "^11.1.0",
+ "benchmark": "^2.1.4",
+ "chai": "^4.2.0",
+ "codecov": "^3.8.1",
+ "commitlint-config-angular": "^11.0.0",
+ "core-js": "^3.8.3",
+ "cross-env": "^7.0.3",
+ "eslint": "^7.18.0",
+ "eslint-config-strict": "^14.0.1",
+ "eslint-plugin-filenames": "^1.3.2",
+ "eslint-plugin-prettier": "^3.3.1",
+ "esm": "^3.2.25",
+ "husky": "^4.3.8",
+ "karma": "^5.2.3",
+ "karma-chrome-launcher": "^3.1.0",
+ "karma-coverage": "^2.0.3",
+ "karma-edge-launcher": "^0.4.2",
+ "karma-firefox-launcher": "^2.1.0",
+ "karma-ie-launcher": "^1.0.0",
+ "karma-mocha": "^2.0.1",
+ "karma-opera-launcher": "^1.0.0",
+ "karma-safari-launcher": "^1.0.0",
+ "karma-safaritechpreview-launcher": "^2.0.2",
+ "karma-sauce-launcher": "^4.3.4",
+ "mocha": "^8.2.1",
+ "nyc": "^15.1.0",
+ "prettier": "^2.2.1",
+ "rollup": "^2.37.1",
+ "rollup-plugin-babel": "^4.4.0",
+ "rollup-plugin-istanbul": "^3.0.0",
+ "semantic-release": "^17.3.6",
+ "simple-assert": "^1.0.0"
+ },
+ "gitHead": "b4ee644cedc7d394d979d043da568a999c8a59b1",
+ "bugs": {
+ "url": "https://github.com/chaijs/loupe/issues"
+ },
+ "_id": "loupe@2.3.4",
+ "_nodeVersion": "12.22.10",
+ "_npmVersion": "6.14.3",
+ "dist": {
+ "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==",
+ "shasum": "7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3",
+ "tarball": "http://localhost:4260/loupe/loupe-2.3.4.tgz",
+ "fileCount": 24,
+ "unpackedSize": 56060
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Veselin Todorov",
+ "email": "hi@vesln.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chaijs/loupe.git"
+ },
+ "homepage": "https://github.com/chaijs/loupe",
+ "bugs": {
+ "url": "https://github.com/chaijs/loupe/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/lru-cache/registry.json b/tests/registry/npm/lru-cache/registry.json
index 35f34e5b7..d6b1734ed 100644
--- a/tests/registry/npm/lru-cache/registry.json
+++ b/tests/registry/npm/lru-cache/registry.json
@@ -1 +1,150 @@
-{"name":"lru-cache","dist-tags":{"latest":"10.4.1"},"versions":{"10.4.1":{"name":"lru-cache","version":"10.4.1","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"ISC","_id":"lru-cache@10.4.1","bugs":{"url":"https://github.com/isaacs/node-lru-cache/issues"},"tap":{"plugin":["@tapjs/clock"],"node-arg":["--expose-gc"]},"dist":{"shasum":"da9a9cb51aec89fda9b485f5a12b2fdb8f6dbe88","tarball":"http://localhost:4260/lru-cache/lru-cache-10.4.1.tgz","fileCount":17,"integrity":"sha512-8h/JsUc/2+Dm9RPJnBAmObGnUqTMmsIKThxixMLOkrebSihRhTV0wLD/8BSk6OU6Pbj8hiDTbsI3fLjBJSlhDg==","signatures":[{"sig":"MEYCIQDkwiQ89aPHlodZcENNaXDb9s7djMsMBGUnP8WZo+3f5AIhAOzrtCRKJTa/sXN6+cNzzPPDs/Spgn21ZAPm7QIZiRHk","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":804340},"main":"./dist/commonjs/index.js","tshy":{"exports":{".":"./src/index.ts","./min":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}}}},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":"14 >= 14.21 || 16 >= 16.20 || 18 >=18.20 || 20 || >=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./min":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}}},"gitHead":"e01135c4270941ac54d00a6b96eefdca31f3a6f6","scripts":{"snap":"tap","test":"tap","build":"npm run prepare","format":"prettier --write .","prepare":"tshy && bash fixup.sh","presnap":"npm run prepare","pretest":"npm run prepare","profile":"make -C benchmark profile","typedoc":"typedoc --tsconfig ./.tshy/esm.json ./src/*.ts","benchmark":"make -C benchmark","preprofile":"npm run prepare","preversion":"npm test","postversion":"npm publish","prebenchmark":"npm run prepare","prepublishOnly":"git push origin --follow-tags","benchmark-results-typedoc":"bash scripts/benchmark-results-typedoc.sh"},"prettier":{"semi":false,"useTabs":false,"tabWidth":2,"endOfLine":"lf","printWidth":70,"arrowParens":"avoid","singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true},"repository":{"url":"git://github.com/isaacs/node-lru-cache.git","type":"git"},"_npmVersion":"10.7.0","description":"A cache object that deletes the least-recently-used items.","directories":{},"sideEffects":false,"_nodeVersion":"20.13.1","_hasShrinkwrap":false,"devDependencies":{"tap":"^20.0.3","tshy":"^2.0.0","tslib":"^2.4.0","marked":"^4.2.12","mkdirp":"^2.1.5","esbuild":"^0.17.11","typedoc":"^0.25.3","prettier":"^2.6.2","benchmark":"^2.1.4","@types/tap":"^15.0.6","typescript":"^5.2.2","@types/node":"^20.2.5","eslint-config-prettier":"^8.5.0"}}},"bugs":{"url":"https://github.com/isaacs/node-lru-cache/issues"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"ISC","homepage":"https://github.com/isaacs/node-lru-cache#readme","repository":{"type":"git","url":"git://github.com/isaacs/node-lru-cache.git"},"description":"A cache object that deletes the least-recently-used items.","readme":"# lru-cache\n\nA cache object that deletes the least-recently-used items.\n\nSpecify a max number of the most recently used items that you\nwant to keep, and this cache will keep that many of the most\nrecently accessed items.\n\nThis is not primarily a TTL cache, and does not make strong TTL\nguarantees. There is no preemptive pruning of expired items by\ndefault, but you _may_ set a TTL on the cache or on a single\n`set`. If you do so, it will treat expired items as missing, and\ndelete them when fetched. If you are more interested in TTL\ncaching than LRU caching, check out\n[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).\n\nAs of version 7, this is one of the most performant LRU\nimplementations available in JavaScript, and supports a wide\ndiversity of use cases. However, note that using some of the\nfeatures will necessarily impact performance, by causing the\ncache to have to do more work. See the \"Performance\" section\nbelow.\n\n## Installation\n\n```bash\nnpm install lru-cache --save\n```\n\n## Usage\n\n```js\n// hybrid module, either works\nimport { LRUCache } from 'lru-cache'\n// or:\nconst { LRUCache } = require('lru-cache')\n// or in minified form for web browsers:\nimport { LRUCache } from 'http://unpkg.com/lru-cache@9/dist/mjs/index.min.mjs'\n\n// At least one of 'max', 'ttl', or 'maxSize' is required, to prevent\n// unsafe unbounded storage.\n//\n// In most cases, it's best to specify a max for performance, so all\n// the required memory allocation is done up-front.\n//\n// All the other options are optional, see the sections below for\n// documentation on what each one does. Most of them can be\n// overridden for specific items in get()/set()\nconst options = {\n max: 500,\n\n // for use with tracking overall storage size\n maxSize: 5000,\n sizeCalculation: (value, key) => {\n return 1\n },\n\n // for use when you need to clean up something when objects\n // are evicted from the cache\n dispose: (value, key) => {\n freeFromMemoryOrWhatever(value)\n },\n\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n\n // return stale items before removing from cache?\n allowStale: false,\n\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n\n // async method to use for cache.fetch(), for\n // stale-while-revalidate type of behavior\n fetchMethod: async (\n key,\n staleValue,\n { options, signal, context }\n ) => {},\n}\n\nconst cache = new LRUCache(options)\n\ncache.set('key', 'value')\ncache.get('key') // \"value\"\n\n// non-string keys ARE fully supported\n// but note that it must be THE SAME object, not\n// just a JSON-equivalent object.\nvar someObject = { a: 1 }\ncache.set(someObject, 'a value')\n// Object keys are not toString()-ed\ncache.set('[object Object]', 'a different value')\nassert.equal(cache.get(someObject), 'a value')\n// A similar object with same keys/values won't work,\n// because it's a different object identity\nassert.equal(cache.get({ a: 1 }), undefined)\n\ncache.clear() // empty the cache\n```\n\nIf you put more stuff in the cache, then less recently used items\nwill fall out. That's what an LRU cache is.\n\nFor full description of the API and all options, please see [the\nLRUCache typedocs](https://isaacs.github.io/node-lru-cache/)\n\n## Storage Bounds Safety\n\nThis implementation aims to be as flexible as possible, within\nthe limits of safe memory consumption and optimal performance.\n\nAt initial object creation, storage is allocated for `max` items.\nIf `max` is set to zero, then some performance is lost, and item\ncount is unbounded. Either `maxSize` or `ttl` _must_ be set if\n`max` is not specified.\n\nIf `maxSize` is set, then this creates a safe limit on the\nmaximum storage consumed, but without the performance benefits of\npre-allocation. When `maxSize` is set, every item _must_ provide\na size, either via the `sizeCalculation` method provided to the\nconstructor, or via a `size` or `sizeCalculation` option provided\nto `cache.set()`. The size of every item _must_ be a positive\ninteger.\n\nIf neither `max` nor `maxSize` are set, then `ttl` tracking must\nbe enabled. Note that, even when tracking item `ttl`, items are\n_not_ preemptively deleted when they become stale, unless\n`ttlAutopurge` is enabled. Instead, they are only purged the\nnext time the key is requested. Thus, if `ttlAutopurge`, `max`,\nand `maxSize` are all not set, then the cache will potentially\ngrow unbounded.\n\nIn this case, a warning is printed to standard error. Future\nversions may require the use of `ttlAutopurge` if `max` and\n`maxSize` are not specified.\n\nIf you truly wish to use a cache that is bound _only_ by TTL\nexpiration, consider using a `Map` object, and calling\n`setTimeout` to delete entries when they expire. It will perform\nmuch better than an LRU cache.\n\nHere is an implementation you may use, under the same\n[license](./LICENSE) as this package:\n\n```js\n// a storage-unbounded ttl cache that is not an lru-cache\nconst cache = {\n data: new Map(),\n timers: new Map(),\n set: (k, v, ttl) => {\n if (cache.timers.has(k)) {\n clearTimeout(cache.timers.get(k))\n }\n cache.timers.set(\n k,\n setTimeout(() => cache.delete(k), ttl)\n )\n cache.data.set(k, v)\n },\n get: k => cache.data.get(k),\n has: k => cache.data.has(k),\n delete: k => {\n if (cache.timers.has(k)) {\n clearTimeout(cache.timers.get(k))\n }\n cache.timers.delete(k)\n return cache.data.delete(k)\n },\n clear: () => {\n cache.data.clear()\n for (const v of cache.timers.values()) {\n clearTimeout(v)\n }\n cache.timers.clear()\n },\n}\n```\n\nIf that isn't to your liking, check out\n[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).\n\n## Storing Undefined Values\n\nThis cache never stores undefined values, as `undefined` is used\ninternally in a few places to indicate that a key is not in the\ncache.\n\nYou may call `cache.set(key, undefined)`, but this is just\nan alias for `cache.delete(key)`. Note that this has the effect\nthat `cache.has(key)` will return _false_ after setting it to\nundefined.\n\n```js\ncache.set(myKey, undefined)\ncache.has(myKey) // false!\n```\n\nIf you need to track `undefined` values, and still note that the\nkey is in the cache, an easy workaround is to use a sigil object\nof your own.\n\n```js\nimport { LRUCache } from 'lru-cache'\nconst undefinedValue = Symbol('undefined')\nconst cache = new LRUCache(...)\nconst mySet = (key, value) =>\n cache.set(key, value === undefined ? undefinedValue : value)\nconst myGet = (key, value) => {\n const v = cache.get(key)\n return v === undefinedValue ? undefined : v\n}\n```\n\n## Performance\n\nAs of January 2022, version 7 of this library is one of the most\nperformant LRU cache implementations in JavaScript.\n\nBenchmarks can be extremely difficult to get right. In\nparticular, the performance of set/get/delete operations on\nobjects will vary _wildly_ depending on the type of key used. V8\nis highly optimized for objects with keys that are short strings,\nespecially integer numeric strings. Thus any benchmark which\ntests _solely_ using numbers as keys will tend to find that an\nobject-based approach performs the best.\n\nNote that coercing _anything_ to strings to use as object keys is\nunsafe, unless you can be 100% certain that no other type of\nvalue will be used. For example:\n\n```js\nconst myCache = {}\nconst set = (k, v) => (myCache[k] = v)\nconst get = k => myCache[k]\n\nset({}, 'please hang onto this for me')\nset('[object Object]', 'oopsie')\n```\n\nAlso beware of \"Just So\" stories regarding performance. Garbage\ncollection of large (especially: deep) object graphs can be\nincredibly costly, with several \"tipping points\" where it\nincreases exponentially. As a result, putting that off until\nlater can make it much worse, and less predictable. If a library\nperforms well, but only in a scenario where the object graph is\nkept shallow, then that won't help you if you are using large\nobjects as keys.\n\nIn general, when attempting to use a library to improve\nperformance (such as a cache like this one), it's best to choose\nan option that will perform well in the sorts of scenarios where\nyou'll actually use it.\n\nThis library is optimized for repeated gets and minimizing\neviction time, since that is the expected need of a LRU. Set\noperations are somewhat slower on average than a few other\noptions, in part because of that optimization. It is assumed\nthat you'll be caching some costly operation, ideally as rarely\nas possible, so optimizing set over get would be unwise.\n\nIf performance matters to you:\n\n1. If it's at all possible to use small integer values as keys,\n and you can guarantee that no other types of values will be\n used as keys, then do that, and use a cache such as\n [lru-fast](https://npmjs.com/package/lru-fast), or\n [mnemonist's\n LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache)\n which uses an Object as its data store.\n\n2. Failing that, if at all possible, use short non-numeric\n strings (ie, less than 256 characters) as your keys, and use\n [mnemonist's\n LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache).\n\n3. If the types of your keys will be anything else, especially\n long strings, strings that look like floats, objects, or some\n mix of types, or if you aren't sure, then this library will\n work well for you.\n\n If you do not need the features that this library provides\n (like asynchronous fetching, a variety of TTL staleness\n options, and so on), then [mnemonist's\n LRUMap](https://yomguithereal.github.io/mnemonist/lru-map) is\n a very good option, and just slightly faster than this module\n (since it does considerably less).\n\n4. Do not use a `dispose` function, size tracking, or especially\n ttl behavior, unless absolutely needed. These features are\n convenient, and necessary in some use cases, and every attempt\n has been made to make the performance impact minimal, but it\n isn't nothing.\n\n## Breaking Changes in Version 7\n\nThis library changed to a different algorithm and internal data\nstructure in version 7, yielding significantly better\nperformance, albeit with some subtle changes as a result.\n\nIf you were relying on the internals of LRUCache in version 6 or\nbefore, it probably will not work in version 7 and above.\n\n## Breaking Changes in Version 8\n\n- The `fetchContext` option was renamed to `context`, and may no\n longer be set on the cache instance itself.\n- Rewritten in TypeScript, so pretty much all the types moved\n around a lot.\n- The AbortController/AbortSignal polyfill was removed. For this\n reason, **Node version 16.14.0 or higher is now required**.\n- Internal properties were moved to actual private class\n properties.\n- Keys and values must not be `null` or `undefined`.\n- Minified export available at `'lru-cache/min'`, for both CJS\n and MJS builds.\n\n## Breaking Changes in Version 9\n\n- Named export only, no default export.\n- AbortController polyfill returned, albeit with a warning when\n used.\n\n## Breaking Changes in Version 10\n\n- `cache.fetch()` return type is now `Promise<V | undefined>`\n instead of `Promise<V | void>`. This is an irrelevant change\n practically speaking, but can require changes for TypeScript\n users.\n\nFor more info, see the [change log](CHANGELOG.md).\n","readmeFilename":"README.md"}
+{
+ "name": "lru-cache",
+ "dist-tags": {
+ "latest": "10.4.1"
+ },
+ "versions": {
+ "10.4.1": {
+ "name": "lru-cache",
+ "version": "10.4.1",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "ISC",
+ "_id": "lru-cache@10.4.1",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-lru-cache/issues"
+ },
+ "tap": {
+ "plugin": [
+ "@tapjs/clock"
+ ],
+ "node-arg": [
+ "--expose-gc"
+ ]
+ },
+ "dist": {
+ "shasum": "da9a9cb51aec89fda9b485f5a12b2fdb8f6dbe88",
+ "tarball": "http://localhost:4260/lru-cache/lru-cache-10.4.1.tgz",
+ "fileCount": 17,
+ "integrity": "sha512-8h/JsUc/2+Dm9RPJnBAmObGnUqTMmsIKThxixMLOkrebSihRhTV0wLD/8BSk6OU6Pbj8hiDTbsI3fLjBJSlhDg==",
+ "unpackedSize": 804340
+ },
+ "main": "./dist/commonjs/index.js",
+ "tshy": {
+ "exports": {
+ ".": "./src/index.ts",
+ "./min": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.min.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.min.js"
+ }
+ }
+ }
+ },
+ "type": "module",
+ "types": "./dist/commonjs/index.d.ts",
+ "module": "./dist/esm/index.js",
+ "engines": {
+ "node": "14 >= 14.21 || 16 >= 16.20 || 18 >=18.20 || 20 || >=22"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./min": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.min.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.min.js"
+ }
+ }
+ },
+ "gitHead": "e01135c4270941ac54d00a6b96eefdca31f3a6f6",
+ "scripts": {
+ "snap": "tap",
+ "test": "tap",
+ "build": "npm run prepare",
+ "format": "prettier --write .",
+ "prepare": "tshy && bash fixup.sh",
+ "presnap": "npm run prepare",
+ "pretest": "npm run prepare",
+ "profile": "make -C benchmark profile",
+ "typedoc": "typedoc --tsconfig ./.tshy/esm.json ./src/*.ts",
+ "benchmark": "make -C benchmark",
+ "preprofile": "npm run prepare",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prebenchmark": "npm run prepare",
+ "prepublishOnly": "git push origin --follow-tags",
+ "benchmark-results-typedoc": "bash scripts/benchmark-results-typedoc.sh"
+ },
+ "prettier": {
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "endOfLine": "lf",
+ "printWidth": 70,
+ "arrowParens": "avoid",
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true
+ },
+ "repository": {
+ "url": "git://github.com/isaacs/node-lru-cache.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "A cache object that deletes the least-recently-used items.",
+ "directories": {},
+ "sideEffects": false,
+ "_nodeVersion": "20.13.1",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^20.0.3",
+ "tshy": "^2.0.0",
+ "tslib": "^2.4.0",
+ "marked": "^4.2.12",
+ "mkdirp": "^2.1.5",
+ "esbuild": "^0.17.11",
+ "typedoc": "^0.25.3",
+ "prettier": "^2.6.2",
+ "benchmark": "^2.1.4",
+ "@types/tap": "^15.0.6",
+ "typescript": "^5.2.2",
+ "@types/node": "^20.2.5",
+ "eslint-config-prettier": "^8.5.0"
+ }
+ }
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/node-lru-cache/issues"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/isaacs/node-lru-cache#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-lru-cache.git"
+ },
+ "description": "A cache object that deletes the least-recently-used items.",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/lz-string/registry.json b/tests/registry/npm/lz-string/registry.json
index 950c7c34d..d7c4ed786 100644
--- a/tests/registry/npm/lz-string/registry.json
+++ b/tests/registry/npm/lz-string/registry.json
@@ -1 +1,106 @@
-{"name":"lz-string","description":"LZ-based compression algorithm","dist-tags":{"latest":"1.5.0"},"versions":{"1.3.6":{"name":"lz-string","version":"1.3.6","license":"WTFPL","description":"LZ-based compression algorithm","main":"libs/lz-string.js","bin":{"lz-string":"bin/bin.js"},"scripts":{},"dependencies":{},"devDependencies":{},"repository":{"type":"git","url":"https://github.com/pieroxy/lz-string.git"},"bugs":{"url":"https://github.com/pieroxy/lz-string/issues"},"directories":{"test":"tests"},"author":{"name":"pieroxy","email":"pieroxy@pieroxy.net"},"_id":"lz-string@1.3.6","dist":{"shasum":"cc91b00d3264b15402e428e76dfeb709193bc10f","tarball":"http://localhost:4260/lz-string/lz-string-1.3.6.tgz","integrity":"sha512-gIHN4Nkmln8SrIRAXJ3qzGH7gJ8WjAORiwD+SB3PYW4n4ri+gP257pXSeyw/VGOV+6ZLIkZmNfK4xT6e2U5QIQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICsj8exNp9xi4L5Kz31ojhaj18oeqnD4vzlhr/RMaAIiAiA/3mY8M6oycukeCebQdfWQtZC640OyMjQO11da2GnGGg=="}]},"_from":"./","_npmVersion":"1.3.10"},"1.5.0":{"name":"lz-string","version":"1.5.0","license":"MIT","filename":"lz-string.js","description":"LZ-based compression algorithm","main":"libs/lz-string.js","typings":"typings/lz-string.d.ts","bin":{"lz-string":"bin/bin.js"},"scripts":{},"dependencies":{},"devDependencies":{},"repository":{"type":"git","url":"git+https://github.com/pieroxy/lz-string.git"},"bugs":{"url":"https://github.com/pieroxy/lz-string/issues"},"directories":{"test":"tests"},"author":{"name":"pieroxy","email":"pieroxy@pieroxy.net"},"autoupdate":{"source":"git","target":"git://github.com/pieroxy/lz-string.git","basePath":"libs/","files":["lz-string.js","lz-string.min.js","base64-string.js"]},"gitHead":"4a94308c1e684fb98866f7ba1288f3db6d9f8801","_id":"lz-string@1.5.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==","shasum":"c1ab50f77887b712621201ba9fd4e3a6ed099941","tarball":"http://localhost:4260/lz-string/lz-string-1.5.0.tgz","fileCount":16,"unpackedSize":175825,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDFXe2mJhe/c2RygpDTZFwYF+ZLzmWmrobWbcX05nZzgAiB2NY0LGdJ8X/8K5Y24goCdb/HvaDnCxn4BdQm7jfU/Jw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkAwBbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrCaw/+L77yb5aRlRo8abeR0BMuhftlzyMGzGh+asUdX+afBEOGYTyJ\r\n2XM9fqdpZrtJv3+q9D+gqnLg7MoRQQkmvC+U0HTHEWtEJNaIH1at/IMhi+xB\r\n5/3Jho9VOtLhPto1/ld1CVu0JTxdUTDiTjpE26a4wdd7qMDhjaSJkypjtutn\r\nfwZXUs2YzKZQ1h6RlLSpB2b19KwiVjFsqnV+tIgs1WmjcrC7RxqEtA2yDdt5\r\nfWDM3lLgSGjFkedydnOskMNqLaL9COVzQ8iuFXGeS/NJvhi64gKDcGFl2ztx\r\nQS30dC/ud+EkF3omjN/cFhAnBCcXLvK52MxglR4+Ph4QAa4f3NhbUZbc1i4G\r\nf3Qa8GxOPHAAfR4X7z4E2fKlpybz7it3Sl5SJ8RQo3X24TGR69rM4Flc7G7S\r\ncNUtFXu/zJLmxYlc3u0Qcbx8sbdkg65V9y0n1aFXpwlofPbSqjOp/M4F5Yu4\r\nqQjGV6n8fz7CUb5ZpcEWFgztd+pi+7G0hhbKWrznOPxss9LWjr1j5PbIsY/9\r\nfZNeHynSv7Bkx2X7Cr7UPVZr9zNWLXdT7bxcI3ielAUVAeQRtRB9ostiCGvL\r\nChEZ3dZmIbYAeeSgL/175rpseCxPotDpLJ9xMBcyozfC1bbedA2LFbIkDzwA\r\nDKmVP8Nl733GahX08ZwxYSsoIU6oh9hYTeQ=\r\n=6NYt\r\n-----END PGP SIGNATURE-----\r\n"},"_hasShrinkwrap":false}},"repository":{},"homepage":"http://pieroxy.net/blog/pages/lz-string/index.html","license":"MIT","readmeFilename":"README.md","author":{"name":"pieroxy","email":"pieroxy@pieroxy.net"},"bugs":{"url":"https://github.com/pieroxy/lz-string/issues"}}
+{
+ "name": "lz-string",
+ "description": "LZ-based compression algorithm",
+ "dist-tags": {
+ "latest": "1.5.0"
+ },
+ "versions": {
+ "1.3.6": {
+ "name": "lz-string",
+ "version": "1.3.6",
+ "license": "WTFPL",
+ "description": "LZ-based compression algorithm",
+ "main": "libs/lz-string.js",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ },
+ "scripts": {},
+ "dependencies": {},
+ "devDependencies": {},
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/pieroxy/lz-string.git"
+ },
+ "bugs": {
+ "url": "https://github.com/pieroxy/lz-string/issues"
+ },
+ "directories": {
+ "test": "tests"
+ },
+ "author": {
+ "name": "pieroxy",
+ "email": "pieroxy@pieroxy.net"
+ },
+ "_id": "lz-string@1.3.6",
+ "dist": {
+ "shasum": "cc91b00d3264b15402e428e76dfeb709193bc10f",
+ "tarball": "http://localhost:4260/lz-string/lz-string-1.3.6.tgz",
+ "integrity": "sha512-gIHN4Nkmln8SrIRAXJ3qzGH7gJ8WjAORiwD+SB3PYW4n4ri+gP257pXSeyw/VGOV+6ZLIkZmNfK4xT6e2U5QIQ=="
+ },
+ "_from": "./",
+ "_npmVersion": "1.3.10"
+ },
+ "1.5.0": {
+ "name": "lz-string",
+ "version": "1.5.0",
+ "license": "MIT",
+ "filename": "lz-string.js",
+ "description": "LZ-based compression algorithm",
+ "main": "libs/lz-string.js",
+ "typings": "typings/lz-string.d.ts",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ },
+ "scripts": {},
+ "dependencies": {},
+ "devDependencies": {},
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pieroxy/lz-string.git"
+ },
+ "bugs": {
+ "url": "https://github.com/pieroxy/lz-string/issues"
+ },
+ "directories": {
+ "test": "tests"
+ },
+ "author": {
+ "name": "pieroxy",
+ "email": "pieroxy@pieroxy.net"
+ },
+ "autoupdate": {
+ "source": "git",
+ "target": "git://github.com/pieroxy/lz-string.git",
+ "basePath": "libs/",
+ "files": [
+ "lz-string.js",
+ "lz-string.min.js",
+ "base64-string.js"
+ ]
+ },
+ "gitHead": "4a94308c1e684fb98866f7ba1288f3db6d9f8801",
+ "_id": "lz-string@1.5.0",
+ "_nodeVersion": "16.19.1",
+ "_npmVersion": "8.19.3",
+ "dist": {
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "shasum": "c1ab50f77887b712621201ba9fd4e3a6ed099941",
+ "tarball": "http://localhost:4260/lz-string/lz-string-1.5.0.tgz",
+ "fileCount": 16,
+ "unpackedSize": 175825
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {},
+ "homepage": "http://pieroxy.net/blog/pages/lz-string/index.html",
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "author": {
+ "name": "pieroxy",
+ "email": "pieroxy@pieroxy.net"
+ },
+ "bugs": {
+ "url": "https://github.com/pieroxy/lz-string/issues"
+ }
+}
diff --git a/tests/registry/npm/magic-string/registry.json b/tests/registry/npm/magic-string/registry.json
index fc3888ab0..5f926511f 100644
--- a/tests/registry/npm/magic-string/registry.json
+++ b/tests/registry/npm/magic-string/registry.json
@@ -1 +1,83 @@
-{"name":"magic-string","description":"Modify strings, generate sourcemaps","dist-tags":{"latest":"0.25.9"},"versions":{"0.25.9":{"name":"magic-string","version":"0.25.9","description":"Modify strings, generate sourcemaps","repository":{"type":"git","url":"git+https://github.com/rich-harris/magic-string.git"},"license":"MIT","author":{"name":"Rich Harris"},"main":"dist/magic-string.cjs.js","module":"dist/magic-string.es.js","jsnext:main":"dist/magic-string.es.js","typings":"index.d.ts","scripts":{"build":"rollup -c","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s","format":"prettier --single-quote --print-width 100 --use-tabs --write src/*.js src/**/*.js","lint":"eslint src test","prepare":"npm run build","prepublishOnly":"rm -rf dist && npm test","release":"bumpp -x \"npm run changelog\" --all --commit --tag --push && npm publish","pretest":"npm run lint && npm run build","test":"mocha","watch":"rollup -cw"},"dependencies":{"sourcemap-codec":"^1.4.8"},"devDependencies":{"@rollup/plugin-buble":"^0.21.3","@rollup/plugin-node-resolve":"^13.1.3","@rollup/plugin-replace":"^4.0.0","bumpp":"^7.1.1","conventional-changelog-cli":"^2.2.2","eslint":"^7.32.0","mocha":"^9.2.1","prettier":"^2.5.1","rollup":"^2.69.0","source-map":"^0.6.1","source-map-support":"^0.5.21"},"gitHead":"69336fccbb46e721d58faa5c7a0d0b7ed6ee09d2","bugs":{"url":"https://github.com/rich-harris/magic-string/issues"},"_id":"magic-string@0.25.9","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==","shasum":"de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c","tarball":"http://localhost:4260/magic-string/magic-string-0.25.9.tgz","fileCount":10,"unpackedSize":373056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIHOYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7eg//b6qpgtc+FurMJQRYvhU9BQPkLx+ILEOPzmw5F6pik3p4vZfd\r\nnWm52DYJN60O0LOHqn4/oaccJoN9UgWu8O7XLWSYOJthVFFgpEjEHn/K7tFb\r\ntLSCAfH/z27pUJQMFVCG/I9Cqkm1KiwTtA4vcU0yLo/J3CUHOwzHhViw7Y1o\r\nQUl66CNGNJ1xS0mF/YW7I1MWbxlDAitYZWua+x+t+pZUmIZSim9eL4+QN2Wd\r\nEkZmd7qC8sUMU7jYwYUrjBBsYODyoHA4MT21AoEu2meOGEe799sxlxAB6ahs\r\nuTOKtzID+j9YrBi90nqWggIRBIPAHQKIFS3u6urub921A/Hoi7LYcdV06h9O\r\nwCq7qEi1ECPh8XjO4SNzu54FJxoXGQb1wAHzuVMJP2Wc2FU0SbcYi/zBTiwF\r\nJZNgGG/Z8Qsn8/He2LilwfwR6VZPloONEEcI7xpLufcxAQJdtUJDRgDc1AGg\r\nSPv25CPe4mU19Faojsybsu0xkcTtTAJ2DJeYpCa8SVh89G8FCZkKCDK49x6i\r\niuS3aKdH1TVtaHjVDA1siqRqG4iclwMVRPoLfPLhOAgBJ93sWW8HVtkssHrh\r\no9zASPgva3E5AWw2vkFKQljuK6SAqnIRh1iA+muBAI1GjTzX5EQViJ9c4goe\r\nonQO2QsrVQWLRQO601TqgWHTFJgO2xzQIOc=\r\n=bJY0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDV8jwBjaFd+UCnIJ2mVDguMYVlrR3OXkx6DiSS8W/f8wIgJXOLH/EUy9wYN0a6HdqJ8zH1CfWuDJ9Okiyb9ecS4Js="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# magic-string\n\n<a href=\"https://travis-ci.org/Rich-Harris/magic-string\">\n <img src=\"http://img.shields.io/travis/Rich-Harris/magic-string.svg\"\n alt=\"build status\">\n</a>\n<a href=\"https://npmjs.org/package/magic-string\">\n <img src=\"https://img.shields.io/npm/v/magic-string.svg\"\n alt=\"npm version\">\n</a>\n<a href=\"https://github.com/Rich-Harris/magic-string/blob/master/LICENSE.md\">\n <img src=\"https://img.shields.io/npm/l/magic-string.svg\"\n alt=\"license\">\n</a>\n\nSuppose you have some source code. You want to make some light modifications to it - replacing a few characters here and there, wrapping it with a header and footer, etc - and ideally you'd like to generate a [source map](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/) at the end of it. You've thought about using something like [recast](https://github.com/benjamn/recast) (which allows you to generate an AST from some JavaScript, manipulate it, and reprint it with a sourcemap without losing your comments and formatting), but it seems like overkill for your needs (or maybe the source code isn't JavaScript).\n\nYour requirements are, frankly, rather niche. But they're requirements that I also have, and for which I made magic-string. It's a small, fast utility for manipulating strings and generating sourcemaps.\n\n## Installation\n\nmagic-string works in both node.js and browser environments. For node, install with npm:\n\n```bash\nnpm i magic-string\n```\n\nTo use in browser, grab the [magic-string.umd.js](https://unpkg.com/magic-string/dist/magic-string.umd.js) file and add it to your page:\n\n```html\n<script src='magic-string.umd.js'></script>\n```\n\n(It also works with various module systems, if you prefer that sort of thing - it has a dependency on [vlq](https://github.com/Rich-Harris/vlq).)\n\n## Usage\n\nThese examples assume you're in node.js, or something similar:\n\n```js\nimport MagicString from 'magic-string';\nimport fs from 'fs'\n\nconst s = new MagicString('problems = 99');\n\ns.overwrite(0, 8, 'answer');\ns.toString(); // 'answer = 99'\n\ns.overwrite(11, 13, '42'); // character indices always refer to the original string\ns.toString(); // 'answer = 42'\n\ns.prepend('var ').append(';'); // most methods are chainable\ns.toString(); // 'var answer = 42;'\n\nconst map = s.generateMap({\n source: 'source.js',\n file: 'converted.js.map',\n includeContent: true\n}); // generates a v3 sourcemap\n\nfs.writeFileSync('converted.js', s.toString());\nfs.writeFileSync('converted.js.map', map.toString());\n```\n\nYou can pass an options argument:\n\n```js\nconst s = new MagicString(someCode, {\n // both these options will be used if you later\n // call `bundle.addSource( s )` - see below\n filename: 'foo.js',\n indentExclusionRanges: [/*...*/]\n});\n```\n\n## Methods\n\n### s.addSourcemapLocation( index )\n\nAdds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is `false` (see below).\n\n### s.append( content )\n\nAppends the specified content to the end of the string. Returns `this`.\n\n### s.appendLeft( index, content )\n\nAppends the specified `content` at the `index` in the original string. If a range *ending* with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependLeft(...)`.\n\n### s.appendRight( index, content )\n\nAppends the specified `content` at the `index` in the original string. If a range *starting* with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependRight(...)`.\n\n### s.clone()\n\nDoes what you'd expect.\n\n### s.generateDecodedMap( options )\n\nGenerates a sourcemap object with raw mappings in array form, rather than encoded as a string. See `generateMap` documentation below for options details. Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead.\n\n### s.generateMap( options )\n\nGenerates a [version 3 sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). All options are, well, optional:\n\n* `file` - the filename where you plan to write the sourcemap\n* `source` - the filename of the file containing the original source\n* `includeContent` - whether to include the original content in the map's `sourcesContent` array\n* `hires` - whether the mapping should be high-resolution. Hi-res mappings map every single character, meaning (for example) your devtools will always be able to pinpoint the exact location of function calls and so on. With lo-res mappings, devtools may only be able to identify the correct line - but they're quicker to generate and less bulky. If sourcemap locations have been specified with `s.addSourceMapLocation()`, they will be used here.\n\nThe returned sourcemap has two (non-enumerable) methods attached for convenience:\n\n* `toString` - returns the equivalent of `JSON.stringify(map)`\n* `toUrl` - returns a DataURI containing the sourcemap. Useful for doing this sort of thing:\n\n```js\ncode += '\\n//# sourceMappingURL=' + map.toUrl();\n```\n\n### s.hasChanged()\n\nIndicates if the string has been changed.\n\n### s.indent( prefix[, options] )\n\nPrefixes each line of the string with `prefix`. If `prefix` is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. Returns `this`.\n\nThe `options` argument can have an `exclude` property, which is an array of `[start, end]` character ranges. These ranges will be excluded from the indentation - useful for (e.g.) multiline strings.\n\n### s.insertLeft( index, content )\n\n**DEPRECATED** since 0.17 – use `s.appendLeft(...)` instead\n\n### s.insertRight( index, content )\n\n**DEPRECATED** since 0.17 – use `s.prependRight(...)` instead\n\n### s.locate( index )\n\n**DEPRECATED** since 0.10 – see [#30](https://github.com/Rich-Harris/magic-string/pull/30)\n\n### s.locateOrigin( index )\n\n**DEPRECATED** since 0.10 – see [#30](https://github.com/Rich-Harris/magic-string/pull/30)\n\n### s.move( start, end, newIndex )\n\nMoves the characters from `start` and `end` to `index`. Returns `this`.\n\n### s.overwrite( start, end, content[, options] )\n\nReplaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. Returns `this`.\n\nThe fourth argument is optional. It can have a `storeName` property — if `true`, the original name will be stored for later inclusion in a sourcemap's `names` array — and a `contentOnly` property which determines whether only the content is overwritten, or anything that was appended/prepended to the range as well.\n\n### s.prepend( content )\n\nPrepends the string with the specified content. Returns `this`.\n\n### s.prependLeft ( index, content )\n\nSame as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at `index`\n\n### s.prependRight ( index, content )\n\nSame as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index`\n\n### s.replace( regexp, substitution )\n\nString replacement with RegExp or string, a replacer function is also supported. Returns `this`.\n\n```ts\nimport MagicString from 'magic-string'\n\nconst s = new MagicString(source)\n\ns.replace('foo', 'bar')\ns.replace(/foo/g, 'bar')\ns.replace(/(\\w)(\\d+)/g, (_, $1, $2) => $1.toUpperCase() + $2)\n```\n\nThe differences from [`String.replace`]((https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)):\n- It will always match against the **original string**\n- It mutates the magic string state (use `.clone()` to be immutable)\n\n### s.remove( start, end )\n\nRemoves the characters from `start` to `end` (of the original string, **not** the generated string). Removing the same content twice, or making removals that partially overlap, will cause an error. Returns `this`.\n\n### s.slice( start, end )\n\nReturns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. Throws error if the indices are for characters that were already removed.\n\n### s.snip( start, end )\n\nReturns a clone of `s`, with all content before the `start` and `end` characters of the original string removed.\n\n### s.toString()\n\nReturns the generated string.\n\n### s.trim([ charType ])\n\nTrims content matching `charType` (defaults to `\\s`, i.e. whitespace) from the start and end. Returns `this`.\n\n### s.trimStart([ charType ])\n\nTrims content matching `charType` (defaults to `\\s`, i.e. whitespace) from the start. Returns `this`.\n\n### s.trimEnd([ charType ])\n\nTrims content matching `charType` (defaults to `\\s`, i.e. whitespace) from the end. Returns `this`.\n\n### s.trimLines()\n\nRemoves empty lines from the start and end. Returns `this`.\n\n### s.isEmpty()\n\nReturns true if the resulting source is empty (disregarding white space).\n\n## Bundling\n\nTo concatenate several sources, use `MagicString.Bundle`:\n\n```js\nconst bundle = new MagicString.Bundle();\n\nbundle.addSource({\n filename: 'foo.js',\n content: new MagicString('var answer = 42;')\n});\n\nbundle.addSource({\n filename: 'bar.js',\n content: new MagicString('console.log( answer )')\n});\n\n// Advanced: a source can include an `indentExclusionRanges` property\n// alongside `filename` and `content`. This will be passed to `s.indent()`\n// - see documentation above\n\nbundle.indent() // optionally, pass an indent string, otherwise it will be guessed\n .prepend('(function () {\\n')\n .append('}());');\n\nbundle.toString();\n// (function () {\n// var answer = 42;\n// console.log( answer );\n// }());\n\n// options are as per `s.generateMap()` above\nconst map = bundle.generateMap({\n file: 'bundle.js',\n includeContent: true,\n hires: true\n});\n```\n\nAs an alternative syntax, if you a) don't have `filename` or `indentExclusionRanges` options, or b) passed those in when you used `new MagicString(...)`, you can simply pass the `MagicString` instance itself:\n\n```js\nconst bundle = new MagicString.Bundle();\nconst source = new MagicString(someCode, {\n filename: 'foo.js'\n});\n\nbundle.addSource(source);\n```\n\n## License\n\nMIT\n","author":{"name":"Rich Harris"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/rich-harris/magic-string#readme","repository":{"type":"git","url":"git+https://github.com/rich-harris/magic-string.git"},"bugs":{"url":"https://github.com/rich-harris/magic-string/issues"}}
+{
+ "name": "magic-string",
+ "description": "Modify strings, generate sourcemaps",
+ "dist-tags": {
+ "latest": "0.25.9"
+ },
+ "versions": {
+ "0.25.9": {
+ "name": "magic-string",
+ "version": "0.25.9",
+ "description": "Modify strings, generate sourcemaps",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/rich-harris/magic-string.git"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Rich Harris"
+ },
+ "main": "dist/magic-string.cjs.js",
+ "module": "dist/magic-string.es.js",
+ "jsnext:main": "dist/magic-string.es.js",
+ "typings": "index.d.ts",
+ "scripts": {
+ "build": "rollup -c",
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
+ "format": "prettier --single-quote --print-width 100 --use-tabs --write src/*.js src/**/*.js",
+ "lint": "eslint src test",
+ "prepare": "npm run build",
+ "prepublishOnly": "rm -rf dist && npm test",
+ "release": "bumpp -x \"npm run changelog\" --all --commit --tag --push && npm publish",
+ "pretest": "npm run lint && npm run build",
+ "test": "mocha",
+ "watch": "rollup -cw"
+ },
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ },
+ "devDependencies": {
+ "@rollup/plugin-buble": "^0.21.3",
+ "@rollup/plugin-node-resolve": "^13.1.3",
+ "@rollup/plugin-replace": "^4.0.0",
+ "bumpp": "^7.1.1",
+ "conventional-changelog-cli": "^2.2.2",
+ "eslint": "^7.32.0",
+ "mocha": "^9.2.1",
+ "prettier": "^2.5.1",
+ "rollup": "^2.69.0",
+ "source-map": "^0.6.1",
+ "source-map-support": "^0.5.21"
+ },
+ "gitHead": "69336fccbb46e721d58faa5c7a0d0b7ed6ee09d2",
+ "bugs": {
+ "url": "https://github.com/rich-harris/magic-string/issues"
+ },
+ "_id": "magic-string@0.25.9",
+ "_nodeVersion": "16.13.0",
+ "_npmVersion": "8.1.0",
+ "dist": {
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "shasum": "de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c",
+ "tarball": "http://localhost:4260/magic-string/magic-string-0.25.9.tgz",
+ "fileCount": 10,
+ "unpackedSize": 373056
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Rich Harris"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/rich-harris/magic-string#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/rich-harris/magic-string.git"
+ },
+ "bugs": {
+ "url": "https://github.com/rich-harris/magic-string/issues"
+ }
+}
diff --git a/tests/registry/npm/make-fetch-happen/registry.json b/tests/registry/npm/make-fetch-happen/registry.json
index ccb55b4e9..235e56dbe 100644
--- a/tests/registry/npm/make-fetch-happen/registry.json
+++ b/tests/registry/npm/make-fetch-happen/registry.json
@@ -1 +1,108 @@
-{"name":"make-fetch-happen","description":"Opinionated, caching, retrying fetch client","dist-tags":{"latest":"13.0.1"},"versions":{"13.0.1":{"name":"make-fetch-happen","version":"13.0.1","author":{"name":"GitHub Inc."},"license":"ISC","_id":"make-fetch-happen@13.0.1","bugs":{"url":"https://github.com/npm/make-fetch-happen/issues"},"tap":{"color":1,"files":"test/*.js","nyc-arg":["--exclude","tap-snapshots/**"],"timeout":60,"check-coverage":true},"dist":{"shasum":"273ba2f78f45e1f3a6dca91cede87d9fa4821e36","tarball":"http://localhost:4260/make-fetch-happen/make-fetch-happen-13.0.1.tgz","fileCount":13,"integrity":"sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==","signatures":[{"sig":"MEQCIA7a7b2hrtmuR9wWgjUVT2P4QyG21Hl7HvygsnEsFXPmAiBMMHCNEuyCw6YnMFh0lhvBpgQ/f2jefYql9X40r/Wh+g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/make-fetch-happen@13.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":52787},"main":"lib/index.js","engines":{"node":"^16.14.0 || >=18.0.0"},"gitHead":"0b3ba78667f9984e42a32a73adde2ebd7ea1b671","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","eslint":"eslint","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/make-fetch-happen.git","type":"git"},"_npmVersion":"10.6.0","description":"Opinionated, caching, retrying fetch client","directories":{},"templateOSS":{"publish":"true","version":"4.21.4","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"20.12.2","dependencies":{"ssri":"^10.0.0","cacache":"^18.0.0","minipass":"^7.0.2","proc-log":"^4.2.0","is-lambda":"^1.0.1","negotiator":"^0.6.3","@npmcli/agent":"^2.0.0","promise-retry":"^2.0.1","minipass-fetch":"^3.0.0","minipass-flush":"^1.0.5","minipass-pipeline":"^1.2.4","http-cache-semantics":"^4.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.0","nock":"^13.2.4","safe-buffer":"^5.2.1","standard-version":"^9.3.2","@npmcli/template-oss":"4.21.4","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/make-fetch-happen.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/make-fetch-happen#readme","bugs":{"url":"https://github.com/npm/make-fetch-happen/issues"},"readme":"# make-fetch-happen\n[![npm version](https://img.shields.io/npm/v/make-fetch-happen.svg)](https://npm.im/make-fetch-happen) [![license](https://img.shields.io/npm/l/make-fetch-happen.svg)](https://npm.im/make-fetch-happen) [![Travis](https://img.shields.io/travis/npm/make-fetch-happen.svg)](https://travis-ci.org/npm/make-fetch-happen) [![Coverage Status](https://coveralls.io/repos/github/npm/make-fetch-happen/badge.svg?branch=latest)](https://coveralls.io/github/npm/make-fetch-happen?branch=latest)\n\n[`make-fetch-happen`](https://github.com/npm/make-fetch-happen) is a Node.js\nlibrary that wraps [`minipass-fetch`](https://github.com/npm/minipass-fetch) with additional\nfeatures [`minipass-fetch`](https://github.com/npm/minipass-fetch) doesn't intend to include, including HTTP Cache support, request\npooling, proxies, retries, [and more](#features)!\n\n## Install\n\n`$ npm install --save make-fetch-happen`\n\n## Table of Contents\n\n* [Example](#example)\n* [Features](#features)\n* [Contributing](#contributing)\n* [API](#api)\n * [`fetch`](#fetch)\n * [`fetch.defaults`](#fetch-defaults)\n * [`minipass-fetch` options](#minipass-fetch-options)\n * [`make-fetch-happen` options](#extra-options)\n * [`opts.cachePath`](#opts-cache-path)\n * [`opts.cache`](#opts-cache)\n * [`opts.cacheAdditionalHeaders`](#opts-cache-additional-headers)\n * [`opts.proxy`](#opts-proxy)\n * [`opts.noProxy`](#opts-no-proxy)\n * [`opts.ca, opts.cert, opts.key`](#https-opts)\n * [`opts.maxSockets`](#opts-max-sockets)\n * [`opts.retry`](#opts-retry)\n * [`opts.onRetry`](#opts-onretry)\n * [`opts.integrity`](#opts-integrity)\n * [`opts.dns`](#opts-dns)\n* [Message From Our Sponsors](#wow)\n\n### Example\n\n```javascript\nconst fetch = require('make-fetch-happen').defaults({\n cachePath: './my-cache' // path where cache will be written (and read)\n})\n\nfetch('https://registry.npmjs.org/make-fetch-happen').then(res => {\n return res.json() // download the body as JSON\n}).then(body => {\n console.log(`got ${body.name} from web`)\n return fetch('https://registry.npmjs.org/make-fetch-happen', {\n cache: 'no-cache' // forces a conditional request\n })\n}).then(res => {\n console.log(res.status) // 304! cache validated!\n return res.json().then(body => {\n console.log(`got ${body.name} from cache`)\n })\n})\n```\n\n### Features\n\n* Builds around [`minipass-fetch`](https://npm.im/minipass-fetch) for the core [`fetch` API](https://fetch.spec.whatwg.org) implementation\n* Request pooling out of the box\n* Quite fast, really\n* Automatic HTTP-semantics-aware request retries\n* Cache-fallback automatic \"offline mode\"\n* Built-in request caching following full HTTP caching rules (`Cache-Control`, `ETag`, `304`s, cache fallback on error, etc).\n* Node.js Stream support\n* Transparent gzip and deflate support\n* [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) support\n* Proxy support (http, https, socks, socks4, socks5. via [`@npmcli/agent`](https://npm.im/@npmcli/agent))\n* DNS cache (via ([`@npmcli/agent`](https://npm.im/@npmcli/agent))\n\n#### <a name=\"fetch\"></a> `> fetch(uriOrRequest, [opts]) -> Promise<Response>`\n\nThis function implements most of the [`fetch` API](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch): given a `uri` string or a `Request` instance, it will fire off an http request and return a Promise containing the relevant response.\n\nIf `opts` is provided, the [`minipass-fetch`-specific options](#minipass-fetch-options) will be passed to that library. There are also [additional options](#extra-options) specific to make-fetch-happen that add various features, such as HTTP caching, integrity verification, proxy support, and more.\n\n##### Example\n\n```javascript\nfetch('https://google.com').then(res => res.buffer())\n```\n\n#### <a name=\"fetch-defaults\"></a> `> fetch.defaults([defaultUrl], [defaultOpts])`\n\nReturns a new `fetch` function that will call `make-fetch-happen` using `defaultUrl` and `defaultOpts` as default values to any calls.\n\nA defaulted `fetch` will also have a `.defaults()` method, so they can be chained.\n\n##### Example\n\n```javascript\nconst fetch = require('make-fetch-happen').defaults({\n cachePath: './my-local-cache'\n})\n\nfetch('https://registry.npmjs.org/make-fetch-happen') // will always use the cache\n```\n\n#### <a name=\"minipass-fetch-options\"></a> `> minipass-fetch options`\n\nThe following options for `minipass-fetch` are used as-is:\n\n* method\n* body\n* redirect\n* follow\n* timeout\n* compress\n* size\n\nThese other options are modified or augmented by make-fetch-happen:\n\n* headers - Default `User-Agent` set to make-fetch happen. `Connection` is set to `keep-alive` or `close` automatically depending on `opts.agent`.\n\nFor more details, see [the documentation for `minipass-fetch` itself](https://github.com/npm/minipass-fetch#options).\n\n#### <a name=\"extra-options\"></a> `> make-fetch-happen options`\n\nmake-fetch-happen augments the `minipass-fetch` API with additional features available through extra options. The following extra options are available:\n\n* [`opts.cachePath`](#opts-cache-path) - Cache target to read/write\n* [`opts.cache`](#opts-cache) - `fetch` cache mode. Controls cache *behavior*.\n* [`opts.cacheAdditionalHeaders`](#opts-cache-additional-headers) - Store additional headers in the cache\n* [`opts.proxy`](#opts-proxy) - Proxy agent\n* [`opts.noProxy`](#opts-no-proxy) - Domain segments to disable proxying for.\n* [`opts.ca, opts.cert, opts.key, opts.strictSSL`](#https-opts)\n* [`opts.localAddress`](#opts-local-address)\n* [`opts.maxSockets`](#opts-max-sockets)\n* [`opts.retry`](#opts-retry) - Request retry settings\n* [`opts.onRetry`](#opts-onretry) - a function called whenever a retry is attempted\n* [`opts.integrity`](#opts-integrity) - [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) metadata.\n* [`opts.dns`](#opts-dns) - DNS cache options\n* [`opts.agent`](#opts-agent) - http/https/proxy/socks agent options. See [`@npmcli/agent`](https://npm.im/@npmcli/agent) for more info.\n\n#### <a name=\"opts-cache-path\"></a> `> opts.cachePath`\n\nA string `Path` to be used as the cache root for [`cacache`](https://npm.im/cacache).\n\n**NOTE**: Requests will not be cached unless their response bodies are consumed. You will need to use one of the `res.json()`, `res.buffer()`, etc methods on the response, or drain the `res.body` stream, in order for it to be written.\n\nThe default cache manager also adds the following headers to cached responses:\n\n* `X-Local-Cache`: Path to the cache the content was found in\n* `X-Local-Cache-Key`: Unique cache entry key for this response\n* `X-Local-Cache-Mode`: Always `stream` to indicate how the response was read from cacache\n* `X-Local-Cache-Hash`: Specific integrity hash for the cached entry\n* `X-Local-Cache-Status`: One of `miss`, `hit`, `stale`, `revalidated`, `updated`, or `skip` to signal how the response was created\n* `X-Local-Cache-Time`: UTCString of the cache insertion time for the entry\n\nUsing [`cacache`](https://npm.im/cacache), a call like this may be used to\nmanually fetch the cached entry:\n\n```javascript\nconst h = response.headers\ncacache.get(h.get('x-local-cache'), h.get('x-local-cache-key'))\n\n// grab content only, directly:\ncacache.get.byDigest(h.get('x-local-cache'), h.get('x-local-cache-hash'))\n```\n\n##### Example\n\n```javascript\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n cachePath: './my-local-cache'\n}) // -> 200-level response will be written to disk\n```\n\n#### <a name=\"opts-cache\"></a> `> opts.cache`\n\nThis option follows the standard `fetch` API cache option. This option will do nothing if [`opts.cachePath`](#opts-cache-path) is null. The following values are accepted (as strings):\n\n* `default` - Fetch will inspect the HTTP cache on the way to the network. If there is a fresh response it will be used. If there is a stale response a conditional request will be created, and a normal request otherwise. It then updates the HTTP cache with the response. If the revalidation request fails (for example, on a 500 or if you're offline), the stale response will be returned.\n* `no-store` - Fetch behaves as if there is no HTTP cache at all.\n* `reload` - Fetch behaves as if there is no HTTP cache on the way to the network. Ergo, it creates a normal request and updates the HTTP cache with the response.\n* `no-cache` - Fetch creates a conditional request if there is a response in the HTTP cache and a normal request otherwise. It then updates the HTTP cache with the response.\n* `force-cache` - Fetch uses any response in the HTTP cache matching the request, not paying attention to staleness. If there was no response, it creates a normal request and updates the HTTP cache with the response.\n* `only-if-cached` - Fetch uses any response in the HTTP cache matching the request, not paying attention to staleness. If there was no response, it returns a network error. (Can only be used when request’s mode is \"same-origin\". Any cached redirects will be followed assuming request’s redirect mode is \"follow\" and the redirects do not violate request’s mode.)\n\n(Note: option descriptions are taken from https://fetch.spec.whatwg.org/#http-network-or-cache-fetch)\n\n##### Example\n\n```javascript\nconst fetch = require('make-fetch-happen').defaults({\n cachePath: './my-cache'\n})\n\n// Will error with ENOTCACHED if we haven't already cached this url\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n cache: 'only-if-cached'\n})\n\n// Will refresh any local content and cache the new response\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n cache: 'reload'\n})\n\n// Will use any local data, even if stale. Otherwise, will hit network.\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n cache: 'force-cache'\n})\n```\n\n#### <a name=\"opts-cache-additional-headers\"></a> `> opts.cacheAdditionalHeaders`\n\nThe following headers are always stored in the cache when present:\n\n- `cache-control`\n- `content-encoding`\n- `content-language`\n- `content-type`\n- `date`\n- `etag`\n- `expires`\n- `last-modified`\n- `link`\n- `location`\n- `pragma`\n- `vary`\n\nThis option allows a user to store additional custom headers in the cache.\n\n\n##### Example\n\n```javascript\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n cacheAdditionalHeaders: ['my-custom-header'],\n})\n```\n\n#### <a name=\"opts-proxy\"></a> `> opts.proxy`\n\nA string or `new url.URL()`-d URI to proxy through. Different Proxy handlers will be\nused depending on the proxy's protocol.\n\nAdditionally, `process.env.HTTP_PROXY`, `process.env.HTTPS_PROXY`, and\n`process.env.PROXY` are used if present and no `opts.proxy` value is provided.\n\n(Pending) `process.env.NO_PROXY` may also be configured to skip proxying requests for all, or specific domains.\n\n##### Example\n\n```javascript\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n proxy: 'https://corporate.yourcompany.proxy:4445'\n})\n\nfetch('https://registry.npmjs.org/make-fetch-happen', {\n proxy: {\n protocol: 'https:',\n hostname: 'corporate.yourcompany.proxy',\n port: 4445\n }\n})\n```\n\n#### <a name=\"opts-no-proxy\"></a> `> opts.noProxy`\n\nIf present, should be a comma-separated string or an array of domain extensions\nthat a proxy should _not_ be used for.\n\nThis option may also be provided through `process.env.NO_PROXY`.\n\n#### <a name=\"https-opts\"></a> `> opts.ca, opts.cert, opts.key, opts.strictSSL`\n\nThese values are passed in directly to the HTTPS agent and will be used for both\nproxied and unproxied outgoing HTTPS requests. They mostly correspond to the\nsame options the `https` module accepts, which will be themselves passed to\n`tls.connect()`. `opts.strictSSL` corresponds to `rejectUnauthorized`.\n\n#### <a name=\"opts-local-address\"></a> `> opts.localAddress`\n\nPassed directly to `http` and `https` request calls. Determines the local\naddress to bind to.\n\n#### <a name=\"opts-max-sockets\"></a> `> opts.maxSockets`\n\nDefault: 15\n\nMaximum number of active concurrent sockets to use for the underlying\nHttp/Https/Proxy agents. This setting applies once per spawned agent.\n\n15 is probably a _pretty good value_ for most use-cases, and balances speed\nwith, uh, not knocking out people's routers. 🤓\n\n#### <a name=\"opts-retry\"></a> `> opts.retry`\n\nAn object that can be used to tune request retry settings. Retries will only be attempted on the following conditions:\n\n* Request method is NOT `POST` AND\n* Request status is one of: `408`, `420`, `429`, or any status in the 500-range. OR\n* Request errored with `ECONNRESET`, `ECONNREFUSED`, `EADDRINUSE`, `ETIMEDOUT`, or the `fetch` error `request-timeout`.\n\nThe following are worth noting as explicitly not retried:\n\n* `getaddrinfo ENOTFOUND` and will be assumed to be either an unreachable domain or the user will be assumed offline. If a response is cached, it will be returned immediately.\n\nIf `opts.retry` is `false`, it is equivalent to `{retries: 0}`\n\nIf `opts.retry` is a number, it is equivalent to `{retries: num}`\n\nThe following retry options are available if you want more control over it:\n\n* retries\n* factor\n* minTimeout\n* maxTimeout\n* randomize\n\nFor details on what each of these do, refer to the [`retry`](https://npm.im/retry) documentation.\n\n##### Example\n\n```javascript\nfetch('https://flaky.site.com', {\n retry: {\n retries: 10,\n randomize: true\n }\n})\n\nfetch('http://reliable.site.com', {\n retry: false\n})\n\nfetch('http://one-more.site.com', {\n retry: 3\n})\n```\n\n#### <a name=\"opts-onretry\"></a> `> opts.onRetry`\n\nA function called with the response or error which caused the retry whenever one is attempted.\n\n##### Example\n\n```javascript\nfetch('https://flaky.site.com', {\n onRetry(cause) {\n console.log('we will retry because of', cause)\n }\n})\n```\n\n#### <a name=\"opts-integrity\"></a> `> opts.integrity`\n\nMatches the response body against the given [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) metadata. If verification fails, the request will fail with an `EINTEGRITY` error.\n\n`integrity` may either be a string or an [`ssri`](https://npm.im/ssri) `Integrity`-like.\n\n##### Example\n\n```javascript\nfetch('http://localhost:4260/make-fetch-happen/make-fetch-happen-1.0.0.tgz', {\n integrity: 'sha1-o47j7zAYnedYFn1dF/fR9OV3z8Q='\n}) // -> ok\n\nfetch('https://malicious-registry.org/make-fetch-happen/-/make-fetch-happen-1.0.0.tgz', {\n integrity: 'sha1-o47j7zAYnedYFn1dF/fR9OV3z8Q='\n}) // Error: EINTEGRITY\n```\n","readmeFilename":"README.md"}
+{
+ "name": "make-fetch-happen",
+ "description": "Opinionated, caching, retrying fetch client",
+ "dist-tags": {
+ "latest": "13.0.1"
+ },
+ "versions": {
+ "13.0.1": {
+ "name": "make-fetch-happen",
+ "version": "13.0.1",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "make-fetch-happen@13.0.1",
+ "bugs": {
+ "url": "https://github.com/npm/make-fetch-happen/issues"
+ },
+ "tap": {
+ "color": 1,
+ "files": "test/*.js",
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "timeout": 60,
+ "check-coverage": true
+ },
+ "dist": {
+ "shasum": "273ba2f78f45e1f3a6dca91cede87d9fa4821e36",
+ "tarball": "http://localhost:4260/make-fetch-happen/make-fetch-happen-13.0.1.tgz",
+ "fileCount": 13,
+ "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/make-fetch-happen@13.0.1",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 52787
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ },
+ "gitHead": "0b3ba78667f9984e42a32a73adde2ebd7ea1b671",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "eslint": "eslint",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/make-fetch-happen.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.6.0",
+ "description": "Opinionated, caching, retrying fetch client",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.21.4",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "20.12.2",
+ "dependencies": {
+ "ssri": "^10.0.0",
+ "cacache": "^18.0.0",
+ "minipass": "^7.0.2",
+ "proc-log": "^4.2.0",
+ "is-lambda": "^1.0.1",
+ "negotiator": "^0.6.3",
+ "@npmcli/agent": "^2.0.0",
+ "promise-retry": "^2.0.1",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "http-cache-semantics": "^4.1.1"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.0",
+ "nock": "^13.2.4",
+ "safe-buffer": "^5.2.1",
+ "standard-version": "^9.3.2",
+ "@npmcli/template-oss": "4.21.4",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/make-fetch-happen.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/make-fetch-happen#readme",
+ "bugs": {
+ "url": "https://github.com/npm/make-fetch-happen/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minimatch/registry.json b/tests/registry/npm/minimatch/registry.json
index 976a0120f..9094ccffd 100644
--- a/tests/registry/npm/minimatch/registry.json
+++ b/tests/registry/npm/minimatch/registry.json
@@ -1 +1,123 @@
-{"name":"minimatch","dist-tags":{"latest":"9.0.5"},"versions":{"9.0.5":{"name":"minimatch","version":"9.0.5","author":{"url":"http://blog.izs.me","name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"ISC","_id":"minimatch@9.0.5","bugs":{"url":"https://github.com/isaacs/minimatch/issues"},"dist":{"shasum":"d74f9dd6b57d83d8e98cfb82133b03978bc929e5","tarball":"http://localhost:4260/minimatch/minimatch-9.0.5.tgz","fileCount":53,"integrity":"sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==","signatures":[{"sig":"MEYCIQC8i1XVlxHUOKd0etL7moPA7FuIE5d+E6J4fd1YQj0btgIhAMtyRwTteIb7e0oR/SIFP0LK/JFECg7Aj3KbraAX9pih","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":435003},"main":"./dist/commonjs/index.js","tshy":{"exports":{".":"./src/index.ts","./package.json":"./package.json"}},"type":"module","types":"./dist/commonjs/index.d.ts","engines":{"node":">=16 || 14 >=14.17"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/isaacs"},"gitHead":"0de7f45232cad5e3e49e4eb7cd9b6e124ed04b84","scripts":{"snap":"tap","test":"tap","format":"prettier --write . --loglevel warn","prepare":"tshy","presnap":"npm run prepare","pretest":"npm run prepare","typedoc":"typedoc --tsconfig tsconfig-esm.json ./src/*.ts","benchmark":"node benchmark/index.js","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags"},"prettier":{"semi":false,"useTabs":false,"tabWidth":2,"endOfLine":"lf","printWidth":80,"arrowParens":"avoid","singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true},"repository":{"url":"git://github.com/isaacs/minimatch.git","type":"git"},"_npmVersion":"10.7.0","description":"a glob matcher in javascript","directories":{},"_nodeVersion":"20.13.1","dependencies":{"brace-expansion":"^2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^18.7.2","tshy":"^1.12.0","mkdirp":"1","ts-node":"^10.9.1","typedoc":"^0.23.21","prettier":"^2.8.2","@types/tap":"^15.0.8","typescript":"^4.9.3","@types/node":"^18.15.11","@types/brace-expansion":"^1.1.0","eslint-config-prettier":"^8.6.0"}}},"bugs":{"url":"https://github.com/isaacs/minimatch/issues"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me"},"license":"ISC","homepage":"https://github.com/isaacs/minimatch#readme","repository":{"type":"git","url":"git://github.com/isaacs/minimatch.git"},"description":"a glob matcher in javascript","readme":"# minimatch\n\nA minimal matching utility.\n\nThis is the matching library used internally by npm.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```js\n// hybrid module, load with require() or import\nimport { minimatch } from 'minimatch'\n// or:\nconst { minimatch } = require('minimatch')\n\nminimatch('bar.foo', '*.foo') // true!\nminimatch('bar.foo', '*.bar') // false!\nminimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n- Brace Expansion\n- Extended glob matching\n- \"Globstar\" `**` matching\n- [Posix character\n classes](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html),\n like `[[:alpha:]]`, supporting the full range of Unicode\n characters. For example, `[[:alpha:]]` will match against\n `'é'`, though `[a-zA-Z]` will not. Collating symbol and set\n matching is not supported, so `[[=e=]]` will _not_ match `'é'`\n and `[[.ch.]]` will not match `'ch'` in locales where `ch` is\n considered a single character.\n\nSee:\n\n- `man sh`\n- `man bash` [Pattern\n Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)\n- `man 3 fnmatch`\n- `man 5 gitignore`\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes in patterns\nwill always be interpreted as escape characters, not path separators.\n\nNote that `\\` or `/` _will_ be interpreted as path separators in paths on\nWindows, and will match against `/` in glob expressions.\n\nSo just always use `/` in patterns.\n\n### UNC Paths\n\nOn Windows, UNC paths like `//?/c:/...` or\n`//ComputerName/Share/...` are handled specially.\n\n- Patterns starting with a double-slash followed by some\n non-slash characters will preserve their double-slash. As a\n result, a pattern like `//*` will match `//x`, but not `/x`.\n- Patterns staring with `//?/<drive letter>:` will _not_ treat\n the `?` as a wildcard character. Instead, it will be treated\n as a normal string.\n- Patterns starting with `//?/<drive letter>:/...` will match\n file paths starting with `<drive letter>:/...`, and vice versa,\n as if the `//?/` was not present. This behavior only is\n present when the drive letters are a case-insensitive match to\n one another. The remaining portions of the path/pattern are\n compared case sensitively, unless `nocase:true` is set.\n\nNote that specifying a UNC path using `\\` characters as path\nseparators is always allowed in the file path argument, but only\nallowed in the pattern argument when `windowsPathsNoEscape: true`\nis set in the options.\n\n## Minimatch Class\n\nCreate a minimatch object by instantiating the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require('minimatch').Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n- `pattern` The original pattern the minimatch object represents.\n- `options` The options supplied to the constructor.\n- `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n- `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n- `negate` True if the pattern is negated.\n- `comment` True if the pattern is a comment.\n- `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n- `makeRe()` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n- `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n- `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n- `hasMagic()` Returns true if the parsed pattern contains any\n magic characters. Returns false if all comparator parts are\n string literals. If the `magicalBraces` option is set on the\n constructor, then it will consider brace expansions which are\n not otherwise magical to be magic. If not set, then a pattern\n like `a{b,c}d` will return `false`, because neither `abd` nor\n `acd` contain any special glob characters.\n\n This does **not** mean that the pattern string can be used as a\n literal filename, as it may contain magic glob characters that\n are escaped. For example, the pattern `\\\\*` or `[*]` would not\n be considered to have magic, as the matching portion parses to\n the literal string `'*'` and would match a path named `'*'`,\n not `'\\\\*'` or `'[*]'`. The `minimatch.unescape()` method may\n be used to remove escape characters.\n\nAll other methods are internal, and will be called as necessary.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, '*.js', { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true }))\n```\n\n### minimatch.escape(pattern, options = {})\n\nEscape all magic characters in a glob pattern, so that it will\nonly ever match literal strings\n\nIf the `windowsPathsNoEscape` option is used, then characters are\nescaped by wrapping in `[]`, because a magic character wrapped in\na character class can only be satisfied by that exact character.\n\nSlashes (and backslashes in `windowsPathsNoEscape` mode) cannot\nbe escaped or unescaped.\n\n### minimatch.unescape(pattern, options = {})\n\nUn-escape a glob string that may contain some escaped characters.\n\nIf the `windowsPathsNoEscape` option is used, then square-brace\nescapes are removed, but not backslash escapes. For example, it\nwill turn the string `'[*]'` into `*`, but it will not turn\n`'\\\\*'` into `'*'`, because `\\` is a path separator in\n`windowsPathsNoEscape` mode.\n\nWhen `windowsPathsNoEscape` is not set, then both brace escapes\nand backslash escapes are removed.\n\nSlashes (and backslashes in `windowsPathsNoEscape` mode) cannot\nbe escaped or unescaped.\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, '*.js', { matchBase: true })\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nocaseMagicOnly\n\nWhen used with `{nocase: true}`, create regular expressions that\nare case-insensitive, but leave string match portions untouched.\nHas no effect when used without `{nocase: true}`\n\nUseful when some other form of case-insensitive matching is used,\nor if the original string representation is useful in some other\nway.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set. When not set, an empty list\nis returned if there are no matches.\n\n### magicalBraces\n\nThis only affects the results of the `Minimatch.hasMagic` method.\n\nIf the pattern contains brace expansions, such as `a{b,c}d`, but\nno other magic characters, then the `Minimatch.hasMagic()` method\nwill return `false` by default. When this option set, it will\nreturn `true` for brace expansion as well as other magic glob\ncharacters.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n### partial\n\nCompare a partial path to a pattern. As long as the parts of the path that\nare present are not contradicted by the pattern, it will be treated as a\nmatch. This is useful in applications where you're walking through a\nfolder structure, and don't yet have the full path, but want to ensure that\nyou do not walk down paths that can never be a match.\n\nFor example,\n\n```js\nminimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d\nminimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d\nminimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a\n```\n\n### windowsPathsNoEscape\n\nUse `\\\\` as a path separator _only_, and _never_ as an escape\ncharacter. If set, all `\\\\` characters are replaced with `/` in\nthe pattern. Note that this makes it **impossible** to match\nagainst paths containing literal glob pattern characters, but\nallows matching with patterns constructed using `path.join()` and\n`path.resolve()` on Windows platforms, mimicking the (buggy!)\nbehavior of earlier versions on Windows. Please use with\ncaution, and be mindful of [the caveat about Windows\npaths](#windows).\n\nFor legacy reasons, this is also set if\n`options.allowWindowsEscape` is set to the exact value `false`.\n\n### windowsNoMagicRoot\n\nWhen a pattern starts with a UNC path or drive letter, and in\n`nocase:true` mode, do not convert the root portions of the\npattern into a case-insensitive regular expression, and instead\nleave them as strings.\n\nThis is the default when the platform is `win32` and\n`nocase:true` is set.\n\n### preserveMultipleSlashes\n\nBy default, multiple `/` characters (other than the leading `//`\nin a UNC path, see \"UNC Paths\" above) are treated as a single\n`/`.\n\nThat is, a pattern like `a///b` will match the file path `a/b`.\n\nSet `preserveMultipleSlashes: true` to suppress this behavior.\n\n### optimizationLevel\n\nA number indicating the level of optimization that should be done\nto the pattern prior to parsing and using it for matches.\n\nGlobstar parts `**` are always converted to `*` when `noglobstar`\nis set, and multiple adjacent `**` parts are converted into a\nsingle `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this\nis equivalent in all cases).\n\n- `0` - Make no further changes. In this mode, `.` and `..` are\n maintained in the pattern, meaning that they must also appear\n in the same position in the test path string. Eg, a pattern\n like `a/*/../c` will match the string `a/b/../c` but not the\n string `a/c`.\n- `1` - (default) Remove cases where a double-dot `..` follows a\n pattern portion that is not `**`, `.`, `..`, or empty `''`. For\n example, the pattern `./a/b/../*` is converted to `./a/*`, and\n so it will match the path string `./a/c`, but not the path\n string `./a/b/../c`. Dots and empty path portions in the\n pattern are preserved.\n- `2` (or higher) - Much more aggressive optimizations, suitable\n for use with file-walking cases:\n\n - Remove cases where a double-dot `..` follows a pattern\n portion that is not `**`, `.`, or empty `''`. Remove empty\n and `.` portions of the pattern, where safe to do so (ie,\n anywhere other than the last position, the first position, or\n the second position in a pattern starting with `/`, as this\n may indicate a UNC path on Windows).\n - Convert patterns containing `<pre>/**/../<p>/<rest>` into the\n equivalent `<pre>/{..,**}/<p>/<rest>`, where `<p>` is a\n a pattern portion other than `.`, `..`, `**`, or empty\n `''`.\n - Dedupe patterns where a `**` portion is present in one and\n omitted in another, and it is not the final path portion, and\n they are otherwise equivalent. So `{a/**/b,a/b}` becomes\n `a/**/b`, because `**` matches against an empty path portion.\n - Dedupe patterns where a `*` portion is present in one, and a\n non-dot pattern other than `**`, `.`, `..`, or `''` is in the\n same position in the other. So `a/{*,x}/b` becomes `a/*/b`,\n because `*` can match against `x`.\n\n While these optimizations improve the performance of\n file-walking use cases such as [glob](http://npm.im/glob) (ie,\n the reason this module exists), there are cases where it will\n fail to match a literal string that would have been matched in\n optimization level 1 or 0.\n\n Specifically, while the `Minimatch.match()` method will\n optimize the file path string in the same ways, resulting in\n the same matches, it will fail when tested with the regular\n expression provided by `Minimatch.makeRe()`, unless the path\n string is first processed with\n `minimatch.levelTwoFileOptimize()` or similar.\n\n### platform\n\nWhen set to `win32`, this will trigger all windows-specific\nbehaviors (special handling for UNC paths, and treating `\\` as\nseparators in file paths for comparison.)\n\nDefaults to the value of `process.platform`.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a\nworthwhile goal, some discrepancies exist between minimatch and\nother implementations. Some are intentional, and some are\nunavoidable.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\nNegated extglob patterns are handled as closely as possible to\nBash semantics, but there are some cases with negative extglobs\nwhich are exceedingly difficult to express in a JavaScript\nregular expression. In particular the negated pattern\n`<start>!(<pattern>*|)*` will in bash match anything that does\nnot start with `<start><pattern>`. However,\n`<start>!(<pattern>*)*` _will_ match paths starting with\n`<start><pattern>`, because the empty string can match against\nthe negated portion. In this library, `<start>!(<pattern>*|)*`\nwill _not_ match any pattern starting with `<start>`, due to a\ndifference in precisely which patterns are considered \"greedy\" in\nRegular Expressions vs bash path expansion. This may be fixable,\nbut not without incurring some complexity and performance costs,\nand the trade-off seems to not be worth pursuing.\n\nNote that `fnmatch(3)` in libc is an extremely naive string comparison\nmatcher, which does not do anything special for slashes. This library is\ndesigned to be used in glob searching and file walkers, and so it does do\nspecial things with `/`. Thus, `foo*` will not match `foo/bar` in this\nlibrary, even though it would in `fnmatch(3)`.\n","readmeFilename":"README.md"}
+{
+ "name": "minimatch",
+ "dist-tags": {
+ "latest": "9.0.5"
+ },
+ "versions": {
+ "9.0.5": {
+ "name": "minimatch",
+ "version": "9.0.5",
+ "author": {
+ "url": "http://blog.izs.me",
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "ISC",
+ "_id": "minimatch@9.0.5",
+ "bugs": {
+ "url": "https://github.com/isaacs/minimatch/issues"
+ },
+ "dist": {
+ "shasum": "d74f9dd6b57d83d8e98cfb82133b03978bc929e5",
+ "tarball": "http://localhost:4260/minimatch/minimatch-9.0.5.tgz",
+ "fileCount": 53,
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "unpackedSize": 435003
+ },
+ "main": "./dist/commonjs/index.js",
+ "tshy": {
+ "exports": {
+ ".": "./src/index.ts",
+ "./package.json": "./package.json"
+ }
+ },
+ "type": "module",
+ "types": "./dist/commonjs/index.d.ts",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "0de7f45232cad5e3e49e4eb7cd9b6e124ed04b84",
+ "scripts": {
+ "snap": "tap",
+ "test": "tap",
+ "format": "prettier --write . --loglevel warn",
+ "prepare": "tshy",
+ "presnap": "npm run prepare",
+ "pretest": "npm run prepare",
+ "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
+ "benchmark": "node benchmark/index.js",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "prettier": {
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "endOfLine": "lf",
+ "printWidth": 80,
+ "arrowParens": "avoid",
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true
+ },
+ "repository": {
+ "url": "git://github.com/isaacs/minimatch.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "a glob matcher in javascript",
+ "directories": {},
+ "_nodeVersion": "20.13.1",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^18.7.2",
+ "tshy": "^1.12.0",
+ "mkdirp": "1",
+ "ts-node": "^10.9.1",
+ "typedoc": "^0.23.21",
+ "prettier": "^2.8.2",
+ "@types/tap": "^15.0.8",
+ "typescript": "^4.9.3",
+ "@types/node": "^18.15.11",
+ "@types/brace-expansion": "^1.1.0",
+ "eslint-config-prettier": "^8.6.0"
+ }
+ }
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minimatch/issues"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/isaacs/minimatch#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/minimatch.git"
+ },
+ "description": "a glob matcher in javascript",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minipass-collect/registry.json b/tests/registry/npm/minipass-collect/registry.json
index cf2ad1dbb..372b5f206 100644
--- a/tests/registry/npm/minipass-collect/registry.json
+++ b/tests/registry/npm/minipass-collect/registry.json
@@ -1 +1,74 @@
-{"name":"minipass-collect","dist-tags":{"latest":"2.0.1"},"versions":{"2.0.1":{"name":"minipass-collect","version":"2.0.1","description":"A Minipass stream that collects all the data into a single chunk","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags"},"tap":{"check-coverage":true},"devDependencies":{"tap":"^16.3.8"},"dependencies":{"minipass":"^7.0.3"},"engines":{"node":">=16 || 14 >=14.17"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-collect.git"},"_id":"minipass-collect@2.0.1","gitHead":"a0a97f9e714fd60a3a14373c09f486309b5cc371","bugs":{"url":"https://github.com/isaacs/minipass-collect/issues"},"_nodeVersion":"18.16.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==","shasum":"1621bc77e12258a12c60d34e2276ec5c20680863","tarball":"http://localhost:4260/minipass-collect/minipass-collect-2.0.1.tgz","fileCount":4,"unpackedSize":4963,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGHm7nziWUCc9523LXf4MAFCd60uXbf2OoL2HVQAfgfnAiEAoWPujoOaz1kdIW34UYkfRWW0c500oT2p2EStSmrRRFI="}]},"directories":{},"_hasShrinkwrap":false}},"description":"A Minipass stream that collects all the data into a single chunk","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","readme":"# minipass-collect\n\nA Minipass stream that collects all the data into a single chunk\n\nNote that this buffers ALL data written to it, so it's only good for\nsituations where you are sure the entire stream fits in memory.\n\nNote: this is primarily useful for the `Collect.PassThrough` class, since\nMinipass streams already have a `.collect()` method which returns a promise\nthat resolves to the array of chunks, and a `.concat()` method that returns\nthe data concatenated into a single Buffer or String.\n\n## USAGE\n\n```js\nconst Collect = require('minipass-collect')\n\nconst collector = new Collect()\ncollector.on('data', allTheData => {\n console.log('all the data!', allTheData)\n})\n\nsomeSourceOfData.pipe(collector)\n\n// note that you can also simply do:\nsomeSourceOfData.pipe(new Minipass()).concat().then(data => ...)\n// or even, if someSourceOfData is a Minipass:\nsomeSourceOfData.concat().then(data => ...)\n// but you might prefer to have it stream-shaped rather than\n// Promise-shaped in some scenarios.\n```\n\nIf you want to collect the data, but _also_ act as a passthrough stream,\nthen use `Collect.PassThrough` instead (for example to memoize streaming\nresponses), and listen on the `collect` event.\n\n```js\nconst Collect = require('minipass-collect')\n\nconst collector = new Collect.PassThrough()\ncollector.on('collect', allTheData => {\n console.log('all the data!', allTheData)\n})\n\nsomeSourceOfData.pipe(collector).pipe(someOtherStream)\n```\n\nAll [minipass options](http://npm.im/minipass) are supported.\n","readmeFilename":"README.md","homepage":"https://github.com/isaacs/minipass-collect#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-collect.git"},"bugs":{"url":"https://github.com/isaacs/minipass-collect/issues"}}
+{
+ "name": "minipass-collect",
+ "dist-tags": {
+ "latest": "2.0.1"
+ },
+ "versions": {
+ "2.0.1": {
+ "name": "minipass-collect",
+ "version": "2.0.1",
+ "description": "A Minipass stream that collects all the data into a single chunk",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^16.3.8"
+ },
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-collect.git"
+ },
+ "_id": "minipass-collect@2.0.1",
+ "gitHead": "a0a97f9e714fd60a3a14373c09f486309b5cc371",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-collect/issues"
+ },
+ "_nodeVersion": "18.16.0",
+ "_npmVersion": "9.8.1",
+ "dist": {
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "shasum": "1621bc77e12258a12c60d34e2276ec5c20680863",
+ "tarball": "http://localhost:4260/minipass-collect/minipass-collect-2.0.1.tgz",
+ "fileCount": 4,
+ "unpackedSize": 4963
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A Minipass stream that collects all the data into a single chunk",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/isaacs/minipass-collect#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-collect.git"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-collect/issues"
+ }
+}
diff --git a/tests/registry/npm/minipass-fetch/registry.json b/tests/registry/npm/minipass-fetch/registry.json
index 1aae90b50..9c5320c1a 100644
--- a/tests/registry/npm/minipass-fetch/registry.json
+++ b/tests/registry/npm/minipass-fetch/registry.json
@@ -1 +1,105 @@
-{"name":"minipass-fetch","description":"An implementation of window.fetch in Node.js using Minipass streams","dist-tags":{"latest":"3.0.5"},"versions":{"3.0.5":{"name":"minipass-fetch","version":"3.0.5","author":{"name":"GitHub Inc."},"license":"MIT","_id":"minipass-fetch@3.0.5","bugs":{"url":"https://github.com/npm/minipass-fetch/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"],"coverage-map":"map.js","check-coverage":true},"dist":{"shasum":"f0f97e40580affc4a35cc4a1349f05ae36cb1e4c","tarball":"http://localhost:4260/minipass-fetch/minipass-fetch-3.0.5.tgz","fileCount":11,"integrity":"sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==","signatures":[{"sig":"MEUCIQCa4AG/RmwIFY2m4oi9Suf2JMV/+jm61vaQqWklyAdcogIgcqhlUvdlWGRFE5bxtFUBk6ugppYNBDgrmCON0Ckbmsc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/minipass-fetch@3.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":46849},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"d523a93cc86c79cbf28a30c77938ad71e54bc814","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","test:tls-fixtures":"./test/fixtures/tls/setup.sh","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/minipass-fetch.git","type":"git"},"_npmVersion":"10.7.0","description":"An implementation of window.fetch in Node.js using Minipass streams","directories":{},"templateOSS":{"publish":"true","version":"4.22.0","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"22.1.0","dependencies":{"minipass":"^7.0.3","minizlib":"^2.1.2","minipass-sized":"^1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.0","nock":"^13.2.4","parted":"^0.1.1","encoding":"^0.1.13","form-data":"^4.0.0","abort-controller":"^3.0.0","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0","string-to-arraybuffer":"^1.0.2","@ungap/url-search-params":"^0.2.2","abortcontroller-polyfill":"~1.7.3"},"optionalDependencies":{"encoding":"^0.1.13"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/minipass-fetch.git","type":"git"},"license":"MIT","homepage":"https://github.com/npm/minipass-fetch#readme","bugs":{"url":"https://github.com/npm/minipass-fetch/issues"},"readme":"# minipass-fetch\n\nAn implementation of window.fetch in Node.js using Minipass streams\n\nThis is a fork (or more precisely, a reimplementation) of\n[node-fetch](http://npm.im/node-fetch). All streams have been replaced\nwith [minipass streams](http://npm.im/minipass).\n\nThe goal of this module is to stay in sync with the API presented by\n`node-fetch`, with the exception of the streaming interface provided.\n\n## Why\n\nMinipass streams are faster and more deterministic in their timing contract\nthan node-core streams, making them a better fit for many server-side use\ncases.\n\n## API\n\nSee [node-fetch](http://npm.im/node-fetch)\n\nDifferences from `node-fetch` (and, by extension, from the WhatWG Fetch\nspecification):\n\n- Returns [minipass](http://npm.im/minipass) streams instead of node-core\n streams.\n- Supports the full set of [TLS Options that may be provided to\n `https.request()`](https://nodejs.org/api/https.html#https_https_request_options_callback)\n when making `https` requests.\n","readmeFilename":"README.md"}
+{
+ "name": "minipass-fetch",
+ "description": "An implementation of window.fetch in Node.js using Minipass streams",
+ "dist-tags": {
+ "latest": "3.0.5"
+ },
+ "versions": {
+ "3.0.5": {
+ "name": "minipass-fetch",
+ "version": "3.0.5",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "MIT",
+ "_id": "minipass-fetch@3.0.5",
+ "bugs": {
+ "url": "https://github.com/npm/minipass-fetch/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "coverage-map": "map.js",
+ "check-coverage": true
+ },
+ "dist": {
+ "shasum": "f0f97e40580affc4a35cc4a1349f05ae36cb1e4c",
+ "tarball": "http://localhost:4260/minipass-fetch/minipass-fetch-3.0.5.tgz",
+ "fileCount": 11,
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/minipass-fetch@3.0.5",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 46849
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "d523a93cc86c79cbf28a30c77938ad71e54bc814",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "test:tls-fixtures": "./test/fixtures/tls/setup.sh",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/minipass-fetch.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "An implementation of window.fetch in Node.js using Minipass streams",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.22.0",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "22.1.0",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minizlib": "^2.1.2",
+ "minipass-sized": "^1.0.3"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.0",
+ "nock": "^13.2.4",
+ "parted": "^0.1.1",
+ "encoding": "^0.1.13",
+ "form-data": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0",
+ "string-to-arraybuffer": "^1.0.2",
+ "@ungap/url-search-params": "^0.2.2",
+ "abortcontroller-polyfill": "~1.7.3"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/minipass-fetch.git",
+ "type": "git"
+ },
+ "license": "MIT",
+ "homepage": "https://github.com/npm/minipass-fetch#readme",
+ "bugs": {
+ "url": "https://github.com/npm/minipass-fetch/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minipass-flush/registry.json b/tests/registry/npm/minipass-flush/registry.json
index f145ecb65..52ddc966d 100644
--- a/tests/registry/npm/minipass-flush/registry.json
+++ b/tests/registry/npm/minipass-flush/registry.json
@@ -1 +1,75 @@
-{"name":"minipass-flush","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.5":{"name":"minipass-flush","version":"1.0.5","description":"A Minipass stream that calls a flush function before emitting 'end'","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true},"devDependencies":{"tap":"^14.6.9"},"dependencies":{"minipass":"^3.0.0"},"main":"index.js","repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-flush.git"},"engines":{"node":">= 8"},"gitHead":"9625266c18ca9d14bb13f85dfcdf8cb67763b14e","bugs":{"url":"https://github.com/isaacs/minipass-flush/issues"},"_id":"minipass-flush@1.0.5","_nodeVersion":"12.8.1","_npmVersion":"6.12.0-next.0","dist":{"integrity":"sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==","shasum":"82e7135d7e89a50ffe64610a787953c4c4cbb373","tarball":"http://localhost:4260/minipass-flush/minipass-flush-1.0.5.tgz","fileCount":4,"unpackedSize":3771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkmuZCRA9TVsSAnZWagAAbU0QAJZOgfwMjGwsBXsEKbe4\nkLt82NEj2aO+Hx9DqkBbt0XWoOypu9zNzY5kknQQBGSY+qT2yL0IkisbvC/c\nJkVbRj/rULVUMiYh0fzFzn2dRm7tCsDrI+KMeeGPt5jfs38ZAAnbQEMdwabI\nttqjCC5aSPBu4KZvXuadHGWtccwzkbE8ZoEr5BFFoUSR7ovVpeNkfj3mRXDh\nR0Iv/1YUqkxX3h9QMeDgFMwZTMEbxnd9noR6n71XeIv4FsIzMNf0TSNeC2Q1\nuNWYTaOTzDMCLEUHUIu6ba0tfmi9ZIqTxzJXozGX9YJ76+NoptytoK48v7Lo\nMEwfnuF/TtAAe6WGfcqHOZc0+rF1KnAJPXc05kscsLj4kh199sCDtrFmkKlT\n/I+lBtV5raSGdKVAjNC4ONnNETRij42HDVfvpuGIPUrSvXRLkrcxcjhEI8r6\nb8w8j8GodE7gAoHzUxdbcwARpPcszCOLF1Ttv5jWPSKR+pBzs/qnSDCdBcbu\nPgG5Cypac6wLcmdbpHigsvTN3rX8YHFyqf3ROypeLvxB01oTLWPPcSOf3zj3\nW+kqJ1SeiGVcp7suEbqGO5FxoBQkGm98YPXvk4uDjxQygd8iP6gG3FAR0jYu\n6i5u1TlpeNA1B3ZraveU4Uu/vpP2AL96F+ehDHQgDK4S990to6utl6Dk85HZ\nIud+\r\n=EXN3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDBlwD3arNCq9Laj2Ecw/O+KJ1u+CD2uVLIYV18eBlGAiEAhjEiSv0QdmJPic/P1y5UYL7Gnt40/D5k+MAD1mKu5wk="}]},"directories":{},"_hasShrinkwrap":false}},"description":"A Minipass stream that calls a flush function before emitting 'end'","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","readme":"# minipass-flush\n\nA Minipass stream that calls a flush function before emitting 'end'\n\n## USAGE\n\n```js\nconst Flush = require('minipass-flush')\ncons f = new Flush({\n flush (cb) {\n // call the cb when done, or return a promise\n // the 'end' event will wait for it, along with\n // close, finish, and prefinish.\n // call the cb with an error, or return a rejecting\n // promise to emit 'error' instead of doing the 'end'\n return rerouteAllEncryptions().then(() => clearAllChannels())\n },\n // all other minipass options accepted as well\n})\n\nsomeDataSource.pipe(f).on('end', () => {\n // proper flushing has been accomplished\n})\n\n// Or as a subclass implementing a 'flush' method:\nclass MyFlush extends Flush {\n flush (cb) {\n // old fashioned callback style!\n rerouteAllEncryptions(er => {\n if (er)\n return cb(er)\n clearAllChannels(er => {\n if (er)\n cb(er)\n cb()\n })\n })\n }\n}\n```\n\nThat's about it.\n\nIf your `flush` method doesn't have to do anything asynchronous, then it's\nbetter to call the callback right away in this tick, rather than returning\n`Promise.resolve()`, so that the `end` event can happen as soon as\npossible.\n","readmeFilename":"README.md","homepage":"https://github.com/isaacs/minipass-flush#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-flush.git"},"bugs":{"url":"https://github.com/isaacs/minipass-flush/issues"}}
+{
+ "name": "minipass-flush",
+ "dist-tags": {
+ "latest": "1.0.5"
+ },
+ "versions": {
+ "1.0.5": {
+ "name": "minipass-flush",
+ "version": "1.0.5",
+ "description": "A Minipass stream that calls a flush function before emitting 'end'",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^14.6.9"
+ },
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-flush.git"
+ },
+ "engines": {
+ "node": ">= 8"
+ },
+ "gitHead": "9625266c18ca9d14bb13f85dfcdf8cb67763b14e",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-flush/issues"
+ },
+ "_id": "minipass-flush@1.0.5",
+ "_nodeVersion": "12.8.1",
+ "_npmVersion": "6.12.0-next.0",
+ "dist": {
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "shasum": "82e7135d7e89a50ffe64610a787953c4c4cbb373",
+ "tarball": "http://localhost:4260/minipass-flush/minipass-flush-1.0.5.tgz",
+ "fileCount": 4,
+ "unpackedSize": 3771
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A Minipass stream that calls a flush function before emitting 'end'",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/isaacs/minipass-flush#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-flush.git"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-flush/issues"
+ }
+}
diff --git a/tests/registry/npm/minipass-pipeline/registry.json b/tests/registry/npm/minipass-pipeline/registry.json
index e3ae49fe5..8eaf31484 100644
--- a/tests/registry/npm/minipass-pipeline/registry.json
+++ b/tests/registry/npm/minipass-pipeline/registry.json
@@ -1 +1,59 @@
-{"name":"minipass-pipeline","dist-tags":{"latest":"1.2.4"},"versions":{"1.2.4":{"name":"minipass-pipeline","version":"1.2.4","description":"create a pipeline of streams using Minipass","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true},"devDependencies":{"tap":"^14.6.9"},"dependencies":{"minipass":"^3.0.0"},"engines":{"node":">=8"},"gitHead":"ead0263f019a9ec1eeb6db5da34c62479bb0a967","_id":"minipass-pipeline@1.2.4","_nodeVersion":"14.2.0","_npmVersion":"7.0.0-beta","dist":{"integrity":"sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==","shasum":"68472f79711c084657c067c5c6ad93cddea8214c","tarball":"http://localhost:4260/minipass-pipeline/minipass-pipeline-1.2.4.tgz","fileCount":4,"unpackedSize":7004,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIHD1CRA9TVsSAnZWagAA0+kP/iYjOcMFfErbQD36koDF\nQPvdz1dvzGvT8F9VqlTy317usF4sjUXjeQRf8oEZCemvQWHUToQj2pJK7T2Y\neHb/g9kHTw68fhYgKtGtsI3jfLc41s8yWQ/LfWlmGB9M+atfKGMFt48a4lCs\nohNOCOOwV2S5SEOGon3n0E0UoN3BGTubhj0s1CKftXvmwS3ZKm+fwAW+2EzW\nqQEuZOR/s/PwOmfVbIu3zOgy+YGIWPGOHX3kLQ7o7jVpSofbzqt1Y6GvZXxZ\n+/gwCNvM4gBrvQvUprqY0DBBxLv7gRnKvkr+XWhLK4UgK+KLeAZoqxbd0maX\nxU3sYYC+L9UzcwgLZTOwM6qhIRzMHolOWpFxUCYnndxH7oJqkNeaIPEqA9MW\nMlbRo9mId0VdkYZHBesYrhxOk8vH+RaONNEckZjzqZFkEQUb3IKQ1hKS+m6E\ntt/sunCfbMyhgFZ7m5YaDBPC/tYWLP62CLe6jy9XQlE9KCSznqlqnVbFgxjE\n4FqvkoHWfyaBwBz5yavmpFeiM2Aoy87C39/XJXbk2JoNW0pP+FvhvnBWFFHe\nUWp21ql+e9dOuZOksaVdRsy6ExxMdFQtdiz0v3Om4ywzXlPQMYWQdYrCTFBA\nJkAJ8KtArBx3oPWwvfk1qFz05SUv9PsE3RVw5QU+X7jvOED+PGAAvx6dZ0Za\nMJeC\r\n=oGZg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDf8v9m6p3gFue3Yjxd4e6H2T4lS3KiG/ohLPF9cT3DdAIgUryCYUg+9BioenOtYvXrslzq8FoSszqID75p3aVhCAQ="}]},"directories":{},"_hasShrinkwrap":false}},"description":"create a pipeline of streams using Minipass","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","readme":"# minipass-pipeline\n\nCreate a pipeline of streams using Minipass.\n\nCalls `.pipe()` on all the streams in the list. Returns a stream where\nwrites got to the first pipe in the chain, and reads are from the last.\n\nErrors are proxied along the chain and emitted on the Pipeline stream.\n\n## USAGE\n\n```js\nconst Pipeline = require('minipass-pipeline')\n\n// the list of streams to pipeline together,\n// a bit like `input | transform | output` in bash\nconst p = new Pipeline(input, transform, output)\n\np.write('foo') // writes to input\np.on('data', chunk => doSomething()) // reads from output stream\n\n// less contrived example (but still pretty contrived)...\nconst decode = new bunzipDecoder()\nconst unpack = tar.extract({ cwd: 'target-dir' })\nconst tbz = new Pipeline(decode, unpack)\n\nfs.createReadStream('archive.tbz').pipe(tbz)\n\n// specify any minipass options if you like, as the first argument\n// it'll only try to pipeline event emitters with a .pipe() method\nconst p = new Pipeline({ objectMode: true }, input, transform, output)\n\n// If you don't know the things to pipe in right away, that's fine.\n// use p.push(stream) to add to the end, or p.unshift(stream) to the front\nconst databaseDecoderStreamDoohickey = (connectionInfo) => {\n const p = new Pipeline()\n logIntoDatabase(connectionInfo).then(connection => {\n initializeDecoderRing(connectionInfo).then(decoderRing => {\n p.push(connection, decoderRing)\n getUpstreamSource(upstream => {\n p.unshift(upstream)\n })\n })\n })\n // return to caller right away\n // emitted data will be upstream -> connection -> decoderRing pipeline\n return p\n}\n```\n\nPipeline is a [minipass](http://npm.im/minipass) stream, so it's as\nsynchronous as the streams it wraps. It will buffer data until there is a\nreader, but no longer, so make sure to attach your listeners before you\npipe it somewhere else.\n\n## `new Pipeline(opts = {}, ...streams)`\n\nCreate a new Pipeline with the specified Minipass options and any streams\nprovided.\n\n## `pipeline.push(stream, ...)`\n\nAttach one or more streams to the pipeline at the end (read) side of the\npipe chain.\n\n## `pipeline.unshift(stream, ...)`\n\nAttach one or more streams to the pipeline at the start (write) side of the\npipe chain.\n","readmeFilename":"README.md"}
+{
+ "name": "minipass-pipeline",
+ "dist-tags": {
+ "latest": "1.2.4"
+ },
+ "versions": {
+ "1.2.4": {
+ "name": "minipass-pipeline",
+ "version": "1.2.4",
+ "description": "create a pipeline of streams using Minipass",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^14.6.9"
+ },
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "gitHead": "ead0263f019a9ec1eeb6db5da34c62479bb0a967",
+ "_id": "minipass-pipeline@1.2.4",
+ "_nodeVersion": "14.2.0",
+ "_npmVersion": "7.0.0-beta",
+ "dist": {
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "shasum": "68472f79711c084657c067c5c6ad93cddea8214c",
+ "tarball": "http://localhost:4260/minipass-pipeline/minipass-pipeline-1.2.4.tgz",
+ "fileCount": 4,
+ "unpackedSize": 7004
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "create a pipeline of streams using Minipass",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minipass-sized/registry.json b/tests/registry/npm/minipass-sized/registry.json
index 7619233fe..42a49cc60 100644
--- a/tests/registry/npm/minipass-sized/registry.json
+++ b/tests/registry/npm/minipass-sized/registry.json
@@ -1 +1,77 @@
-{"name":"minipass-sized","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.3":{"name":"minipass-sized","version":"1.0.3","description":"A Minipass stream that raises an error if you get a different number of bytes than expected","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"ISC","scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true},"devDependencies":{"tap":"^14.6.4"},"dependencies":{"minipass":"^3.0.0"},"main":"index.js","directories":{"test":"test"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-sized.git"},"engines":{"node":">=8"},"gitHead":"4314081d97c5f3f4bd4c23e380e81fd7392aaa2c","bugs":{"url":"https://github.com/isaacs/minipass-sized/issues"},"_id":"minipass-sized@1.0.3","_nodeVersion":"12.8.1","_npmVersion":"6.12.0-next.0","dist":{"integrity":"sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==","shasum":"70ee5a7c5052070afacfbc22977ea79def353b70","tarball":"http://localhost:4260/minipass-sized/minipass-sized-1.0.3.tgz","fileCount":7,"unpackedSize":123865,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkmZECRA9TVsSAnZWagAAUPcQAIf33O6EWy+mASa+JfQv\noGNPaC54UKUC/QoerRzQDLmRIEE/QkNYqMBTm6Q5uHfuecqtJDb3d1O4trFe\nM7o9ctpbjhcLkvemtgsc9fev2N6JgSY68OLrpvYqSLqedcUvomhAJxKMupLm\n97eR6MGlb2+Kstv616VlZI37O9tDeE6pvtRohI+cmvOdk2uzTByUhn7gVaql\nvlYh0z5E807Q7xmEcaR+sx6JHrOFfELdux3agnOz/LoHJw2fDPoE34uu+LLw\nrMvcp3bXYHK1m1MYouiyYS6D23OT9DN5fK6ofGvdDqR0IgsN6EelE42cxjxP\nRTzzmsP4Ccw8nffYaEnPZ5Bcar/7Q8zWUHny90+soDpFbY6PhTp6fCvRBjrT\nwj0P9HX4MOhlel6xVFIX8JPBoEqtkus0VUENze720yuI7ziscOcxG4G7rFij\nxv3iuqC03AQfIRK4zRTTrXWiUdgm68fSw6IZEp8sR4x2AkUd807/YF2prKZy\nTnbWjy2l9DSn4IkyYmVOjiNpMmCzaw9MTb6JAMfEEYmc7zlWhpOBldYvTOqS\n/AIdWQS2sZ+CnXDmnv6cQy+SqEsK337aZY0PXFoFV2RHudtcceOQMNs0Eii6\n1bZSMY3acyifsAa0yeDlY0zokUDSNat9QZYdv4r2Kujw6xsHrayJA2y3K76l\nDP/x\r\n=oVVn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtsBF/Ry3rWgEiNmHYrvXBbzV+Mm9omSjLis/aKkd95QIhAIQABBP+xC5JFzOtybiV5xZZnwCc96BDP+SRIKzJHzCF"}]},"_hasShrinkwrap":false}},"description":"A Minipass stream that raises an error if you get a different number of bytes than expected","homepage":"https://github.com/isaacs/minipass-sized#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/minipass-sized.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"bugs":{"url":"https://github.com/isaacs/minipass-sized/issues"},"license":"ISC","readme":"# minipass-sized\n\nA Minipass stream that raises an error if you get a different number of\nbytes than expected.\n\n## USAGE\n\nUse just like any old [minipass](http://npm.im/minipass) stream, but\nprovide a `size` option to the constructor.\n\nThe `size` option must be a positive integer, smaller than\n`Number.MAX_SAFE_INTEGER`.\n\n```js\nconst MinipassSized = require('minipass-sized')\n// figure out how much data you expect to get\nconst expectedSize = +headers['content-length']\nconst stream = new MinipassSized({ size: expectedSize })\nstream.on('error', er => {\n // if it's the wrong size, then this will raise an error with\n // { found: <number>, expect: <number>, code: 'EBADSIZE' }\n})\nresponse.pipe(stream)\n```\n\nCaveats: this does not work with `objectMode` streams, and will throw a\n`TypeError` from the constructor if the size argument is missing or\ninvalid.\n","readmeFilename":"README.md"}
+{
+ "name": "minipass-sized",
+ "dist-tags": {
+ "latest": "1.0.3"
+ },
+ "versions": {
+ "1.0.3": {
+ "name": "minipass-sized",
+ "version": "1.0.3",
+ "description": "A Minipass stream that raises an error if you get a different number of bytes than expected",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^14.6.4"
+ },
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-sized.git"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "gitHead": "4314081d97c5f3f4bd4c23e380e81fd7392aaa2c",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-sized/issues"
+ },
+ "_id": "minipass-sized@1.0.3",
+ "_nodeVersion": "12.8.1",
+ "_npmVersion": "6.12.0-next.0",
+ "dist": {
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "shasum": "70ee5a7c5052070afacfbc22977ea79def353b70",
+ "tarball": "http://localhost:4260/minipass-sized/minipass-sized-1.0.3.tgz",
+ "fileCount": 7,
+ "unpackedSize": 123865
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A Minipass stream that raises an error if you get a different number of bytes than expected",
+ "homepage": "https://github.com/isaacs/minipass-sized#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass-sized.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass-sized/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minipass/registry.json b/tests/registry/npm/minipass/registry.json
index 2c5335afd..7cebe6a81 100644
--- a/tests/registry/npm/minipass/registry.json
+++ b/tests/registry/npm/minipass/registry.json
@@ -1 +1,277 @@
-{"name":"minipass","description":"minimal implementation of a PassThrough stream","dist-tags":{"latest":"7.1.2"},"versions":{"3.3.6":{"name":"minipass","version":"3.3.6","description":"minimal implementation of a PassThrough stream","main":"index.js","types":"index.d.ts","dependencies":{"yallist":"^4.0.0"},"devDependencies":{"@types/node":"^17.0.41","end-of-stream":"^1.4.0","prettier":"^2.6.2","tap":"^16.2.0","through2":"^2.0.3","ts-node":"^10.8.1","typescript":"^4.7.3"},"scripts":{"test":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minipass.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","tap":{"check-coverage":true},"engines":{"node":">=8"},"prettier":{"semi":false,"printWidth":80,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"gitHead":"52ab642fa447419dca139ce29fad780dd61a27af","bugs":{"url":"https://github.com/isaacs/minipass/issues"},"_id":"minipass@3.3.6","_nodeVersion":"18.12.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==","shasum":"7bba384db3a1520d18c9c0e5251c3444e95dd94a","tarball":"http://localhost:4260/minipass/minipass-3.3.6.tgz","fileCount":5,"unpackedSize":48090,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICmszgh/M4TJhGylTbFqjQUzPzClnto3r6OliGcTp3y+AiAiNeWHb8PcbXkrt2SUIzL/A8WTAjcux3k70LkTdjdkIQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjgHTIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoj8w//fGj3vpiV9bJwZssFywHgmSLaZkdfFJ0hyuXS8M5+8mSYkQEs\r\nWx3vT+Z1f6Q4/UB0ZaFFlSOlE29hTjfTBoRp7yTH42ImYgnqJh9jlBnQuiB9\r\nbcGpEEvLm+xzNjqSryFPJ0AaZApeufHjFMW5aDgiFsTFH37BB4r/WB5WYUsi\r\nzVMPQWvdMMY8zKENQFxRYmOEgARHq7InF8F/YXkxIOwafGSReo90k8DFiIo9\r\ncK2gMR/TieF0NW51Ji1WjgJJlz2PeSfNveufKVgaMm7psECm0gpVWuu159io\r\nX8xQZhX8pd8grOx9UTL70Eas6010MPeoNKERFxDvVdQ+pE3At34SXluKd6+b\r\nKGT+xvrFruyQkajHRrUOY3Xto8+D48T2pj2BYyA+djYRkodwXVkKrJQMVog+\r\n8STrMhYF3SmVpLJT8etQ5dHDmkDbM4xQg5wxrAuzTiw63yOfZK3/YDVfcRmA\r\nRrqTjc5u29vpZxiSHCajI6ODDACNQa7m2TdE0j1LvgCHb0CD7heqSrXVdS2M\r\nUp8oH27tnYQEq11C711ULFPs+47ArnHDgNRjseOe1VhLWtNGBGuXIa7TJZj9\r\n5mHNO+13DDXtfQRiTrz9jRQgUUime8LAum3Z39v/BytWBSfVS93F7vVFwmef\r\nu+hUditRmZHNTHHRs93XAtdlz3GrdsGnFlw=\r\n=S0p7\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false},"5.0.0":{"name":"minipass","version":"5.0.0","description":"minimal implementation of a PassThrough stream","main":"./index.js","module":"./index.mjs","types":"./index.d.ts","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}},"./package.json":"./package.json"},"devDependencies":{"@types/node":"^17.0.41","end-of-stream":"^1.4.0","node-abort-controller":"^3.1.1","prettier":"^2.6.2","tap":"^16.2.0","through2":"^2.0.3","ts-node":"^10.8.1","typedoc":"^0.23.24","typescript":"^4.7.3"},"scripts":{"pretest":"npm run prepare","presnap":"npm run prepare","prepare":"node ./scripts/transpile-to-esm.js","snap":"tap","test":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags","typedoc":"typedoc ./index.d.ts","format":"prettier --write . --loglevel warn"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minipass.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","tap":{"check-coverage":true},"engines":{"node":">=8"},"prettier":{"semi":false,"printWidth":80,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"gitHead":"3066600b811753bd9c85831a8ecd5c6ca248f2aa","bugs":{"url":"https://github.com/isaacs/minipass/issues"},"_id":"minipass@5.0.0","_nodeVersion":"18.14.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==","shasum":"3e9788ffb90b694a5d0ec94479a45b5d8738133d","tarball":"http://localhost:4260/minipass/minipass-5.0.0.tgz","fileCount":6,"unpackedSize":69475,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGG9d/n9j/SiJwfKLK58G4W+KXXHLm/aIadRa/mJxsnFAiAMhpcZ9419dsyFB+8n8uTkyWOkalIM/OsqBG4PrBM2lA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkMzQCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrbsQ//brt9nqdgncqvwVSLdtzC7rp53x+Q7gIYj9/fPCRFwJvFG98V\r\nRwhWWlSbFcbHyZDb8qCTK63KLICw4d6ha3SjKV3ZNX/+Xd7Qr4HbCp+ELyRs\r\n1+8EyQQdtcJcMAYnUBhG/wV3+h9gLgc8AY47iFColB5GJahS38Ua7lcQ5vU3\r\ncGmt1oiL5pnCAe8r/d4OT4k/0LIidvw7NDmXEOM6mknIFNyag4HPnDpczm0y\r\nbcBVHDGq7WMvysCjsgJOjxNb/CApOHx33z5qqbdmAKQLDVADjfQ/9gBPWOZ7\r\n5hSeSA30oyzZZR/vAlWKkK32hqIAuNq+/w+73s6flQB90Mccqia7F7Ahq43S\r\nioWBJ1frTjhlrPX0jmItGDDJLRRKS7kNm1TObWj5B4WWdJGPlWaNJi07VJkM\r\nJ5ubvfbPGH3zQZt9i5dK60UPBbB/Pm5ZtSUE5TugTuxM+hXTSxzJHgtrNzwU\r\nFFkxVaEBeFgfuUXiSnwiDI4bpCRmB/RByyMcIKT1LhO7V+3KKl2s1nd3+5V4\r\njoa6r1d33dG7eUacD+ijDrLzQzCj/2rwm9cgccsG2XdWjbudkaZBfgySQ+ka\r\niGsmYH1MfCpGzrKr+DgtQn0crIMh/0UdTmbh3NFdm24C2PeiskcfggYaj/Xn\r\nR2ROnLecGp3aTTn6W5PCRkeZW2GgCQDcR+Y=\r\n=ZOod\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false},"7.1.2":{"name":"minipass","version":"7.1.2","description":"minimal implementation of a PassThrough stream","main":"./dist/commonjs/index.js","types":"./dist/commonjs/index.d.ts","type":"module","tshy":{"selfLink":false,"main":true,"exports":{"./package.json":"./package.json",".":"./src/index.ts"}},"exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}}},"scripts":{"preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","prepare":"tshy","pretest":"npm run prepare","presnap":"npm run prepare","test":"tap","snap":"tap","format":"prettier --write . --loglevel warn","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts"},"prettier":{"semi":false,"printWidth":75,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"devDependencies":{"@types/end-of-stream":"^1.4.2","@types/node":"^20.1.2","end-of-stream":"^1.4.0","node-abort-controller":"^3.1.1","prettier":"^2.6.2","tap":"^19.0.0","through2":"^2.0.3","tshy":"^1.14.0","typedoc":"^0.25.1"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minipass.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","engines":{"node":">=16 || 14 >=14.17"},"tap":{"typecheck":true,"include":["test/*.ts"]},"_id":"minipass@7.1.2","gitHead":"1fc7b914533c367ac00a982051849add2169f641","bugs":{"url":"https://github.com/isaacs/minipass/issues"},"_nodeVersion":"20.13.1","_npmVersion":"10.7.0","dist":{"integrity":"sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==","shasum":"93a9626ce5e5e66bd4db86849e7515e92340a707","tarball":"http://localhost:4260/minipass/minipass-7.1.2.tgz","fileCount":13,"unpackedSize":286202,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBkQJPfSAC23QGJC4cJMYAUXpqqVOq4t69yc/4rkRU3GAiEAl4BdS3v8U/I+g+Na71CrCfplx3P1Z2lvj7NBGdATUR8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# minipass\n\nA _very_ minimal implementation of a [PassThrough\nstream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough)\n\n[It's very\nfast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing)\nfor objects, strings, and buffers.\n\nSupports `pipe()`ing (including multi-`pipe()` and backpressure\ntransmission), buffering data until either a `data` event handler\nor `pipe()` is added (so you don't lose the first chunk), and\nmost other cases where PassThrough is a good idea.\n\nThere is a `read()` method, but it's much more efficient to\nconsume data from this stream via `'data'` events or by calling\n`pipe()` into some other stream. Calling `read()` requires the\nbuffer to be flattened in some cases, which requires copying\nmemory.\n\nIf you set `objectMode: true` in the options, then whatever is\nwritten will be emitted. Otherwise, it'll do a minimal amount of\nBuffer copying to ensure proper Streams semantics when `read(n)`\nis called.\n\n`objectMode` can only be set at instantiation. Attempting to\nwrite something other than a String or Buffer without having set\n`objectMode` in the options will throw an error.\n\nThis is not a `through` or `through2` stream. It doesn't\ntransform the data, it just passes it right through. If you want\nto transform the data, extend the class, and override the\n`write()` method. Once you're done transforming the data however\nyou want, call `super.write()` with the transform output.\n\nFor some examples of streams that extend Minipass in various\nways, check out:\n\n- [minizlib](http://npm.im/minizlib)\n- [fs-minipass](http://npm.im/fs-minipass)\n- [tar](http://npm.im/tar)\n- [minipass-collect](http://npm.im/minipass-collect)\n- [minipass-flush](http://npm.im/minipass-flush)\n- [minipass-pipeline](http://npm.im/minipass-pipeline)\n- [tap](http://npm.im/tap)\n- [tap-parser](http://npm.im/tap-parser)\n- [treport](http://npm.im/treport)\n- [minipass-fetch](http://npm.im/minipass-fetch)\n- [pacote](http://npm.im/pacote)\n- [make-fetch-happen](http://npm.im/make-fetch-happen)\n- [cacache](http://npm.im/cacache)\n- [ssri](http://npm.im/ssri)\n- [npm-registry-fetch](http://npm.im/npm-registry-fetch)\n- [minipass-json-stream](http://npm.im/minipass-json-stream)\n- [minipass-sized](http://npm.im/minipass-sized)\n\n## Usage in TypeScript\n\nThe `Minipass` class takes three type template definitions:\n\n- `RType` the type being read, which defaults to `Buffer`. If\n `RType` is `string`, then the constructor _must_ get an options\n object specifying either an `encoding` or `objectMode: true`.\n If it's anything other than `string` or `Buffer`, then it\n _must_ get an options object specifying `objectMode: true`.\n- `WType` the type being written. If `RType` is `Buffer` or\n `string`, then this defaults to `ContiguousData` (Buffer,\n string, ArrayBuffer, or ArrayBufferView). Otherwise, it\n defaults to `RType`.\n- `Events` type mapping event names to the arguments emitted\n with that event, which extends `Minipass.Events`.\n\nTo declare types for custom events in subclasses, extend the\nthird parameter with your own event signatures. For example:\n\n```js\nimport { Minipass } from 'minipass'\n\n// a NDJSON stream that emits 'jsonError' when it can't stringify\nexport interface Events extends Minipass.Events {\n jsonError: [e: Error]\n}\n\nexport class NDJSONStream extends Minipass<string, any, Events> {\n constructor() {\n super({ objectMode: true })\n }\n\n // data is type `any` because that's WType\n write(data, encoding, cb) {\n try {\n const json = JSON.stringify(data)\n return super.write(json + '\\n', encoding, cb)\n } catch (er) {\n if (!er instanceof Error) {\n er = Object.assign(new Error('json stringify failed'), {\n cause: er,\n })\n }\n // trying to emit with something OTHER than an error will\n // fail, because we declared the event arguments type.\n this.emit('jsonError', er)\n }\n }\n}\n\nconst s = new NDJSONStream()\ns.on('jsonError', e => {\n // here, TS knows that e is an Error\n})\n```\n\nEmitting/handling events that aren't declared in this way is\nfine, but the arguments will be typed as `unknown`.\n\n## Differences from Node.js Streams\n\nThere are several things that make Minipass streams different\nfrom (and in some ways superior to) Node.js core streams.\n\nPlease read these caveats if you are familiar with node-core\nstreams and intend to use Minipass streams in your programs.\n\nYou can avoid most of these differences entirely (for a very\nsmall performance penalty) by setting `{async: true}` in the\nconstructor options.\n\n### Timing\n\nMinipass streams are designed to support synchronous use-cases.\nThus, data is emitted as soon as it is available, always. It is\nbuffered until read, but no longer. Another way to look at it is\nthat Minipass streams are exactly as synchronous as the logic\nthat writes into them.\n\nThis can be surprising if your code relies on\n`PassThrough.write()` always providing data on the next tick\nrather than the current one, or being able to call `resume()` and\nnot have the entire buffer disappear immediately.\n\nHowever, without this synchronicity guarantee, there would be no\nway for Minipass to achieve the speeds it does, or support the\nsynchronous use cases that it does. Simply put, waiting takes\ntime.\n\nThis non-deferring approach makes Minipass streams much easier to\nreason about, especially in the context of Promises and other\nflow-control mechanisms.\n\nExample:\n\n```js\n// hybrid module, either works\nimport { Minipass } from 'minipass'\n// or:\nconst { Minipass } = require('minipass')\n\nconst stream = new Minipass()\nstream.on('data', () => console.log('data event'))\nconsole.log('before write')\nstream.write('hello')\nconsole.log('after write')\n// output:\n// before write\n// data event\n// after write\n```\n\n### Exception: Async Opt-In\n\nIf you wish to have a Minipass stream with behavior that more\nclosely mimics Node.js core streams, you can set the stream in\nasync mode either by setting `async: true` in the constructor\noptions, or by setting `stream.async = true` later on.\n\n```js\n// hybrid module, either works\nimport { Minipass } from 'minipass'\n// or:\nconst { Minipass } = require('minipass')\n\nconst asyncStream = new Minipass({ async: true })\nasyncStream.on('data', () => console.log('data event'))\nconsole.log('before write')\nasyncStream.write('hello')\nconsole.log('after write')\n// output:\n// before write\n// after write\n// data event <-- this is deferred until the next tick\n```\n\nSwitching _out_ of async mode is unsafe, as it could cause data\ncorruption, and so is not enabled. Example:\n\n```js\nimport { Minipass } from 'minipass'\nconst stream = new Minipass({ encoding: 'utf8' })\nstream.on('data', chunk => console.log(chunk))\nstream.async = true\nconsole.log('before writes')\nstream.write('hello')\nsetStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist!\nstream.write('world')\nconsole.log('after writes')\n// hypothetical output would be:\n// before writes\n// world\n// after writes\n// hello\n// NOT GOOD!\n```\n\nTo avoid this problem, once set into async mode, any attempt to\nmake the stream sync again will be ignored.\n\n```js\nconst { Minipass } = require('minipass')\nconst stream = new Minipass({ encoding: 'utf8' })\nstream.on('data', chunk => console.log(chunk))\nstream.async = true\nconsole.log('before writes')\nstream.write('hello')\nstream.async = false // <-- no-op, stream already async\nstream.write('world')\nconsole.log('after writes')\n// actual output:\n// before writes\n// after writes\n// hello\n// world\n```\n\n### No High/Low Water Marks\n\nNode.js core streams will optimistically fill up a buffer,\nreturning `true` on all writes until the limit is hit, even if\nthe data has nowhere to go. Then, they will not attempt to draw\nmore data in until the buffer size dips below a minimum value.\n\nMinipass streams are much simpler. The `write()` method will\nreturn `true` if the data has somewhere to go (which is to say,\ngiven the timing guarantees, that the data is already there by\nthe time `write()` returns).\n\nIf the data has nowhere to go, then `write()` returns false, and\nthe data sits in a buffer, to be drained out immediately as soon\nas anyone consumes it.\n\nSince nothing is ever buffered unnecessarily, there is much less\ncopying data, and less bookkeeping about buffer capacity levels.\n\n### Hazards of Buffering (or: Why Minipass Is So Fast)\n\nSince data written to a Minipass stream is immediately written\nall the way through the pipeline, and `write()` always returns\ntrue/false based on whether the data was fully flushed,\nbackpressure is communicated immediately to the upstream caller.\nThis minimizes buffering.\n\nConsider this case:\n\n```js\nconst { PassThrough } = require('stream')\nconst p1 = new PassThrough({ highWaterMark: 1024 })\nconst p2 = new PassThrough({ highWaterMark: 1024 })\nconst p3 = new PassThrough({ highWaterMark: 1024 })\nconst p4 = new PassThrough({ highWaterMark: 1024 })\n\np1.pipe(p2).pipe(p3).pipe(p4)\np4.on('data', () => console.log('made it through'))\n\n// this returns false and buffers, then writes to p2 on next tick (1)\n// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2)\n// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3)\n// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain'\n// on next tick (4)\n// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and\n// 'drain' on next tick (5)\n// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6)\n// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next\n// tick (7)\n\np1.write(Buffer.alloc(2048)) // returns false\n```\n\nAlong the way, the data was buffered and deferred at each stage,\nand multiple event deferrals happened, for an unblocked pipeline\nwhere it was perfectly safe to write all the way through!\n\nFurthermore, setting a `highWaterMark` of `1024` might lead\nsomeone reading the code to think an advisory maximum of 1KiB is\nbeing set for the pipeline. However, the actual advisory\nbuffering level is the _sum_ of `highWaterMark` values, since\neach one has its own bucket.\n\nConsider the Minipass case:\n\n```js\nconst m1 = new Minipass()\nconst m2 = new Minipass()\nconst m3 = new Minipass()\nconst m4 = new Minipass()\n\nm1.pipe(m2).pipe(m3).pipe(m4)\nm4.on('data', () => console.log('made it through'))\n\n// m1 is flowing, so it writes the data to m2 immediately\n// m2 is flowing, so it writes the data to m3 immediately\n// m3 is flowing, so it writes the data to m4 immediately\n// m4 is flowing, so it fires the 'data' event immediately, returns true\n// m4's write returned true, so m3 is still flowing, returns true\n// m3's write returned true, so m2 is still flowing, returns true\n// m2's write returned true, so m1 is still flowing, returns true\n// No event deferrals or buffering along the way!\n\nm1.write(Buffer.alloc(2048)) // returns true\n```\n\nIt is extremely unlikely that you _don't_ want to buffer any data\nwritten, or _ever_ buffer data that can be flushed all the way\nthrough. Neither node-core streams nor Minipass ever fail to\nbuffer written data, but node-core streams do a lot of\nunnecessary buffering and pausing.\n\nAs always, the faster implementation is the one that does less\nstuff and waits less time to do it.\n\n### Immediately emit `end` for empty streams (when not paused)\n\nIf a stream is not paused, and `end()` is called before writing\nany data into it, then it will emit `end` immediately.\n\nIf you have logic that occurs on the `end` event which you don't\nwant to potentially happen immediately (for example, closing file\ndescriptors, moving on to the next entry in an archive parse\nstream, etc.) then be sure to call `stream.pause()` on creation,\nand then `stream.resume()` once you are ready to respond to the\n`end` event.\n\nHowever, this is _usually_ not a problem because:\n\n### Emit `end` When Asked\n\nOne hazard of immediately emitting `'end'` is that you may not\nyet have had a chance to add a listener. In order to avoid this\nhazard, Minipass streams safely re-emit the `'end'` event if a\nnew listener is added after `'end'` has been emitted.\n\nIe, if you do `stream.on('end', someFunction)`, and the stream\nhas already emitted `end`, then it will call the handler right\naway. (You can think of this somewhat like attaching a new\n`.then(fn)` to a previously-resolved Promise.)\n\nTo prevent calling handlers multiple times who would not expect\nmultiple ends to occur, all listeners are removed from the\n`'end'` event whenever it is emitted.\n\n### Emit `error` When Asked\n\nThe most recent error object passed to the `'error'` event is\nstored on the stream. If a new `'error'` event handler is added,\nand an error was previously emitted, then the event handler will\nbe called immediately (or on `process.nextTick` in the case of\nasync streams).\n\nThis makes it much more difficult to end up trying to interact\nwith a broken stream, if the error handler is added after an\nerror was previously emitted.\n\n### Impact of \"immediate flow\" on Tee-streams\n\nA \"tee stream\" is a stream piping to multiple destinations:\n\n```js\nconst tee = new Minipass()\nt.pipe(dest1)\nt.pipe(dest2)\nt.write('foo') // goes to both destinations\n```\n\nSince Minipass streams _immediately_ process any pending data\nthrough the pipeline when a new pipe destination is added, this\ncan have surprising effects, especially when a stream comes in\nfrom some other function and may or may not have data in its\nbuffer.\n\n```js\n// WARNING! WILL LOSE DATA!\nconst src = new Minipass()\nsrc.write('foo')\nsrc.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone\nsrc.pipe(dest2) // gets nothing!\n```\n\nOne solution is to create a dedicated tee-stream junction that\npipes to both locations, and then pipe to _that_ instead.\n\n```js\n// Safe example: tee to both places\nconst src = new Minipass()\nsrc.write('foo')\nconst tee = new Minipass()\ntee.pipe(dest1)\ntee.pipe(dest2)\nsrc.pipe(tee) // tee gets 'foo', pipes to both locations\n```\n\nThe same caveat applies to `on('data')` event listeners. The\nfirst one added will _immediately_ receive all of the data,\nleaving nothing for the second:\n\n```js\n// WARNING! WILL LOSE DATA!\nconst src = new Minipass()\nsrc.write('foo')\nsrc.on('data', handler1) // receives 'foo' right away\nsrc.on('data', handler2) // nothing to see here!\n```\n\nUsing a dedicated tee-stream can be used in this case as well:\n\n```js\n// Safe example: tee to both data handlers\nconst src = new Minipass()\nsrc.write('foo')\nconst tee = new Minipass()\ntee.on('data', handler1)\ntee.on('data', handler2)\nsrc.pipe(tee)\n```\n\nAll of the hazards in this section are avoided by setting `{\nasync: true }` in the Minipass constructor, or by setting\n`stream.async = true` afterwards. Note that this does add some\noverhead, so should only be done in cases where you are willing\nto lose a bit of performance in order to avoid having to refactor\nprogram logic.\n\n## USAGE\n\nIt's a stream! Use it like a stream and it'll most likely do what\nyou want.\n\n```js\nimport { Minipass } from 'minipass'\nconst mp = new Minipass(options) // options is optional\nmp.write('foo')\nmp.pipe(someOtherStream)\nmp.end('bar')\n```\n\n### OPTIONS\n\n- `encoding` How would you like the data coming _out_ of the\n stream to be encoded? Accepts any values that can be passed to\n `Buffer.toString()`.\n- `objectMode` Emit data exactly as it comes in. This will be\n flipped on by default if you write() something other than a\n string or Buffer at any point. Setting `objectMode: true` will\n prevent setting any encoding value.\n- `async` Defaults to `false`. Set to `true` to defer data\n emission until next tick. This reduces performance slightly,\n but makes Minipass streams use timing behavior closer to Node\n core streams. See [Timing](#timing) for more details.\n- `signal` An `AbortSignal` that will cause the stream to unhook\n itself from everything and become as inert as possible. Note\n that providing a `signal` parameter will make `'error'` events\n no longer throw if they are unhandled, but they will still be\n emitted to handlers if any are attached.\n\n### API\n\nImplements the user-facing portions of Node.js's `Readable` and\n`Writable` streams.\n\n### Methods\n\n- `write(chunk, [encoding], [callback])` - Put data in. (Note\n that, in the base Minipass class, the same data will come out.)\n Returns `false` if the stream will buffer the next write, or\n true if it's still in \"flowing\" mode.\n- `end([chunk, [encoding]], [callback])` - Signal that you have\n no more data to write. This will queue an `end` event to be\n fired when all the data has been consumed.\n- `pause()` - No more data for a while, please. This also\n prevents `end` from being emitted for empty streams until the\n stream is resumed.\n- `resume()` - Resume the stream. If there's data in the buffer,\n it is all discarded. Any buffered events are immediately\n emitted.\n- `pipe(dest)` - Send all output to the stream provided. When\n data is emitted, it is immediately written to any and all pipe\n destinations. (Or written on next tick in `async` mode.)\n- `unpipe(dest)` - Stop piping to the destination stream. This is\n immediate, meaning that any asynchronously queued data will\n _not_ make it to the destination when running in `async` mode.\n - `options.end` - Boolean, end the destination stream when the\n source stream ends. Default `true`.\n - `options.proxyErrors` - Boolean, proxy `error` events from\n the source stream to the destination stream. Note that errors\n are _not_ proxied after the pipeline terminates, either due\n to the source emitting `'end'` or manually unpiping with\n `src.unpipe(dest)`. Default `false`.\n- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are\n EventEmitters. Some events are given special treatment,\n however. (See below under \"events\".)\n- `promise()` - Returns a Promise that resolves when the stream\n emits `end`, or rejects if the stream emits `error`.\n- `collect()` - Return a Promise that resolves on `end` with an\n array containing each chunk of data that was emitted, or\n rejects if the stream emits `error`. Note that this consumes\n the stream data.\n- `concat()` - Same as `collect()`, but concatenates the data\n into a single Buffer object. Will reject the returned promise\n if the stream is in objectMode, or if it goes into objectMode\n by the end of the data.\n- `read(n)` - Consume `n` bytes of data out of the buffer. If `n`\n is not provided, then consume all of it. If `n` bytes are not\n available, then it returns null. **Note** consuming streams in\n this way is less efficient, and can lead to unnecessary Buffer\n copying.\n- `destroy([er])` - Destroy the stream. If an error is provided,\n then an `'error'` event is emitted. If the stream has a\n `close()` method, and has not emitted a `'close'` event yet,\n then `stream.close()` will be called. Any Promises returned by\n `.promise()`, `.collect()` or `.concat()` will be rejected.\n After being destroyed, writing to the stream will emit an\n error. No more data will be emitted if the stream is destroyed,\n even if it was previously buffered.\n\n### Properties\n\n- `bufferLength` Read-only. Total number of bytes buffered, or in\n the case of objectMode, the total number of objects.\n- `encoding` Read-only. The encoding that has been set.\n- `flowing` Read-only. Boolean indicating whether a chunk written\n to the stream will be immediately emitted.\n- `emittedEnd` Read-only. Boolean indicating whether the end-ish\n events (ie, `end`, `prefinish`, `finish`) have been emitted.\n Note that listening on any end-ish event will immediateyl\n re-emit it if it has already been emitted.\n- `writable` Whether the stream is writable. Default `true`. Set\n to `false` when `end()`\n- `readable` Whether the stream is readable. Default `true`.\n- `pipes` An array of Pipe objects referencing streams that this\n stream is piping into.\n- `destroyed` A getter that indicates whether the stream was\n destroyed.\n- `paused` True if the stream has been explicitly paused,\n otherwise false.\n- `objectMode` Indicates whether the stream is in `objectMode`.\n- `aborted` Readonly property set when the `AbortSignal`\n dispatches an `abort` event.\n\n### Events\n\n- `data` Emitted when there's data to read. Argument is the data\n to read. This is never emitted while not flowing. If a listener\n is attached, that will resume the stream.\n- `end` Emitted when there's no more data to read. This will be\n emitted immediately for empty streams when `end()` is called.\n If a listener is attached, and `end` was already emitted, then\n it will be emitted again. All listeners are removed when `end`\n is emitted.\n- `prefinish` An end-ish event that follows the same logic as\n `end` and is emitted in the same conditions where `end` is\n emitted. Emitted after `'end'`.\n- `finish` An end-ish event that follows the same logic as `end`\n and is emitted in the same conditions where `end` is emitted.\n Emitted after `'prefinish'`.\n- `close` An indication that an underlying resource has been\n released. Minipass does not emit this event, but will defer it\n until after `end` has been emitted, since it throws off some\n stream libraries otherwise.\n- `drain` Emitted when the internal buffer empties, and it is\n again suitable to `write()` into the stream.\n- `readable` Emitted when data is buffered and ready to be read\n by a consumer.\n- `resume` Emitted when stream changes state from buffering to\n flowing mode. (Ie, when `resume` is called, `pipe` is called,\n or a `data` event listener is added.)\n\n### Static Methods\n\n- `Minipass.isStream(stream)` Returns `true` if the argument is a\n stream, and false otherwise. To be considered a stream, the\n object must be either an instance of Minipass, or an\n EventEmitter that has either a `pipe()` method, or both\n `write()` and `end()` methods. (Pretty much any stream in\n node-land will return `true` for this.)\n\n## EXAMPLES\n\nHere are some examples of things you can do with Minipass\nstreams.\n\n### simple \"are you done yet\" promise\n\n```js\nmp.promise().then(\n () => {\n // stream is finished\n },\n er => {\n // stream emitted an error\n }\n)\n```\n\n### collecting\n\n```js\nmp.collect().then(all => {\n // all is an array of all the data emitted\n // encoding is supported in this case, so\n // so the result will be a collection of strings if\n // an encoding is specified, or buffers/objects if not.\n //\n // In an async function, you may do\n // const data = await stream.collect()\n})\n```\n\n### collecting into a single blob\n\nThis is a bit slower because it concatenates the data into one\nchunk for you, but if you're going to do it yourself anyway, it's\nconvenient this way:\n\n```js\nmp.concat().then(onebigchunk => {\n // onebigchunk is a string if the stream\n // had an encoding set, or a buffer otherwise.\n})\n```\n\n### iteration\n\nYou can iterate over streams synchronously or asynchronously in\nplatforms that support it.\n\nSynchronous iteration will end when the currently available data\nis consumed, even if the `end` event has not been reached. In\nstring and buffer mode, the data is concatenated, so unless\nmultiple writes are occurring in the same tick as the `read()`,\nsync iteration loops will generally only have a single iteration.\n\nTo consume chunks in this way exactly as they have been written,\nwith no flattening, create the stream with the `{ objectMode:\ntrue }` option.\n\n```js\nconst mp = new Minipass({ objectMode: true })\nmp.write('a')\nmp.write('b')\nfor (let letter of mp) {\n console.log(letter) // a, b\n}\nmp.write('c')\nmp.write('d')\nfor (let letter of mp) {\n console.log(letter) // c, d\n}\nmp.write('e')\nmp.end()\nfor (let letter of mp) {\n console.log(letter) // e\n}\nfor (let letter of mp) {\n console.log(letter) // nothing\n}\n```\n\nAsynchronous iteration will continue until the end event is reached,\nconsuming all of the data.\n\n```js\nconst mp = new Minipass({ encoding: 'utf8' })\n\n// some source of some data\nlet i = 5\nconst inter = setInterval(() => {\n if (i-- > 0) mp.write(Buffer.from('foo\\n', 'utf8'))\n else {\n mp.end()\n clearInterval(inter)\n }\n}, 100)\n\n// consume the data with asynchronous iteration\nasync function consume() {\n for await (let chunk of mp) {\n console.log(chunk)\n }\n return 'ok'\n}\n\nconsume().then(res => console.log(res))\n// logs `foo\\n` 5 times, and then `ok`\n```\n\n### subclass that `console.log()`s everything written into it\n\n```js\nclass Logger extends Minipass {\n write(chunk, encoding, callback) {\n console.log('WRITE', chunk, encoding)\n return super.write(chunk, encoding, callback)\n }\n end(chunk, encoding, callback) {\n console.log('END', chunk, encoding)\n return super.end(chunk, encoding, callback)\n }\n}\n\nsomeSource.pipe(new Logger()).pipe(someDest)\n```\n\n### same thing, but using an inline anonymous class\n\n```js\n// js classes are fun\nsomeSource\n .pipe(\n new (class extends Minipass {\n emit(ev, ...data) {\n // let's also log events, because debugging some weird thing\n console.log('EMIT', ev)\n return super.emit(ev, ...data)\n }\n write(chunk, encoding, callback) {\n console.log('WRITE', chunk, encoding)\n return super.write(chunk, encoding, callback)\n }\n end(chunk, encoding, callback) {\n console.log('END', chunk, encoding)\n return super.end(chunk, encoding, callback)\n }\n })()\n )\n .pipe(someDest)\n```\n\n### subclass that defers 'end' for some reason\n\n```js\nclass SlowEnd extends Minipass {\n emit(ev, ...args) {\n if (ev === 'end') {\n console.log('going to end, hold on a sec')\n setTimeout(() => {\n console.log('ok, ready to end now')\n super.emit('end', ...args)\n }, 100)\n return true\n } else {\n return super.emit(ev, ...args)\n }\n }\n}\n```\n\n### transform that creates newline-delimited JSON\n\n```js\nclass NDJSONEncode extends Minipass {\n write(obj, cb) {\n try {\n // JSON.stringify can throw, emit an error on that\n return super.write(JSON.stringify(obj) + '\\n', 'utf8', cb)\n } catch (er) {\n this.emit('error', er)\n }\n }\n end(obj, cb) {\n if (typeof obj === 'function') {\n cb = obj\n obj = undefined\n }\n if (obj !== undefined) {\n this.write(obj)\n }\n return super.end(cb)\n }\n}\n```\n\n### transform that parses newline-delimited JSON\n\n```js\nclass NDJSONDecode extends Minipass {\n constructor(options) {\n // always be in object mode, as far as Minipass is concerned\n super({ objectMode: true })\n this._jsonBuffer = ''\n }\n write(chunk, encoding, cb) {\n if (\n typeof chunk === 'string' &&\n typeof encoding === 'string' &&\n encoding !== 'utf8'\n ) {\n chunk = Buffer.from(chunk, encoding).toString()\n } else if (Buffer.isBuffer(chunk)) {\n chunk = chunk.toString()\n }\n if (typeof encoding === 'function') {\n cb = encoding\n }\n const jsonData = (this._jsonBuffer + chunk).split('\\n')\n this._jsonBuffer = jsonData.pop()\n for (let i = 0; i < jsonData.length; i++) {\n try {\n // JSON.parse can throw, emit an error on that\n super.write(JSON.parse(jsonData[i]))\n } catch (er) {\n this.emit('error', er)\n continue\n }\n }\n if (cb) cb()\n }\n}\n```\n","homepage":"https://github.com/isaacs/minipass#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/minipass.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"bugs":{"url":"https://github.com/isaacs/minipass/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "minipass",
+ "description": "minimal implementation of a PassThrough stream",
+ "dist-tags": {
+ "latest": "7.1.2"
+ },
+ "versions": {
+ "3.3.6": {
+ "name": "minipass",
+ "version": "3.3.6",
+ "description": "minimal implementation of a PassThrough stream",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "^17.0.41",
+ "end-of-stream": "^1.4.0",
+ "prettier": "^2.6.2",
+ "tap": "^16.2.0",
+ "through2": "^2.0.3",
+ "ts-node": "^10.8.1",
+ "typescript": "^4.7.3"
+ },
+ "scripts": {
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "tap": {
+ "check-coverage": true
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "gitHead": "52ab642fa447419dca139ce29fad780dd61a27af",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass/issues"
+ },
+ "_id": "minipass@3.3.6",
+ "_nodeVersion": "18.12.0",
+ "_npmVersion": "9.1.1",
+ "dist": {
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "shasum": "7bba384db3a1520d18c9c0e5251c3444e95dd94a",
+ "tarball": "http://localhost:4260/minipass/minipass-3.3.6.tgz",
+ "fileCount": 5,
+ "unpackedSize": 48090
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "5.0.0": {
+ "name": "minipass",
+ "version": "5.0.0",
+ "description": "minimal implementation of a PassThrough stream",
+ "main": "./index.js",
+ "module": "./index.mjs",
+ "types": "./index.d.ts",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./index.d.ts",
+ "default": "./index.mjs"
+ },
+ "require": {
+ "types": "./index.d.ts",
+ "default": "./index.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "devDependencies": {
+ "@types/node": "^17.0.41",
+ "end-of-stream": "^1.4.0",
+ "node-abort-controller": "^3.1.1",
+ "prettier": "^2.6.2",
+ "tap": "^16.2.0",
+ "through2": "^2.0.3",
+ "ts-node": "^10.8.1",
+ "typedoc": "^0.23.24",
+ "typescript": "^4.7.3"
+ },
+ "scripts": {
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "prepare": "node ./scripts/transpile-to-esm.js",
+ "snap": "tap",
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags",
+ "typedoc": "typedoc ./index.d.ts",
+ "format": "prettier --write . --loglevel warn"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "tap": {
+ "check-coverage": true
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "gitHead": "3066600b811753bd9c85831a8ecd5c6ca248f2aa",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass/issues"
+ },
+ "_id": "minipass@5.0.0",
+ "_nodeVersion": "18.14.0",
+ "_npmVersion": "9.6.3",
+ "dist": {
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "shasum": "3e9788ffb90b694a5d0ec94479a45b5d8738133d",
+ "tarball": "http://localhost:4260/minipass/minipass-5.0.0.tgz",
+ "fileCount": 6,
+ "unpackedSize": 69475
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "7.1.2": {
+ "name": "minipass",
+ "version": "7.1.2",
+ "description": "minimal implementation of a PassThrough stream",
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "type": "module",
+ "tshy": {
+ "selfLink": false,
+ "main": true,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --loglevel warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "devDependencies": {
+ "@types/end-of-stream": "^1.4.2",
+ "@types/node": "^20.1.2",
+ "end-of-stream": "^1.4.0",
+ "node-abort-controller": "^3.1.1",
+ "prettier": "^2.6.2",
+ "tap": "^19.0.0",
+ "through2": "^2.0.3",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "tap": {
+ "typecheck": true,
+ "include": [
+ "test/*.ts"
+ ]
+ },
+ "_id": "minipass@7.1.2",
+ "gitHead": "1fc7b914533c367ac00a982051849add2169f641",
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass/issues"
+ },
+ "_nodeVersion": "20.13.1",
+ "_npmVersion": "10.7.0",
+ "dist": {
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "shasum": "93a9626ce5e5e66bd4db86849e7515e92340a707",
+ "tarball": "http://localhost:4260/minipass/minipass-7.1.2.tgz",
+ "fileCount": 13,
+ "unpackedSize": 286202
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/isaacs/minipass#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minipass.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minipass/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/minizlib/registry.json b/tests/registry/npm/minizlib/registry.json
index 8fe07fa24..b407bb19e 100644
--- a/tests/registry/npm/minizlib/registry.json
+++ b/tests/registry/npm/minizlib/registry.json
@@ -1 +1,72 @@
-{"name":"minizlib","description":"A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.","dist-tags":{"latest":"2.1.2"},"versions":{"2.1.2":{"name":"minizlib","version":"2.1.2","description":"A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.","main":"index.js","dependencies":{"minipass":"^3.0.0","yallist":"^4.0.0"},"scripts":{"test":"tap test/*.js --100 -J","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --all; git push origin --tags"},"repository":{"type":"git","url":"git+https://github.com/isaacs/minizlib.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"MIT","devDependencies":{"tap":"^14.6.9"},"engines":{"node":">= 8"},"gitHead":"433c0caa0a3ba92a31623025c4ac386836649b09","bugs":{"url":"https://github.com/isaacs/minizlib/issues"},"_id":"minizlib@2.1.2","_nodeVersion":"14.8.0","_npmVersion":"7.0.0-beta.4","dist":{"integrity":"sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==","shasum":"e90d3466ba209b932451508a11ce3d3632145931","tarball":"http://localhost:4260/minizlib/minizlib-2.1.2.tgz","fileCount":5,"unpackedSize":17309,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNxNuCRA9TVsSAnZWagAASdIP/RRnOjk1e2hmhdyLX58h\nTn+WzhsGAp0FttFn3962ib19L57ynxj32+TpbrO37TJbmLSDAjFZ4hOWPexk\n4aSkfoCzNzeoDUh8CH8cXMGalPMFSNAcoj/V9p2e4JBQbRWgT0B+XyRFTFKR\n8B9Zza+7fZBfiAZtDbUkxBr4JCSCuc0bLCOoeoqt+8WxwRmZvC8/CjsyO3uP\nNfMP/uMi0+zv0+78+L8/oghYuoEEUv5KsEFIne8GXqCik7PZFwbswfZtlI1d\nbXArRr8pVZvaK8++OaKN8ppk/ZHCmyvbBySXtznsy2++KVdEG0mg7SR+kg1y\nqwNdZWnqalFj9XHayqDZ97sdmx4SscGTeZwpx/LBqXVDW59v8rX9SFQ3as8p\n9Uy9KxMjk1asDriPS+aaJjbM27x2VSeBv+hFcmIsXv6JjdQSyCOcM1Kpk7hD\n8w0q5LQTvuHPGiqdrLAwLu1JH2aEHPr/jrYrEms5Q6eeYHCKinKrxWcpVkHa\nwGlvB2KXo6CyW3SWnpSlSToCjzDEuCKcRpyhZffLNSpGdEmI49PbpGteaTO1\ngc2yLV4q5uQNhQES7Lovh1/FCk+kcAN6kFLtEeaYsK/G5/VDbj3Mv6ovEC+O\nVqs5vBbkA7Pjw48Uuva1PYBCxPw3O/K2C9TP0O3TWyR101VVhTK5Dhvv5fLk\nROVN\r\n=0klg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFFUhtHPTvBoEDsGT0dRfPAyJBQIXN7KLCr2qbTbuAERAiAOSmdDwiA7whgyuc+cg/HUG68h6/+b2JAJuw73+8DsrQ=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# minizlib\n\nA fast zlib stream built on [minipass](http://npm.im/minipass) and\nNode.js's zlib binding.\n\nThis module was created to serve the needs of\n[node-tar](http://npm.im/tar) and\n[minipass-fetch](http://npm.im/minipass-fetch).\n\nBrotli is supported in versions of node with a Brotli binding.\n\n## How does this differ from the streams in `'node:zlib'`?\n\nFirst, there are no convenience methods to compress or decompress a\nbuffer. If you want those, use the built-in `zlib` module. This is\nonly streams. That being said, Minipass streams to make it fairly easy to\nuse as one-liners: `new zlib.Deflate().end(data).read()` will return the\ndeflate compressed result.\n\nThis module compresses and decompresses the data as fast as you feed\nit in. It is synchronous, and runs on the main process thread. Zlib\nand Brotli operations can be high CPU, but they're very fast, and doing it\nthis way means much less bookkeeping and artificial deferral.\n\nNode's built in zlib streams are built on top of `stream.Transform`.\nThey do the maximally safe thing with respect to consistent\nasynchrony, buffering, and backpressure.\n\nSee [Minipass](http://npm.im/minipass) for more on the differences between\nNode.js core streams and Minipass streams, and the convenience methods\nprovided by that class.\n\n## Classes\n\n- Deflate\n- Inflate\n- Gzip\n- Gunzip\n- DeflateRaw\n- InflateRaw\n- Unzip\n- BrotliCompress (Node v10 and higher)\n- BrotliDecompress (Node v10 and higher)\n\n## USAGE\n\n```js\nimport { BrotliDecompress } from 'minizlib'\n// or: const BrotliDecompress = require('minizlib')\n\nconst input = sourceOfCompressedData()\nconst decode = new BrotliDecompress()\nconst output = whereToWriteTheDecodedData()\ninput.pipe(decode).pipe(output)\n```\n\n## REPRODUCIBLE BUILDS\n\nTo create reproducible gzip compressed files across different operating\nsystems, set `portable: true` in the options. This causes minizlib to set\nthe `OS` indicator in byte 9 of the extended gzip header to `0xFF` for\n'unknown'.\n","homepage":"https://github.com/isaacs/minizlib#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/minizlib.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"bugs":{"url":"https://github.com/isaacs/minizlib/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "minizlib",
+ "description": "A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.",
+ "dist-tags": {
+ "latest": "2.1.2"
+ },
+ "versions": {
+ "2.1.2": {
+ "name": "minizlib",
+ "version": "2.1.2",
+ "description": "A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.",
+ "main": "index.js",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "scripts": {
+ "test": "tap test/*.js --100 -J",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --all; git push origin --tags"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minizlib.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "tap": "^14.6.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ },
+ "gitHead": "433c0caa0a3ba92a31623025c4ac386836649b09",
+ "bugs": {
+ "url": "https://github.com/isaacs/minizlib/issues"
+ },
+ "_id": "minizlib@2.1.2",
+ "_nodeVersion": "14.8.0",
+ "_npmVersion": "7.0.0-beta.4",
+ "dist": {
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "shasum": "e90d3466ba209b932451508a11ce3d3632145931",
+ "tarball": "http://localhost:4260/minizlib/minizlib-2.1.2.tgz",
+ "fileCount": 5,
+ "unpackedSize": 17309
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/isaacs/minizlib#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/minizlib.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minizlib/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/mkdirp/registry.json b/tests/registry/npm/mkdirp/registry.json
index 511fac9b3..d6bccdd9c 100644
--- a/tests/registry/npm/mkdirp/registry.json
+++ b/tests/registry/npm/mkdirp/registry.json
@@ -1 +1,67 @@
-{"name":"mkdirp","description":"Recursively mkdir, like `mkdir -p`","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.4":{"name":"mkdirp","description":"Recursively mkdir, like `mkdir -p`","version":"1.0.4","main":"index.js","repository":{"type":"git","url":"git+https://github.com/isaacs/node-mkdirp.git"},"scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true,"coverage-map":"map.js"},"devDependencies":{"require-inject":"^1.4.4","tap":"^14.10.7"},"bin":{"mkdirp":"bin/cmd.js"},"license":"MIT","engines":{"node":">=10"},"gitHead":"b694079b54a0a59ef150c54b29c7c24e90d642f5","bugs":{"url":"https://github.com/isaacs/node-mkdirp/issues"},"_id":"mkdirp@1.0.4","_nodeVersion":"13.10.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==","shasum":"3eb5ed62622756d79a5f0e2a221dfebad75c2f7e","tarball":"http://localhost:4260/mkdirp/mkdirp-1.0.4.tgz","fileCount":12,"unpackedSize":19088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeh2xNCRA9TVsSAnZWagAAFiMQAIeSoosHZP0eVV6P64NS\nnXRn6I82OfqeOhU9DmWKLO4csIwPiBfLE+ZL4C0bHxeWllyD1HJYB755v38Y\nG8g+GgdkCKeUDSGsL5kcVWXclMydN14FooYF5vjiXig+WNFevum7Ul8Sduvy\np+/o95aKK4Q2xu9JGEVFmmhRF7dKUsb1Q6npcDrdmrDODWHfKQ6t6DXDW3M/\nXYZ/UblSBLOQkiqDKpilB+WWbLe95KOk7pPX8v1dZR94h9RTVoVkDXXX3TLQ\nJAPJ1FrYcIWfBZS3OgbbWo3Baer97ysxBc9zDpXJC3gHbrRMDJnbhnvcxnt/\n41l7zwnPF9JX0gV2Ol8FUSvAfE7FWDQzlpqxfn13g+gPmU42RbKBh4fuhw63\nMTPcvxwjTrDkLecTcbvaNv9WtZN8mJyFhxzjvYPr24ewwsdxj0q7fTMHWMhX\n2edEhaQ1sJVQV49rSPwJwE7+mZK/2D1accQIPa4PdePLTC6LSzviAROJz8eB\ntrcRY5kS3rTJA+Kdw8vByeWV1/eavBMNJL69gdYBgKfX6E0WiXb0YdFSX9DB\njT4CoKYPPKjUrsQdO4NcPPRgmnAlHS9U5nIPbxAhn40eb9hTs9GgN3ZnZcgL\nr4LkQaku79npoNqW2vmxJSJ9axe2qUYE6OycAlKbGiHqP36k3e9GNcK7c9aU\npS9s\r\n=RHg1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNuJhaaCaHNTxRGetPL84WE6k+gY1o8Coz5VmqOTt1QQIhANxhVGEedRGkz/XJ09hKdbosKA7vcaWhTzyAHJ8CNaSu"}]},"directories":{},"_hasShrinkwrap":false}},"repository":{"type":"git","url":"git+https://github.com/isaacs/node-mkdirp.git"},"license":"MIT","readme":"","readmeFilename":"","homepage":"https://github.com/isaacs/node-mkdirp#readme","bugs":{"url":"https://github.com/isaacs/node-mkdirp/issues"}}
+{
+ "name": "mkdirp",
+ "description": "Recursively mkdir, like `mkdir -p`",
+ "dist-tags": {
+ "latest": "1.0.4"
+ },
+ "versions": {
+ "1.0.4": {
+ "name": "mkdirp",
+ "description": "Recursively mkdir, like `mkdir -p`",
+ "version": "1.0.4",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/node-mkdirp.git"
+ },
+ "scripts": {
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true,
+ "coverage-map": "map.js"
+ },
+ "devDependencies": {
+ "require-inject": "^1.4.4",
+ "tap": "^14.10.7"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "gitHead": "b694079b54a0a59ef150c54b29c7c24e90d642f5",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-mkdirp/issues"
+ },
+ "_id": "mkdirp@1.0.4",
+ "_nodeVersion": "13.10.1",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "shasum": "3eb5ed62622756d79a5f0e2a221dfebad75c2f7e",
+ "tarball": "http://localhost:4260/mkdirp/mkdirp-1.0.4.tgz",
+ "fileCount": 12,
+ "unpackedSize": 19088
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/node-mkdirp.git"
+ },
+ "license": "MIT",
+ "readmeFilename": "",
+ "homepage": "https://github.com/isaacs/node-mkdirp#readme",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-mkdirp/issues"
+ }
+}
diff --git a/tests/registry/npm/ms/registry.json b/tests/registry/npm/ms/registry.json
index 7557d39ea..c7d162c55 100644
--- a/tests/registry/npm/ms/registry.json
+++ b/tests/registry/npm/ms/registry.json
@@ -1 +1,72 @@
-{"name":"ms","description":"Tiny millisecond conversion utility","dist-tags":{"latest":"2.1.2"},"versions":{"2.1.2":{"name":"ms","version":"2.1.2","description":"Tiny millisecond conversion utility","repository":{"type":"git","url":"git+https://github.com/zeit/ms.git"},"main":"./index","scripts":{"precommit":"lint-staged","lint":"eslint lib/* bin/*","test":"mocha tests.js"},"eslintConfig":{"extends":"eslint:recommended","env":{"node":true,"es6":true}},"lint-staged":{"*.js":["npm run lint","prettier --single-quote --write","git add"]},"license":"MIT","devDependencies":{"eslint":"4.12.1","expect.js":"0.3.1","husky":"0.14.3","lint-staged":"5.0.0","mocha":"4.0.1"},"gitHead":"7920885eb232fbe7a5efdab956d3e7c507c92ddf","bugs":{"url":"https://github.com/zeit/ms/issues"},"_id":"ms@2.1.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","dist":{"integrity":"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==","shasum":"d09d1f357b443f493382a8eb3ccd183872ae6009","tarball":"http://localhost:4260/ms/ms-2.1.2.tgz","fileCount":4,"unpackedSize":6842,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+U4MCRA9TVsSAnZWagAA71AP/2rpu0zYdK5Z/BXrrKNW\nljsVOs4oHNJ2jeZrzpcV8eZUZ6zAi78plyxcnMCbbG+TrpjXrPcb8qFq630G\nS6+srbEF0lCGCc+ktJrNJPTeXkDxukQXVrepgZ2kxZ4m3q/QIAVoK4t9ebuH\nNYa+39wwET9oPuPsk+YY0Z7fQ1vadyuzHYOrRmtudV3ZtyT0k74Ec3IhKamW\nlLDJtCklD7IGcwirrvPssxmYu8WP+PAyFnrVaOW+iior1o07oWO2mk7sk3Fx\nwBSBFf7vZqFJP6Qg1m3TVBAiipL+Pf+b3Dy8fhmn4NhTGj/9Wl7f/LcqogOV\nV9l77qsZldCERBwmwLsHlMyCSSl/b2qaz28ZBTRwHtHdo19QT6MqX8Yvomy4\n+gyPBBAHC6bqqLZ0veRKzSNFfJYoFw8tQzyjSjpmYcdxaB5w4z4QPZAkZCku\ns+sooI5Xo33E9rcEDWmyqxdUud+Au/fTttg0dReYe8NVrUgzyk4T1W+D7I4k\nu3XV7O9bOaJiBTNsb22lGIC6E/HtjfoqW7iwl0cdZ8iZcPTBClkzsy9Hz6a4\nmNKDARFL0wjzWF/CoXyKcI6t9ruOepTQRfbAtZDAo4LEYj/bGiqm2kbX5AP6\nicCOlufTNip74l2bXv2sJNwtjGzEYF/S79Oyc49IP/ovIua4quXXtSjAh8Bg\nLrV/\r\n=GrYx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVNTHsphMsdrWmzEq1T6dFGHe80Vg5ZmIWN1NIKOAHewIgE0sscC2rehxwM3V43Nil6I4auXhiwsdK9Kb1JtejdzE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# ms\n\n![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)\n\nUse this package to easily convert various time formats to milliseconds.\n\n## Examples\n\n<!-- prettier-ignore -->\n```js\nms('2 days') // 172800000\nms('1d') // 86400000\nms('10h') // 36000000\nms('2.5 hrs') // 9000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('1y') // 31557600000\nms('100') // 100\nms('-3 days') // -259200000\nms('-1h') // -3600000\nms('-200') // -200\n```\n\n### Convert from Milliseconds\n\n<!-- prettier-ignore -->\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(-3 * 60000) // \"-3m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n### Time Format Written-Out\n\n<!-- prettier-ignore -->\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(-3 * 60000, { long: true }) // \"-3 minutes\"\nms(ms('10 hours'), { long: true }) // \"10 hours\"\n```\n\n## Features\n\n- Works both in [Node.js](https://nodejs.org) and in the browser\n- If a number is supplied to `ms`, a string with a unit is returned\n- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)\n- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned\n\n## TypeScript support\n\nAs of v3.0, this package includes TypeScript definitions.\n\nFor added safety, we're using [Template Literal Types](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html) (added in [TypeScript 4.1](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-1.html)). This ensures that you don't accidentally pass `ms` values that it can't process.\n\nThis won't require you to do anything special in most situations, but you can also import the `StringValue` type from `ms` if you need to use it.\n\n```ts\nimport ms, { StringValue } from 'ms';\n\n// Using the exported type.\nfunction example(value: StringValue) {\n ms(value);\n}\n\n// This function will only accept a string compatible with `ms`.\nexample('1 h');\n```\n\nIn this example, we use a [Type Assertion](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions) to coerce a `string`.\n\n```ts\nimport ms, { StringValue } from 'ms';\n\n// Type assertion with the exported type.\nfunction example(value: string) {\n try {\n // A string could be \"wider\" than the values accepted by `ms`, so we assert\n // that our `value` is a `StringValue`.\n //\n // It's important to note that this can be dangerous (see below).\n ms(value as StringValue);\n } catch (error: Error) {\n // Handle any errors from invalid vaues.\n console.error(error);\n }\n}\n\n// This function will accept any string, which may result in a bug.\nexample('any value');\n```\n\nYou may also create a custom Template Literal Type.\n\n```ts\nimport ms from 'ms';\n\ntype OnlyDaysAndWeeks = `${number} ${'days' | 'weeks'}`;\n\n// Using a custom Template Literal Type.\nfunction example(value: OnlyDaysAndWeeks) {\n // The type of `value` is narrower than the values `ms` accepts, which is\n // safe to use without coercion.\n ms(value);\n}\n\n// This function will accept \"# days\" or \"# weeks\" only.\nexample('5.2 days');\n```\n\n## Related Packages\n\n- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.\n\n## Caught a Bug?\n\n1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device\n2. Link the package to the global module directory: `npm link`\n3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!\n\nAs always, you can run the tests using: `npm test`\n","repository":{"type":"git","url":"git+https://github.com/vercel/ms.git"},"bugs":{"url":"https://github.com/vercel/ms/issues"},"readmeFilename":"readme.md","homepage":"https://github.com/vercel/ms#readme","license":"MIT"}
+{
+ "name": "ms",
+ "description": "Tiny millisecond conversion utility",
+ "dist-tags": {
+ "latest": "2.1.2"
+ },
+ "versions": {
+ "2.1.2": {
+ "name": "ms",
+ "version": "2.1.2",
+ "description": "Tiny millisecond conversion utility",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/zeit/ms.git"
+ },
+ "main": "./index",
+ "scripts": {
+ "precommit": "lint-staged",
+ "lint": "eslint lib/* bin/*",
+ "test": "mocha tests.js"
+ },
+ "eslintConfig": {
+ "extends": "eslint:recommended",
+ "env": {
+ "node": true,
+ "es6": true
+ }
+ },
+ "lint-staged": {
+ "*.js": [
+ "npm run lint",
+ "prettier --single-quote --write",
+ "git add"
+ ]
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "eslint": "4.12.1",
+ "expect.js": "0.3.1",
+ "husky": "0.14.3",
+ "lint-staged": "5.0.0",
+ "mocha": "4.0.1"
+ },
+ "gitHead": "7920885eb232fbe7a5efdab956d3e7c507c92ddf",
+ "bugs": {
+ "url": "https://github.com/zeit/ms/issues"
+ },
+ "_id": "ms@2.1.2",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "10.15.3",
+ "dist": {
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "shasum": "d09d1f357b443f493382a8eb3ccd183872ae6009",
+ "tarball": "http://localhost:4260/ms/ms-2.1.2.tgz",
+ "fileCount": 4,
+ "unpackedSize": 6842
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vercel/ms.git"
+ },
+ "bugs": {
+ "url": "https://github.com/vercel/ms/issues"
+ },
+ "readmeFilename": "readme.md",
+ "homepage": "https://github.com/vercel/ms#readme",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/nan/registry.json b/tests/registry/npm/nan/registry.json
index 4985f6272..947a418b1 100644
--- a/tests/registry/npm/nan/registry.json
+++ b/tests/registry/npm/nan/registry.json
@@ -1 +1,62 @@
-{"name":"nan","description":"Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility","dist-tags":{"latest":"2.16.0"},"versions":{"2.16.0":{"name":"nan","version":"2.16.0","description":"Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility","main":"include_dirs.js","repository":{"type":"git","url":"git://github.com/nodejs/nan.git"},"scripts":{"test":"tap --gc --stderr test/js/*-test.js","test:worker":"node --experimental-worker test/tap-as-worker.js --gc --stderr test/js/*-test.js","rebuild-tests":"node-gyp rebuild --msvs_version=2015 --directory test","docs":"doc/.build.sh"},"devDependencies":{"bindings":"~1.2.1","commander":"^2.8.1","glob":"^5.0.14","request":"=2.81.0","node-gyp":"~8.4.1","readable-stream":"^2.1.4","tap":"~0.7.1","xtend":"~4.0.0"},"license":"MIT","gitHead":"22c8ac4b6de36a66a1cfef9363d4d7c12db87cd6","bugs":{"url":"https://github.com/nodejs/nan/issues"},"_id":"nan@2.16.0","_nodeVersion":"18.2.0","_npmVersion":"8.10.0","dist":{"integrity":"sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==","shasum":"664f43e45460fb98faf00edca0bb0d7b8dce7916","tarball":"http://localhost:4260/nan/nan-2.16.0.tgz","fileCount":47,"unpackedSize":422414,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHVjXzivYF3hOXU9fxRqSho8nssRbOAd1fdls0zmnkaJAiAZR2VASD82lewv/SBq0EXg4sAr1e7jH1tJyR4BwempZQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijimrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq1VA/9HTCiBC8rskDfNvzkp7a1wAYpjPIC9Ih4bc1rpy0Os6g9sgsI\r\nSF8Fsxzf8gaUmU5nMTRJ0jnmmMk4O73+ZwXaKaeZHZKrziFKmEcKPedaiDlD\r\n8XFxpnvvki/vg4Mx7bxebI/+OLkJgHxHTGCqHn/WHjq7su/NADmdLlc2AtMW\r\nwgCBHQlwgslTIQHr42quOnqSueNNtT2jSQCIbypH5+ex875bMLvga0qSdV2N\r\nCA+K/7wzpba/KJXxhiJ2pER7mEH3ntDAb7sROziyZ2/qnJi6vMOsO8+0m5gZ\r\nG3dV/1BjGyYW8mySJGekrazQUeQa413RY1fHdSWLNtUiRZQqhA4+yaOCvsx4\r\nznUy1Qi/4d3ZMpFKI5iqw9mvvosVP7i1rISz016zeiqJZSEKaV/sSpUa9xFn\r\nbGLOGmMHnBzSV0W2zG+lK6LknZlyEL173iuSrmQccvWIUNvDFUAsXo71KPbw\r\nn7Mjg7h9MuM+8msw1Vp8ZzzgveJfY5oRF6XaTY2X1GT+mZaFMC++5UTL3NJQ\r\nGJaaQ13HZIFoQ6+CpNDWWkaj1SQ/A2qD//I+cKbaoE40wtzHiXLReXSS3rpO\r\nHAY9whAA8CVSJC2pH/lA9ugBM06euSCfk4knoHhrw/gSXNfV7vBxjkFF/Rzd\r\n8K+KAQOLcl1YXKN3PHQ47jj/NOE0qX7G7pY=\r\n=O0dW\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"Native Abstractions for Node.js\n===============================\n\n**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 and 18.**\n\n***Current version: 2.16.0***\n\n*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)*\n\n[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/)\n\n[![Build Status](https://api.travis-ci.com/nodejs/nan.svg?branch=master)](https://travis-ci.com/nodejs/nan)\n[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan)\n\nThanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.\n\nThis project also contains some helper utilities that make addon development a bit more pleasant.\n\n * **[News & Updates](#news)**\n * **[Usage](#usage)**\n * **[Example](#example)**\n * **[API](#api)**\n * **[Tests](#tests)**\n * **[Known issues](#issues)**\n * **[Governance & Contributing](#governance)**\n\n<a name=\"news\"></a>\n\n## News & Updates\n\n<a name=\"usage\"></a>\n\n## Usage\n\nSimply add **NAN** as a dependency in the *package.json* of your Node addon:\n\n``` bash\n$ npm install --save nan\n```\n\nPull in the path to **NAN** in your *binding.gyp* so that you can use `#include <nan.h>` in your *.cpp* files:\n\n``` python\n\"include_dirs\" : [\n \"<!(node -e \\\"require('nan')\\\")\"\n]\n```\n\nThis works like a `-I<path-to-NAN>` when compiling your addon.\n\n<a name=\"example\"></a>\n\n## Example\n\nJust getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**.\n\nRefer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality.\n\nFor a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.\n\nYet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon.\n\nAlso take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plethora of code snippets for your pasting pleasure.\n\n<a name=\"api\"></a>\n\n## API\n\nAdditional to the NAN documentation below, please consult:\n\n* [The V8 Getting Started * Guide](https://v8.dev/docs/embed)\n* [V8 API Documentation](https://v8docs.nodesource.com/)\n* [Node Add-on Documentation](https://nodejs.org/api/addons.html)\n\n<!-- START API -->\n\n### JavaScript-accessible methods\n\nA _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information.\n\nIn order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.\n\n* **Method argument types**\n - <a href=\"doc/methods.md#api_nan_function_callback_info\"><b><code>Nan::FunctionCallbackInfo</code></b></a>\n - <a href=\"doc/methods.md#api_nan_property_callback_info\"><b><code>Nan::PropertyCallbackInfo</code></b></a>\n - <a href=\"doc/methods.md#api_nan_return_value\"><b><code>Nan::ReturnValue</code></b></a>\n* **Method declarations**\n - <a href=\"doc/methods.md#api_nan_method\"><b>Method declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_getter\"><b>Getter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_setter\"><b>Setter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_property_getter\"><b>Property getter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_property_setter\"><b>Property setter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_property_enumerator\"><b>Property enumerator declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_property_deleter\"><b>Property deleter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_property_query\"><b>Property query declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_index_getter\"><b>Index getter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_index_setter\"><b>Index setter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_index_enumerator\"><b>Index enumerator declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_index_deleter\"><b>Index deleter declaration</b></a>\n - <a href=\"doc/methods.md#api_nan_index_query\"><b>Index query declaration</b></a>\n* Method and template helpers\n - <a href=\"doc/methods.md#api_nan_set_method\"><b><code>Nan::SetMethod()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_prototype_method\"><b><code>Nan::SetPrototypeMethod()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_accessor\"><b><code>Nan::SetAccessor()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_named_property_handler\"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_indexed_property_handler\"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_template\"><b><code>Nan::SetTemplate()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_prototype_template\"><b><code>Nan::SetPrototypeTemplate()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_instance_template\"><b><code>Nan::SetInstanceTemplate()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_call_handler\"><b><code>Nan::SetCallHandler()</code></b></a>\n - <a href=\"doc/methods.md#api_nan_set_call_as_function_handler\"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>\n\n### Scopes\n\nA _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.\n\nA handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.\n\nThe creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.\n\n - <a href=\"doc/scopes.md#api_nan_handle_scope\"><b><code>Nan::HandleScope</code></b></a>\n - <a href=\"doc/scopes.md#api_nan_escapable_handle_scope\"><b><code>Nan::EscapableHandleScope</code></b></a>\n\nAlso see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection).\n\n### Persistent references\n\nAn object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.\n\nDue to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.\n\n - <a href=\"doc/persistent.md#api_nan_persistent_base\"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_non_copyable_persistent_traits\"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_copyable_persistent_traits\"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_persistent\"><b><code>Nan::Persistent</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_global\"><b><code>Nan::Global</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_weak_callback_info\"><b><code>Nan::WeakCallbackInfo</code></b></a>\n - <a href=\"doc/persistent.md#api_nan_weak_callback_type\"><b><code>Nan::WeakCallbackType</code></b></a>\n\nAlso see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).\n\n### New\n\nNAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.\n\n - <a href=\"doc/new.md#api_nan_new\"><b><code>Nan::New()</code></b></a>\n - <a href=\"doc/new.md#api_nan_undefined\"><b><code>Nan::Undefined()</code></b></a>\n - <a href=\"doc/new.md#api_nan_null\"><b><code>Nan::Null()</code></b></a>\n - <a href=\"doc/new.md#api_nan_true\"><b><code>Nan::True()</code></b></a>\n - <a href=\"doc/new.md#api_nan_false\"><b><code>Nan::False()</code></b></a>\n - <a href=\"doc/new.md#api_nan_empty_string\"><b><code>Nan::EmptyString()</code></b></a>\n\n\n### Converters\n\nNAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.\n\n - <a href=\"doc/converters.md#api_nan_to\"><b><code>Nan::To()</code></b></a>\n\n### Maybe Types\n\nThe `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.\n\n* **Maybe Types**\n - <a href=\"doc/maybe_types.md#api_nan_maybe_local\"><b><code>Nan::MaybeLocal</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_maybe\"><b><code>Nan::Maybe</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_nothing\"><b><code>Nan::Nothing</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_just\"><b><code>Nan::Just</code></b></a>\n* **Maybe Helpers**\n - <a href=\"doc/maybe_types.md#api_nan_call\"><b><code>Nan::Call()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_to_detail_string\"><b><code>Nan::ToDetailString()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_to_array_index\"><b><code>Nan::ToArrayIndex()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_equals\"><b><code>Nan::Equals()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_new_instance\"><b><code>Nan::NewInstance()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_function\"><b><code>Nan::GetFunction()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_set\"><b><code>Nan::Set()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_define_own_property\"><b><code>Nan::DefineOwnProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_force_set\"><del><b><code>Nan::ForceSet()</code></b></del></a>\n - <a href=\"doc/maybe_types.md#api_nan_get\"><b><code>Nan::Get()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_property_attribute\"><b><code>Nan::GetPropertyAttributes()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has\"><b><code>Nan::Has()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_delete\"><b><code>Nan::Delete()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_property_names\"><b><code>Nan::GetPropertyNames()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_own_property_names\"><b><code>Nan::GetOwnPropertyNames()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_set_prototype\"><b><code>Nan::SetPrototype()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_object_proto_to_string\"><b><code>Nan::ObjectProtoToString()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has_own_property\"><b><code>Nan::HasOwnProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has_real_named_property\"><b><code>Nan::HasRealNamedProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has_real_indexed_property\"><b><code>Nan::HasRealIndexedProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has_real_named_callback_property\"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_real_named_property_in_prototype_chain\"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_real_named_property\"><b><code>Nan::GetRealNamedProperty()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_call_as_function\"><b><code>Nan::CallAsFunction()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_call_as_constructor\"><b><code>Nan::CallAsConstructor()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_source_line\"><b><code>Nan::GetSourceLine()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_line_number\"><b><code>Nan::GetLineNumber()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_start_column\"><b><code>Nan::GetStartColumn()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_end_column\"><b><code>Nan::GetEndColumn()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_clone_element_at\"><b><code>Nan::CloneElementAt()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_has_private\"><b><code>Nan::HasPrivate()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_get_private\"><b><code>Nan::GetPrivate()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_set_private\"><b><code>Nan::SetPrivate()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_delete_private\"><b><code>Nan::DeletePrivate()</code></b></a>\n - <a href=\"doc/maybe_types.md#api_nan_make_maybe\"><b><code>Nan::MakeMaybe()</code></b></a>\n\n### Script\n\nNAN provides `v8::Script` helpers as the API has changed over the supported versions of V8.\n\n - <a href=\"doc/script.md#api_nan_compile_script\"><b><code>Nan::CompileScript()</code></b></a>\n - <a href=\"doc/script.md#api_nan_run_script\"><b><code>Nan::RunScript()</code></b></a>\n - <a href=\"doc/script.md#api_nan_script_origin\"><b><code>Nan::ScriptOrigin</code></b></a>\n\n\n### JSON\n\nThe _JSON_ object provides the C++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object.\n\n - <a href=\"doc/json.md#api_nan_json_parse\"><b><code>Nan::JSON.Parse</code></b></a>\n - <a href=\"doc/json.md#api_nan_json_stringify\"><b><code>Nan::JSON.Stringify</code></b></a>\n\nRefer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments.\n\n### Errors\n\nNAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.\n\nNote that an Error object is simply a specialized form of `v8::Value`.\n\nAlso consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.\n\n - <a href=\"doc/errors.md#api_nan_error\"><b><code>Nan::Error()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_range_error\"><b><code>Nan::RangeError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_reference_error\"><b><code>Nan::ReferenceError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_syntax_error\"><b><code>Nan::SyntaxError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_type_error\"><b><code>Nan::TypeError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_throw_error\"><b><code>Nan::ThrowError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_throw_range_error\"><b><code>Nan::ThrowRangeError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_throw_reference_error\"><b><code>Nan::ThrowReferenceError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_throw_syntax_error\"><b><code>Nan::ThrowSyntaxError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_throw_type_error\"><b><code>Nan::ThrowTypeError()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_fatal_exception\"><b><code>Nan::FatalException()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_errno_exception\"><b><code>Nan::ErrnoException()</code></b></a>\n - <a href=\"doc/errors.md#api_nan_try_catch\"><b><code>Nan::TryCatch</code></b></a>\n\n\n### Buffers\n\nNAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.\n\n - <a href=\"doc/buffers.md#api_nan_new_buffer\"><b><code>Nan::NewBuffer()</code></b></a>\n - <a href=\"doc/buffers.md#api_nan_copy_buffer\"><b><code>Nan::CopyBuffer()</code></b></a>\n - <a href=\"doc/buffers.md#api_nan_free_callback\"><b><code>Nan::FreeCallback()</code></b></a>\n\n### Nan::Callback\n\n`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.\n\n - <a href=\"doc/callback.md#api_nan_callback\"><b><code>Nan::Callback</code></b></a>\n\n### Asynchronous work helpers\n\n`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier.\n\n - <a href=\"doc/asyncworker.md#api_nan_async_worker\"><b><code>Nan::AsyncWorker</code></b></a>\n - <a href=\"doc/asyncworker.md#api_nan_async_progress_worker\"><b><code>Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker</code></b></a>\n - <a href=\"doc/asyncworker.md#api_nan_async_progress_queue_worker\"><b><code>Nan::AsyncProgressQueueWorker</code></b></a>\n - <a href=\"doc/asyncworker.md#api_nan_async_queue_worker\"><b><code>Nan::AsyncQueueWorker</code></b></a>\n\n### Strings & Bytes\n\nMiscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.\n\n - <a href=\"doc/string_bytes.md#api_nan_encoding\"><b><code>Nan::Encoding</code></b></a>\n - <a href=\"doc/string_bytes.md#api_nan_encode\"><b><code>Nan::Encode()</code></b></a>\n - <a href=\"doc/string_bytes.md#api_nan_decode_bytes\"><b><code>Nan::DecodeBytes()</code></b></a>\n - <a href=\"doc/string_bytes.md#api_nan_decode_write\"><b><code>Nan::DecodeWrite()</code></b></a>\n\n\n### Object Wrappers\n\nThe `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.\n\n - <a href=\"doc/object_wrappers.md#api_nan_object_wrap\"><b><code>Nan::ObjectWrap</code></b></a>\n\n\n### V8 internals\n\nThe hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.\n\n - <a href=\"doc/v8_internals.md#api_nan_gc_callback\"><b><code>NAN_GC_CALLBACK()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_add_gc_epilogue_callback\"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_remove_gc_epilogue_callback\"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_add_gc_prologue_callback\"><b><code>Nan::AddGCPrologueCallback()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_remove_gc_prologue_callback\"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_get_heap_statistics\"><b><code>Nan::GetHeapStatistics()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_set_counter_function\"><b><code>Nan::SetCounterFunction()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_set_create_histogram_function\"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_set_add_histogram_sample_function\"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_idle_notification\"><b><code>Nan::IdleNotification()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_low_memory_notification\"><b><code>Nan::LowMemoryNotification()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_context_disposed_notification\"><b><code>Nan::ContextDisposedNotification()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_get_internal_field_pointer\"><b><code>Nan::GetInternalFieldPointer()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_set_internal_field_pointer\"><b><code>Nan::SetInternalFieldPointer()</code></b></a>\n - <a href=\"doc/v8_internals.md#api_nan_adjust_external_memory\"><b><code>Nan::AdjustExternalMemory()</code></b></a>\n\n\n### Miscellaneous V8 Helpers\n\n - <a href=\"doc/v8_misc.md#api_nan_utf8_string\"><b><code>Nan::Utf8String</code></b></a>\n - <a href=\"doc/v8_misc.md#api_nan_get_current_context\"><b><code>Nan::GetCurrentContext()</code></b></a>\n - <a href=\"doc/v8_misc.md#api_nan_set_isolate_data\"><b><code>Nan::SetIsolateData()</code></b></a>\n - <a href=\"doc/v8_misc.md#api_nan_get_isolate_data\"><b><code>Nan::GetIsolateData()</code></b></a>\n - <a href=\"doc/v8_misc.md#api_nan_typedarray_contents\"><b><code>Nan::TypedArrayContents</code></b></a>\n\n\n### Miscellaneous Node Helpers\n\n - <a href=\"doc/node_misc.md#api_nan_asyncresource\"><b><code>Nan::AsyncResource</code></b></a>\n - <a href=\"doc/node_misc.md#api_nan_make_callback\"><b><code>Nan::MakeCallback()</code></b></a>\n - <a href=\"doc/node_misc.md#api_nan_module_init\"><b><code>NAN_MODULE_INIT()</code></b></a>\n - <a href=\"doc/node_misc.md#api_nan_export\"><b><code>Nan::Export()</code></b></a>\n\n<!-- END API -->\n\n\n<a name=\"tests\"></a>\n\n### Tests\n\nTo run the NAN tests do:\n\n``` sh\nnpm install\nnpm run-script rebuild-tests\nnpm test\n```\n\nOr just:\n\n``` sh\nnpm install\nmake test\n```\n\n<a name=\"issues\"></a>\n\n## Known issues\n\n### Compiling against Node.js 0.12 on OSX\n\nWith new enough compilers available on OSX, the versions of V8 headers corresponding to Node.js 0.12\ndo not compile anymore. The error looks something like:\n\n```\n❯ CXX(target) Release/obj.target/accessors/cpp/accessors.o\nIn file included from ../cpp/accessors.cpp:9:\nIn file included from ../../nan.h:51:\nIn file included from /Users/ofrobots/.node-gyp/0.12.18/include/node/node.h:61:\n/Users/ofrobots/.node-gyp/0.12.18/include/node/v8.h:5800:54: error: 'CreateHandle' is a protected member of 'v8::HandleScope'\n return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(\n ~~~~~~~~~~~~~^~~~~~~~~~~~\n```\n\nThis can be worked around by patching your local versions of v8.h corresponding to Node 0.12 to make\n`v8::Handle` a friend of `v8::HandleScope`. Since neither Node.js not V8 support this release line anymore\nthis patch cannot be released by either project in an official release.\n\nFor this reason, we do not test against Node.js 0.12 on OSX in this project's CI. If you need to support\nthat configuration, you will need to either get an older compiler, or apply a source patch to the version\nof V8 headers as a workaround.\n\n<a name=\"governance\"></a>\n\n## Governance & Contributing\n\nNAN is governed by the [Node.js Addon API Working Group](https://github.com/nodejs/CTC/blob/master/WORKING_GROUPS.md#addon-api)\n\n### Addon API Working Group (WG)\n\nThe NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project.\n\nMembers of the WG are also known as Collaborators, there is no distinction between the two, unlike other Node.js projects.\n\nThe WG has final authority over this project including:\n\n* Technical direction\n* Project governance and process (including this policy)\n* Contribution policy\n* GitHub repository hosting\n* Maintaining the list of additional Collaborators\n\nFor the current list of WG members, see the project [README.md](./README.md#collaborators).\n\nIndividuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote.\n\n_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly.\n\nFor the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators).\n\n### Consensus Seeking Process\n\nThe WG follows a [Consensus Seeking](https://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model.\n\nModifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification.\n\nIf a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins.\n\n<a id=\"developers-certificate-of-origin\"></a>\n\n## Developer's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n* (a) The contribution was created in whole or in part by me and I\n have the right to submit it under the open source license\n indicated in the file; or\n\n* (b) The contribution is based upon previous work that, to the best\n of my knowledge, is covered under an appropriate open source\n license and I have the right under that license to submit that\n work with modifications, whether created in whole or in part\n by me, under the same open source license (unless I am\n permitted to submit under a different license), as indicated\n in the file; or\n\n* (c) The contribution was provided directly to me by some other\n person who certified (a), (b) or (c) and I have not modified\n it.\n\n* (d) I understand and agree that this project and the contribution\n are public and that a record of the contribution (including all\n personal information I submit with it, including my sign-off) is\n maintained indefinitely and may be redistributed consistent with\n this project or the open source license(s) involved.\n\n<a name=\"collaborators\"></a>\n\n### WG Members / Collaborators\n\n<table><tbody>\n<tr><th align=\"left\">Rod Vagg</th><td><a href=\"https://github.com/rvagg\">GitHub/rvagg</a></td><td><a href=\"http://twitter.com/rvagg\">Twitter/@rvagg</a></td></tr>\n<tr><th align=\"left\">Benjamin Byholm</th><td><a href=\"https://github.com/kkoopa/\">GitHub/kkoopa</a></td><td>-</td></tr>\n<tr><th align=\"left\">Trevor Norris</th><td><a href=\"https://github.com/trevnorris\">GitHub/trevnorris</a></td><td><a href=\"http://twitter.com/trevnorris\">Twitter/@trevnorris</a></td></tr>\n<tr><th align=\"left\">Nathan Rajlich</th><td><a href=\"https://github.com/TooTallNate\">GitHub/TooTallNate</a></td><td><a href=\"http://twitter.com/TooTallNate\">Twitter/@TooTallNate</a></td></tr>\n<tr><th align=\"left\">Brett Lawson</th><td><a href=\"https://github.com/brett19\">GitHub/brett19</a></td><td><a href=\"http://twitter.com/brett19x\">Twitter/@brett19x</a></td></tr>\n<tr><th align=\"left\">Ben Noordhuis</th><td><a href=\"https://github.com/bnoordhuis\">GitHub/bnoordhuis</a></td><td><a href=\"http://twitter.com/bnoordhuis\">Twitter/@bnoordhuis</a></td></tr>\n<tr><th align=\"left\">David Siegel</th><td><a href=\"https://github.com/agnat\">GitHub/agnat</a></td><td><a href=\"http://twitter.com/agnat\">Twitter/@agnat</a></td></tr>\n<tr><th align=\"left\">Michael Ira Krufky</th><td><a href=\"https://github.com/mkrufky\">GitHub/mkrufky</a></td><td><a href=\"http://twitter.com/mkrufky\">Twitter/@mkrufky</a></td></tr>\n</tbody></table>\n\n## Licence &amp; copyright\n\nCopyright (c) 2018 NAN WG Members / Collaborators (listed above).\n\nNative Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.\n","repository":{"type":"git","url":"git://github.com/nodejs/nan.git"},"homepage":"https://github.com/nodejs/nan#readme","bugs":{"url":"https://github.com/nodejs/nan/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "nan",
+ "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility",
+ "dist-tags": {
+ "latest": "2.16.0"
+ },
+ "versions": {
+ "2.16.0": {
+ "name": "nan",
+ "version": "2.16.0",
+ "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility",
+ "main": "include_dirs.js",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/nodejs/nan.git"
+ },
+ "scripts": {
+ "test": "tap --gc --stderr test/js/*-test.js",
+ "test:worker": "node --experimental-worker test/tap-as-worker.js --gc --stderr test/js/*-test.js",
+ "rebuild-tests": "node-gyp rebuild --msvs_version=2015 --directory test",
+ "docs": "doc/.build.sh"
+ },
+ "devDependencies": {
+ "bindings": "~1.2.1",
+ "commander": "^2.8.1",
+ "glob": "^5.0.14",
+ "request": "=2.81.0",
+ "node-gyp": "~8.4.1",
+ "readable-stream": "^2.1.4",
+ "tap": "~0.7.1",
+ "xtend": "~4.0.0"
+ },
+ "license": "MIT",
+ "gitHead": "22c8ac4b6de36a66a1cfef9363d4d7c12db87cd6",
+ "bugs": {
+ "url": "https://github.com/nodejs/nan/issues"
+ },
+ "_id": "nan@2.16.0",
+ "_nodeVersion": "18.2.0",
+ "_npmVersion": "8.10.0",
+ "dist": {
+ "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
+ "shasum": "664f43e45460fb98faf00edca0bb0d7b8dce7916",
+ "tarball": "http://localhost:4260/nan/nan-2.16.0.tgz",
+ "fileCount": 47,
+ "unpackedSize": 422414
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/nodejs/nan.git"
+ },
+ "homepage": "https://github.com/nodejs/nan#readme",
+ "bugs": {
+ "url": "https://github.com/nodejs/nan/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/nanoid/registry.json b/tests/registry/npm/nanoid/registry.json
index c77ccbf18..1a5b9d44b 100644
--- a/tests/registry/npm/nanoid/registry.json
+++ b/tests/registry/npm/nanoid/registry.json
@@ -1 +1,101 @@
-{"name":"nanoid","description":"A tiny (116 bytes), secure URL-friendly unique string ID generator","dist-tags":{"latest":"3.3.4"},"versions":{"3.3.4":{"name":"nanoid","version":"3.3.4","description":"A tiny (116 bytes), secure URL-friendly unique string ID generator","engines":{"node":"^10 || ^12 || ^13.7 || ^14 || >=15.0.1"},"author":{"name":"Andrey Sitnik","email":"andrey@sitnik.ru"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ai/nanoid.git"},"browser":{"./index.js":"./index.browser.js","./async/index.js":"./async/index.browser.js","./async/index.cjs":"./async/index.browser.cjs","./index.cjs":"./index.browser.cjs"},"react-native":"index.js","bin":{"nanoid":"bin/nanoid.cjs"},"sideEffects":false,"types":"./index.d.ts","type":"module","main":"index.cjs","module":"index.js","exports":{".":{"types":"./index.d.ts","browser":"./index.browser.js","require":"./index.cjs","import":"./index.js","default":"./index.js"},"./index.d.ts":"./index.d.ts","./package.json":"./package.json","./async/package.json":"./async/package.json","./async":{"browser":"./async/index.browser.js","require":"./async/index.cjs","import":"./async/index.js","default":"./async/index.js"},"./non-secure/package.json":"./non-secure/package.json","./non-secure":{"require":"./non-secure/index.cjs","import":"./non-secure/index.js","default":"./non-secure/index.js"},"./url-alphabet/package.json":"./url-alphabet/package.json","./url-alphabet":{"require":"./url-alphabet/index.cjs","import":"./url-alphabet/index.js","default":"./url-alphabet/index.js"}},"gitHead":"fc5bd0dbba830b1e6f3e572da8e2bc9ddc1b4b44","bugs":{"url":"https://github.com/ai/nanoid/issues"},"_id":"nanoid@3.3.4","_nodeVersion":"18.0.0","_npmVersion":"8.6.0","dist":{"integrity":"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==","shasum":"730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab","tarball":"http://localhost:4260/nanoid/nanoid-3.3.4.tgz","fileCount":24,"unpackedSize":21583,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEXG2ta5bIaT6snvQFKV+m1KjuF4DaCpp186tcPo8vsRAiB2Eg9/6nKRi4lZOfwQC1fgq4EzrFjU8T+uqwGxWEQE8A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJicQqNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6rw/+IRvv2zOtwi8goF3h1VctIQVWtTtYrobDIVC2W++jyxdbgZoP\r\n2CDj1YWjrr+eM6O6sI1Bj+bF+yoqQ+z8ojtfW3vtRPpjzUf/7Sgs4F2ANshp\r\ne3rqdaQLjpHPriHf6HmPJy3YNJ+7n5TPPGoTEGXAe4eCZdko3XidCMWZdHlf\r\nYQU9CVYiG6mjjORkWw1sYctt8exdcGFMh0QoQq7BEp04QWm04JwvHjUiAgvf\r\nmEQLrNrf9nwzjpnubAJD+1z6fKOc9vUE44MOj2PkPoOr6a+iBBBgwBf45cnj\r\ng8R2G5xzxsRRB0a8XZdp67y3WA8rIaYaUuBFtEWYp7QFoA/tp6AGmHEAhjLa\r\nQKTquG7ejBu21ZsQaxpGc/3WWLEm+7F78GF8CXpQdtg0Kg1eugRotSNnU0SO\r\nPLiyYV4Mw6kXnbVchS5Y+HmcDVEcSBMTve/f1KpmIhJueJ20RCg4MGYZWgI9\r\nNJ1KgH2h4djX4XuoXpcsKnX3oVfinHEMke8sLWXHsMAtOxDipEWgW9cE9hk0\r\n71Y6LAAPBu34pmaj73B0qZiIY7wXxoGWQOCl2STS/VyDG/K9w1T+WiYROu+8\r\nE9Gd+f4qXmdi7Jw6May86DDfauCwBP3gnrB5aeOktCjWsgrrdClN3Hv2pIAN\r\noJcjS3IURf6oeV4+Yw1B5GoJu1Y/6U75fOU=\r\n=IMnM\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# Nano ID\n\n<img src=\"https://ai.github.io/nanoid/logo.svg\" align=\"right\"\n alt=\"Nano ID logo by Anton Lovchikov\" width=\"180\" height=\"94\">\n\n**English** | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | [Bahasa Indonesia](./README.id-ID.md)\n\nA tiny, secure, URL-friendly, unique string ID generator for JavaScript.\n\n> “An amazing level of senseless perfectionism,\n> which is simply impossible not to respect.”\n\n* **Small.** 130 bytes (minified and gzipped). No dependencies.\n [Size Limit] controls the size.\n* **Fast.** It is 2 times faster than UUID.\n* **Safe.** It uses hardware random generator. Can be used in clusters.\n* **Short IDs.** It uses a larger alphabet than UUID (`A-Za-z0-9_-`).\n So ID size was reduced from 36 to 21 symbols.\n* **Portable.** Nano ID was ported\n to [20 programming languages](#other-programming-languages).\n\n```js\nimport { nanoid } from 'nanoid'\nmodel.id = nanoid() //=> \"V1StGXR8_Z5jdHi6B-myT\"\n```\n\nSupports modern browsers, IE [with Babel], Node.js and React Native.\n\n[online tool]: https://gitpod.io/#https://github.com/ai/nanoid/\n[with Babel]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/\n[Size Limit]: https://github.com/ai/size-limit\n\n<a href=\"https://evilmartians.com/?utm_source=nanoid\">\n <img src=\"https://evilmartians.com/badges/sponsored-by-evil-martians.svg\"\n alt=\"Sponsored by Evil Martians\" width=\"236\" height=\"54\">\n</a>\n\n## Docs\nRead **[full docs](https://github.com/ai/nanoid#readme)** on GitHub.\n","homepage":"https://github.com/ai/nanoid#readme","repository":{"type":"git","url":"git+https://github.com/ai/nanoid.git"},"author":{"name":"Andrey Sitnik","email":"andrey@sitnik.ru"},"bugs":{"url":"https://github.com/ai/nanoid/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "nanoid",
+ "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator",
+ "dist-tags": {
+ "latest": "3.3.4"
+ },
+ "versions": {
+ "3.3.4": {
+ "name": "nanoid",
+ "version": "3.3.4",
+ "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator",
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ },
+ "author": {
+ "name": "Andrey Sitnik",
+ "email": "andrey@sitnik.ru"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ai/nanoid.git"
+ },
+ "browser": {
+ "./index.js": "./index.browser.js",
+ "./async/index.js": "./async/index.browser.js",
+ "./async/index.cjs": "./async/index.browser.cjs",
+ "./index.cjs": "./index.browser.cjs"
+ },
+ "react-native": "index.js",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "sideEffects": false,
+ "types": "./index.d.ts",
+ "type": "module",
+ "main": "index.cjs",
+ "module": "index.js",
+ "exports": {
+ ".": {
+ "types": "./index.d.ts",
+ "browser": "./index.browser.js",
+ "require": "./index.cjs",
+ "import": "./index.js",
+ "default": "./index.js"
+ },
+ "./index.d.ts": "./index.d.ts",
+ "./package.json": "./package.json",
+ "./async/package.json": "./async/package.json",
+ "./async": {
+ "browser": "./async/index.browser.js",
+ "require": "./async/index.cjs",
+ "import": "./async/index.js",
+ "default": "./async/index.js"
+ },
+ "./non-secure/package.json": "./non-secure/package.json",
+ "./non-secure": {
+ "require": "./non-secure/index.cjs",
+ "import": "./non-secure/index.js",
+ "default": "./non-secure/index.js"
+ },
+ "./url-alphabet/package.json": "./url-alphabet/package.json",
+ "./url-alphabet": {
+ "require": "./url-alphabet/index.cjs",
+ "import": "./url-alphabet/index.js",
+ "default": "./url-alphabet/index.js"
+ }
+ },
+ "gitHead": "fc5bd0dbba830b1e6f3e572da8e2bc9ddc1b4b44",
+ "bugs": {
+ "url": "https://github.com/ai/nanoid/issues"
+ },
+ "_id": "nanoid@3.3.4",
+ "_nodeVersion": "18.0.0",
+ "_npmVersion": "8.6.0",
+ "dist": {
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "shasum": "730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab",
+ "tarball": "http://localhost:4260/nanoid/nanoid-3.3.4.tgz",
+ "fileCount": 24,
+ "unpackedSize": 21583
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/ai/nanoid#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ai/nanoid.git"
+ },
+ "author": {
+ "name": "Andrey Sitnik",
+ "email": "andrey@sitnik.ru"
+ },
+ "bugs": {
+ "url": "https://github.com/ai/nanoid/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/negotiator/registry.json b/tests/registry/npm/negotiator/registry.json
index 65032ffe1..9b87dc10a 100644
--- a/tests/registry/npm/negotiator/registry.json
+++ b/tests/registry/npm/negotiator/registry.json
@@ -1 +1,60 @@
-{"name":"negotiator","description":"HTTP content negotiation","dist-tags":{"latest":"0.6.3"},"versions":{"0.6.3":{"name":"negotiator","description":"HTTP content negotiation","version":"0.6.3","license":"MIT","repository":{"type":"git","url":"git+https://github.com/jshttp/negotiator.git"},"devDependencies":{"eslint":"7.32.0","eslint-plugin-markdown":"2.2.1","mocha":"9.1.3","nyc":"15.1.0"},"engines":{"node":">= 0.6"},"scripts":{"lint":"eslint .","test":"mocha --reporter spec --check-leaks --bail test/","test-ci":"nyc --reporter=lcov --reporter=text npm test","test-cov":"nyc --reporter=html --reporter=text npm test"},"gitHead":"40a5acb0c878cca951bc44d1d9e2ab1f90ae813e","bugs":{"url":"https://github.com/jshttp/negotiator/issues"},"_id":"negotiator@0.6.3","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==","shasum":"58e323a72fedc0d6f9cd4d31fe49f51479590ccd","tarball":"http://localhost:4260/negotiator/negotiator-0.6.3.tgz","fileCount":9,"unpackedSize":27375,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh7LRVCRA9TVsSAnZWagAADXQQAIRjFiv7jUhvg/7FE3tH\nLDOBadiC2gYFtN86BitJeUZGhyGMn0kkJQ4bxxRmZHfJBS3XGSDiPd3pRPWl\nyAB2HHJ3JpXS3pM1CdnUvxI6aLg/EVwO/qISHoFLYfx86M721ZPOoCs1mUDy\nVL0AZTR55cCIaF/5sl4CWKxWTnX2CUltGDJKKQsXo+eKuLhNZ8G76PdXABoG\n1gDpwALLFaAW0CYh/sIy6st9JTTx4gHkVcPHZLtsmeyzdKGMxzaXLpU6/xhr\nP2/lBMg6t8xRtu4e76/hzBJSaRnL78EXLndwYbdHXABoFkzM5qpLD+UY5eNT\nMsDK/aHTxnIIyg8LBC8qPagdH7sB8MXOnMzR7gKOjHzPUNqqQVpyCkc/ipaE\nsKNh0AfEJ6qxfht6DYT1sLGSCmDhX3ivleOiIj+nKSAeNa/rk1Hvsfj2FNQN\nKjFidMLwB04+l9chMTNEtNq/Pxk9+zen27vD0JkuqwXovgHvESRWGtlE47M8\npxi4gBypqHMUe9G6FO3RZ7pzLzkfXfwaKDWY28/TEskJO8rZsvsb87JL+BK1\nymaGSP/G7kQROLaTIY5/Oa5KbXI20DBvkkY77BofAOS/H/CTrFBe/vtoH3YM\nmuaNzt2miXUxKFQszMBL0uWjy9K49Yuf5+cHKPsuKydKDG/FeOaGLF6Eu9SI\nhK4i\r\n=du2Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwWK0qSZqF/rTSc9yQVnO06hqkMpn44qT6AjizctXUeQIhAJ6VHibmzze9aOy2LJSVenGWZcWx8zUFvmENe9uhlhZr"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# negotiator\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n[![Node.js Version][node-version-image]][node-version-url]\n[![Build Status][github-actions-ci-image]][github-actions-ci-url]\n[![Test Coverage][coveralls-image]][coveralls-url]\n\nAn HTTP content negotiator for Node.js\n\n## Installation\n\n```sh\n$ npm install negotiator\n```\n\n## API\n\n```js\nvar Negotiator = require('negotiator')\n```\n\n### Accept Negotiation\n\n```js\navailableMediaTypes = ['text/html', 'text/plain', 'application/json']\n\n// The negotiator constructor receives a request object\nnegotiator = new Negotiator(request)\n\n// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8'\n\nnegotiator.mediaTypes()\n// -> ['text/html', 'image/jpeg', 'application/*']\n\nnegotiator.mediaTypes(availableMediaTypes)\n// -> ['text/html', 'application/json']\n\nnegotiator.mediaType(availableMediaTypes)\n// -> 'text/html'\n```\n\nYou can check a working example at `examples/accept.js`.\n\n#### Methods\n\n##### mediaType()\n\nReturns the most preferred media type from the client.\n\n##### mediaType(availableMediaType)\n\nReturns the most preferred media type from a list of available media types.\n\n##### mediaTypes()\n\nReturns an array of preferred media types ordered by the client preference.\n\n##### mediaTypes(availableMediaTypes)\n\nReturns an array of preferred media types ordered by priority from a list of\navailable media types.\n\n### Accept-Language Negotiation\n\n```js\nnegotiator = new Negotiator(request)\n\navailableLanguages = ['en', 'es', 'fr']\n\n// Let's say Accept-Language header is 'en;q=0.8, es, pt'\n\nnegotiator.languages()\n// -> ['es', 'pt', 'en']\n\nnegotiator.languages(availableLanguages)\n// -> ['es', 'en']\n\nlanguage = negotiator.language(availableLanguages)\n// -> 'es'\n```\n\nYou can check a working example at `examples/language.js`.\n\n#### Methods\n\n##### language()\n\nReturns the most preferred language from the client.\n\n##### language(availableLanguages)\n\nReturns the most preferred language from a list of available languages.\n\n##### languages()\n\nReturns an array of preferred languages ordered by the client preference.\n\n##### languages(availableLanguages)\n\nReturns an array of preferred languages ordered by priority from a list of\navailable languages.\n\n### Accept-Charset Negotiation\n\n```js\navailableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5']\n\nnegotiator = new Negotiator(request)\n\n// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2'\n\nnegotiator.charsets()\n// -> ['utf-8', 'iso-8859-1', 'utf-7']\n\nnegotiator.charsets(availableCharsets)\n// -> ['utf-8', 'iso-8859-1']\n\nnegotiator.charset(availableCharsets)\n// -> 'utf-8'\n```\n\nYou can check a working example at `examples/charset.js`.\n\n#### Methods\n\n##### charset()\n\nReturns the most preferred charset from the client.\n\n##### charset(availableCharsets)\n\nReturns the most preferred charset from a list of available charsets.\n\n##### charsets()\n\nReturns an array of preferred charsets ordered by the client preference.\n\n##### charsets(availableCharsets)\n\nReturns an array of preferred charsets ordered by priority from a list of\navailable charsets.\n\n### Accept-Encoding Negotiation\n\n```js\navailableEncodings = ['identity', 'gzip']\n\nnegotiator = new Negotiator(request)\n\n// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5'\n\nnegotiator.encodings()\n// -> ['gzip', 'identity', 'compress']\n\nnegotiator.encodings(availableEncodings)\n// -> ['gzip', 'identity']\n\nnegotiator.encoding(availableEncodings)\n// -> 'gzip'\n```\n\nYou can check a working example at `examples/encoding.js`.\n\n#### Methods\n\n##### encoding()\n\nReturns the most preferred encoding from the client.\n\n##### encoding(availableEncodings)\n\nReturns the most preferred encoding from a list of available encodings.\n\n##### encodings()\n\nReturns an array of preferred encodings ordered by the client preference.\n\n##### encodings(availableEncodings)\n\nReturns an array of preferred encodings ordered by priority from a list of\navailable encodings.\n\n## See Also\n\nThe [accepts](https://npmjs.org/package/accepts#readme) module builds on\nthis module and provides an alternative interface, mime type validation,\nand more.\n\n## License\n\n[MIT](LICENSE)\n\n[npm-image]: https://img.shields.io/npm/v/negotiator.svg\n[npm-url]: https://npmjs.org/package/negotiator\n[node-version-image]: https://img.shields.io/node/v/negotiator.svg\n[node-version-url]: https://nodejs.org/en/download/\n[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg\n[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master\n[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg\n[downloads-url]: https://npmjs.org/package/negotiator\n[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/negotiator/ci/master?label=ci\n[github-actions-ci-url]: https://github.com/jshttp/negotiator/actions/workflows/ci.yml\n","repository":{"type":"git","url":"git+https://github.com/jshttp/negotiator.git"},"homepage":"https://github.com/jshttp/negotiator#readme","bugs":{"url":"https://github.com/jshttp/negotiator/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "negotiator",
+ "description": "HTTP content negotiation",
+ "dist-tags": {
+ "latest": "0.6.3"
+ },
+ "versions": {
+ "0.6.3": {
+ "name": "negotiator",
+ "description": "HTTP content negotiation",
+ "version": "0.6.3",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jshttp/negotiator.git"
+ },
+ "devDependencies": {
+ "eslint": "7.32.0",
+ "eslint-plugin-markdown": "2.2.1",
+ "mocha": "9.1.3",
+ "nyc": "15.1.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "test": "mocha --reporter spec --check-leaks --bail test/",
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
+ },
+ "gitHead": "40a5acb0c878cca951bc44d1d9e2ab1f90ae813e",
+ "bugs": {
+ "url": "https://github.com/jshttp/negotiator/issues"
+ },
+ "_id": "negotiator@0.6.3",
+ "_nodeVersion": "16.13.1",
+ "_npmVersion": "8.1.2",
+ "dist": {
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "shasum": "58e323a72fedc0d6f9cd4d31fe49f51479590ccd",
+ "tarball": "http://localhost:4260/negotiator/negotiator-0.6.3.tgz",
+ "fileCount": 9,
+ "unpackedSize": 27375
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jshttp/negotiator.git"
+ },
+ "homepage": "https://github.com/jshttp/negotiator#readme",
+ "bugs": {
+ "url": "https://github.com/jshttp/negotiator/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/node-gyp/registry.json b/tests/registry/npm/node-gyp/registry.json
index 28fed475d..ec7ed18cd 100644
--- a/tests/registry/npm/node-gyp/registry.json
+++ b/tests/registry/npm/node-gyp/registry.json
@@ -1 +1,88 @@
-{"name":"node-gyp","description":"Node.js native addon build tool","dist-tags":{"latest":"10.1.0"},"versions":{"10.1.0":{"name":"node-gyp","description":"Node.js native addon build tool","license":"MIT","version":"10.1.0","installVersion":11,"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/nodejs/node-gyp.git"},"preferGlobal":true,"bin":{"node-gyp":"bin/node-gyp.js"},"main":"./lib/node-gyp.js","dependencies":{"env-paths":"^2.2.0","exponential-backoff":"^3.1.1","glob":"^10.3.10","graceful-fs":"^4.2.6","make-fetch-happen":"^13.0.0","nopt":"^7.0.0","proc-log":"^3.0.0","semver":"^7.3.5","tar":"^6.1.2","which":"^4.0.0"},"engines":{"node":"^16.14.0 || >=18.0.0"},"devDependencies":{"bindings":"^1.5.0","cross-env":"^7.0.3","mocha":"^10.2.0","nan":"^2.14.2","require-inject":"^1.4.4","standard":"^17.0.0"},"scripts":{"lint":"standard \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"","test":"cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 15000 test/test-download.js test/test-*"},"_id":"node-gyp@10.1.0","gitHead":"f90ce122fe564be68368d0c0dec5dacd9e770233","bugs":{"url":"https://github.com/nodejs/node-gyp/issues"},"_nodeVersion":"20.7.0","_npmVersion":"10.4.0","dist":{"integrity":"sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==","shasum":"75e6f223f2acb4026866c26a2ead6aab75a8ca7e","tarball":"http://localhost:4260/node-gyp/node-gyp-10.1.0.tgz","fileCount":95,"unpackedSize":1726747,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtbTgP5X+OUoSr0tJFu0vdmD4bvPepthKw2IeF8rfGUQIhAOZ9Zy/krKn/tkSabJlX4z7bqNnUxS+es34pGSTb3Jfy"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# `node-gyp` - Node.js native addon build tool\n\n[![Build Status](https://github.com/nodejs/node-gyp/workflows/Tests/badge.svg?branch=main)](https://github.com/nodejs/node-gyp/actions?query=workflow%3ATests+branch%3Amain)\n![npm](https://img.shields.io/npm/dm/node-gyp)\n\n`node-gyp` is a cross-platform command-line tool written in Node.js for\ncompiling native addon modules for Node.js. It contains a vendored copy of the\n[gyp-next](https://github.com/nodejs/gyp-next) project that was previously used\nby the Chromium team and extended to support the development of Node.js native\naddons.\n\nNote that `node-gyp` is _not_ used to build Node.js itself.\n\nAll current and LTS target versions of Node.js are supported. Depending on what version of Node.js is actually installed on your system\n`node-gyp` downloads the necessary development files or headers for the target version. List of stable Node.js versions can be found on [Node.js website](https://nodejs.org/en/about/previous-releases).\n\n## Features\n\n * The same build commands work on any of the supported platforms\n * Supports the targeting of different versions of Node.js\n\n## Installation\n\nYou can install `node-gyp` using `npm`:\n\n``` bash\nnpm install -g node-gyp\n```\n\nDepending on your operating system, you will need to install:\n\n### On Unix\n\n * [A supported version of Python](https://devguide.python.org/versions/)\n * `make`\n * A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org)\n\n### On macOS\n\n * [A supported version of Python](https://devguide.python.org/versions/)\n * `Xcode Command Line Tools` which will install `clang`, `clang++`, and `make`.\n * Install the `Xcode Command Line Tools` standalone by running `xcode-select --install`. -- OR --\n * Alternatively, if you already have the [full Xcode installed](https://developer.apple.com/xcode/download/), you can install the Command Line Tools under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`.\n\n\n### On Windows\n\nInstall the current [version of Python](https://devguide.python.org/versions/) from the\n[Microsoft Store](https://apps.microsoft.com/store/search?publisher=Python+Software+Foundation).\n\nInstall tools and configuration manually:\n * Install Visual C++ Build Environment: For Visual Studio 2019 or later, use the `Desktop development with C++` workload from [Visual Studio Community](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community). For a version older than Visual Studio 2019, install [Visual Studio Build Tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools) with the `Visual C++ build tools` option.\n\n If the above steps didn't work for you, please visit [Microsoft's Node.js Guidelines for Windows](https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#compiling-native-addon-modules) for additional tips.\n\n To target native ARM64 Node.js on Windows on ARM, add the components \"Visual C++ compilers and libraries for ARM64\" and \"Visual C++ ATL for ARM64\".\n\n To use the native ARM64 C++ compiler on Windows on ARM, ensure that you have Visual Studio 2022 [17.4 or later](https://devblogs.microsoft.com/visualstudio/arm64-visual-studio-is-officially-here/) installed.\n\nIt's advised to install following Powershell module: [VSSetup](https://github.com/microsoft/vssetup.powershell) using `Install-Module VSSetup -Scope CurrentUser`.\nThis will make Visual Studio detection logic to use more flexible and accessible method, avoiding Powershell's `ConstrainedLanguage` mode.\n\n### Configuring Python Dependency\n\n`node-gyp` requires that you have installed a [supported version of Python](https://devguide.python.org/versions/).\nIf you have multiple versions of Python installed, you can identify which version\n`node-gyp` should use in one of the following ways:\n\n1. by setting the `--python` command-line option, e.g.:\n\n``` bash\nnode-gyp <command> --python /path/to/executable/python\n```\n\n2. If `node-gyp` is called by way of `npm`, *and* you have multiple versions of\nPython installed, then you can set the `npm_config_python` environment variable\nto the appropriate path:\n``` bash\nexport npm_config_python=/path/to/executable/python\n```\n&nbsp;&nbsp;&nbsp;&nbsp;Or on Windows:\n```console\npy --list-paths # To see the installed Python versions\nset npm_config_python=C:\\path\\to\\python.exe\n```\n\n3. If the `PYTHON` environment variable is set to the path of a Python executable,\nthen that version will be used if it is a supported version.\n\n4. If the `NODE_GYP_FORCE_PYTHON` environment variable is set to the path of a\nPython executable, it will be used instead of any of the other configured or\nbuilt-in Python search paths. If it's not a compatible version, no further\nsearching will be done.\n\n### Build for Third Party Node.js Runtimes\n\nWhen building modules for third-party Node.js runtimes like Electron, which have\ndifferent build configurations from the official Node.js distribution, you\nshould use `--dist-url` or `--nodedir` flags to specify the headers of the\nruntime to build for.\n\nAlso when `--dist-url` or `--nodedir` flags are passed, node-gyp will use the\n`config.gypi` shipped in the headers distribution to generate build\nconfigurations, which is different from the default mode that would use the\n`process.config` object of the running Node.js instance.\n\nSome old versions of Electron shipped malformed `config.gypi` in their headers\ndistributions, and you might need to pass `--force-process-config` to node-gyp\nto work around configuration errors.\n\n## How to Use\n\nTo compile your native addon first go to its root directory:\n\n``` bash\ncd my_node_addon\n```\n\nThe next step is to generate the appropriate project build files for the current\nplatform. Use `configure` for that:\n\n``` bash\nnode-gyp configure\n```\n\nAuto-detection fails for Visual C++ Build Tools 2015, so `--msvs_version=2015`\nneeds to be added (not needed when run by npm as configured above):\n``` bash\nnode-gyp configure --msvs_version=2015\n```\n\n__Note__: The `configure` step looks for a `binding.gyp` file in the current\ndirectory to process. See below for instructions on creating a `binding.gyp` file.\n\nNow you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file\n(on Windows) in the `build/` directory. Next, invoke the `build` command:\n\n``` bash\nnode-gyp build\n```\n\nNow you have your compiled `.node` bindings file! The compiled bindings end up\nin `build/Debug/` or `build/Release/`, depending on the build mode. At this point,\nyou can require the `.node` file with Node.js and run your tests!\n\n__Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or\n`-d`) switch when running either the `configure`, `build` or `rebuild` commands.\n\n## The `binding.gyp` file\n\nA `binding.gyp` file describes the configuration to build your module, in a\nJSON-like format. This file gets placed in the root of your package, alongside\n`package.json`.\n\nA barebones `gyp` file appropriate for building a Node.js addon could look like:\n\n```python\n{\n \"targets\": [\n {\n \"target_name\": \"binding\",\n \"sources\": [ \"src/binding.cc\" ]\n }\n ]\n}\n```\n\n## Further reading\n\nThe **[docs](./docs/)** directory contains additional documentation on specific node-gyp topics that may be useful if you are experiencing problems installing or building addons using node-gyp.\n\nSome additional resources for Node.js native addons and writing `gyp` configuration files:\n\n * [\"Going Native\" a nodeschool.io tutorial](http://nodeschool.io/#goingnative)\n * [\"Hello World\" node addon example](https://github.com/nodejs/node/tree/main/test/addons/hello-world)\n * [gyp user documentation](https://gyp.gsrc.io/docs/UserDocumentation.md)\n * [gyp input format reference](https://gyp.gsrc.io/docs/InputFormatReference.md)\n * [*\"binding.gyp\" files out in the wild* wiki page](./docs/binding.gyp-files-in-the-wild.md)\n\n## Commands\n\n`node-gyp` responds to the following commands:\n\n| **Command** | **Description**\n|:--------------|:---------------------------------------------------------------\n| `help` | Shows the help dialog\n| `build` | Invokes `make`/`msbuild.exe` and builds the native addon\n| `clean` | Removes the `build` directory if it exists\n| `configure` | Generates project build files for the current platform\n| `rebuild` | Runs `clean`, `configure` and `build` all in a row\n| `install` | Installs Node.js header files for the given version\n| `list` | Lists the currently installed Node.js header versions\n| `remove` | Removes the Node.js header files for the given version\n\n\n## Command Options\n\n`node-gyp` accepts the following command options:\n\n| **Command** | **Description**\n|:----------------------------------|:------------------------------------------\n| `-j n`, `--jobs n` | Run `make` in parallel. The value `max` will use all available CPU cores\n| `--target=v6.2.1` | Node.js version to build for (default is `process.version`)\n| `--silly`, `--loglevel=silly` | Log all progress to console\n| `--verbose`, `--loglevel=verbose` | Log most progress to console\n| `--silent`, `--loglevel=silent` | Don't log anything to console\n| `debug`, `--debug` | Make Debug build (default is `Release`)\n| `--release`, `--no-debug` | Make Release build\n| `-C $dir`, `--directory=$dir` | Run command in different directory\n| `--make=$make` | Override `make` command (e.g. `gmake`)\n| `--thin=yes` | Enable thin static libraries\n| `--arch=$arch` | Set target architecture (e.g. ia32)\n| `--tarball=$path` | Get headers from a local tarball\n| `--devdir=$path` | SDK download directory (default is OS cache directory)\n| `--ensure` | Don't reinstall headers if already present\n| `--dist-url=$url` | Download header tarball from custom URL\n| `--proxy=$url` | Set HTTP(S) proxy for downloading header tarball\n| `--noproxy=$urls` | Set urls to ignore proxies when downloading header tarball\n| `--cafile=$cafile` | Override default CA chain (to download tarball)\n| `--nodedir=$path` | Set the path to the node source code\n| `--python=$path` | Set path to the Python binary\n| `--msvs_version=$version` | Set Visual Studio version (Windows only)\n| `--solution=$solution` | Set Visual Studio Solution version (Windows only)\n| `--force-process-config` | Force using runtime's `process.config` object to generate `config.gypi` file\n\n## Configuration\n\n### Environment variables\n\nUse the form `npm_config_OPTION_NAME` for any of the command options listed\nabove (dashes in option names should be replaced by underscores).\n\nFor example, to set `devdir` equal to `/tmp/.gyp`, you would:\n\nRun this on Unix:\n\n```bash\nexport npm_config_devdir=/tmp/.gyp\n```\n\nOr this on Windows:\n\n```console\nset npm_config_devdir=c:\\temp\\.gyp\n```\n\n### `npm` configuration for npm versions before v9\n\nUse the form `OPTION_NAME` for any of the command options listed above.\n\nFor example, to set `devdir` equal to `/tmp/.gyp`, you would run:\n\n```bash\nnpm config set [--global] devdir /tmp/.gyp\n```\n\n**Note:** Configuration set via `npm` will only be used when `node-gyp`\nis run via `npm`, not when `node-gyp` is run directly.\n\n## License\n\n`node-gyp` is available under the MIT license. See the [LICENSE\nfile](LICENSE) for details.\n","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/nodejs/node-gyp.git"},"homepage":"https://github.com/nodejs/node-gyp#readme","bugs":{"url":"https://github.com/nodejs/node-gyp/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "node-gyp",
+ "description": "Node.js native addon build tool",
+ "dist-tags": {
+ "latest": "10.1.0"
+ },
+ "versions": {
+ "10.1.0": {
+ "name": "node-gyp",
+ "description": "Node.js native addon build tool",
+ "license": "MIT",
+ "version": "10.1.0",
+ "installVersion": 11,
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://tootallnate.net"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/nodejs/node-gyp.git"
+ },
+ "preferGlobal": true,
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "main": "./lib/node-gyp.js",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^13.0.0",
+ "nopt": "^7.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.3.5",
+ "tar": "^6.1.2",
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ },
+ "devDependencies": {
+ "bindings": "^1.5.0",
+ "cross-env": "^7.0.3",
+ "mocha": "^10.2.0",
+ "nan": "^2.14.2",
+ "require-inject": "^1.4.4",
+ "standard": "^17.0.0"
+ },
+ "scripts": {
+ "lint": "standard \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"",
+ "test": "cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 15000 test/test-download.js test/test-*"
+ },
+ "_id": "node-gyp@10.1.0",
+ "gitHead": "f90ce122fe564be68368d0c0dec5dacd9e770233",
+ "bugs": {
+ "url": "https://github.com/nodejs/node-gyp/issues"
+ },
+ "_nodeVersion": "20.7.0",
+ "_npmVersion": "10.4.0",
+ "dist": {
+ "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
+ "shasum": "75e6f223f2acb4026866c26a2ead6aab75a8ca7e",
+ "tarball": "http://localhost:4260/node-gyp/node-gyp-10.1.0.tgz",
+ "fileCount": 95,
+ "unpackedSize": 1726747
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://tootallnate.net"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/nodejs/node-gyp.git"
+ },
+ "homepage": "https://github.com/nodejs/node-gyp#readme",
+ "bugs": {
+ "url": "https://github.com/nodejs/node-gyp/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/node-releases/registry.json b/tests/registry/npm/node-releases/registry.json
index 746c1b9a9..4f75dfd62 100644
--- a/tests/registry/npm/node-releases/registry.json
+++ b/tests/registry/npm/node-releases/registry.json
@@ -1 +1,23 @@
-{"name":"node-releases","dist-tags":{"latest":"2.0.10"},"versions":{"2.0.10":{"name":"node-releases","version":"2.0.10","devDependencies":{"semver":"^7.3.5"},"dist":{"integrity":"sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==","shasum":"c311ebae3b6a148c89b1813fd7c4d3c024ef537f","tarball":"http://localhost:4260/node-releases/node-releases-2.0.10.tgz","fileCount":5,"unpackedSize":26375,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF9icmNdOcyUVLQHOiEiTz3rZgok1SCYgmlVtdE8x3PdAiEAylmK7swuHqmjOa/km5bZ4oc4DJVO7ZqUnbVwcl2gVIc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4HXPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpr9w//f+XlE/brbUzrtc7EnDKQRplojKA0n+Y+eYK0/Dd18HMHD3CT\r\n/Sxj5RKWyB+dvrrRmzFhrdqStBTgOEifJLm/C+bEF2vrydj1CmXC3UrkMUtE\r\nN5ToB13Qs+PxwE5d0N5mKXiyjSlE48cASewtulHhNuBs1O6fMhXqfUFBuM0X\r\nGlo0rSujlr1RmZn1m46WpMw4wyeIdSNGSXBp5SVy0aXB5nqRZXfa9hGhj9mP\r\nAj/w+QSimUzg1X0eQ82gluSJersno1gOkeoiRkfIUPfDpPFcnXC9BmZ6yAcW\r\nQO+LJloOI3fRwACPaeD6Qit3YFTMZ+uxKMJY2cyihzfyV91K3SxfNGFjn3Q4\r\nM+jE8/mewVlm9JvGN9phFJmSYJiu10FOhY+mLhygKrjR6u6fLFgpA+9J2dWw\r\nsODMQP4Cfw9N1rqRgWWikjbNkJihSaPRipgmpmp/ZkzT8G5pctQWEco1DKzo\r\n0rP45YM3X3HCXY+45ormhW8z594nZj0Vp0YGPjosvgo3NutNnLgBKYqUSNm6\r\nn4iqJW3BIVdDko4gVDeS5D8L7R9PTBuAoa80B7Guizk0mDvqvB5D1dodcr1p\r\nuw5TOXnMD3AzzzbkwOBov3vxr/8dbGXIb0Aq5gmJFTrXvtS7m+UrAkQNHb1A\r\nzT8T8UUcxMXpoO5UxR7s46F9RKq2c3s3NHE=\r\n=7Zmt\r\n-----END PGP SIGNATURE-----\r\n"}}},"modified":"2023-02-16T04:28:15.119Z"}
+{
+ "name": "node-releases",
+ "dist-tags": {
+ "latest": "2.0.10"
+ },
+ "versions": {
+ "2.0.10": {
+ "name": "node-releases",
+ "version": "2.0.10",
+ "devDependencies": {
+ "semver": "^7.3.5"
+ },
+ "dist": {
+ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+ "shasum": "c311ebae3b6a148c89b1813fd7c4d3c024ef537f",
+ "tarball": "http://localhost:4260/node-releases/node-releases-2.0.10.tgz",
+ "fileCount": 5,
+ "unpackedSize": 26375
+ }
+ }
+ },
+ "modified": "2023-02-16T04:28:15.119Z"
+}
diff --git a/tests/registry/npm/nopt/registry.json b/tests/registry/npm/nopt/registry.json
index 529de6bca..8fb40973e 100644
--- a/tests/registry/npm/nopt/registry.json
+++ b/tests/registry/npm/nopt/registry.json
@@ -1 +1,93 @@
-{"name":"nopt","description":"Option parsing for Node, supporting types, shorthands, etc. Used by npm.","dist-tags":{"latest":"7.2.1"},"versions":{"7.2.1":{"name":"nopt","version":"7.2.1","author":{"name":"GitHub Inc."},"license":"ISC","_id":"nopt@7.2.1","bugs":{"url":"https://github.com/npm/nopt/issues"},"bin":{"nopt":"bin/nopt.js"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"1cac0eab9b8e97c9093338446eddd40b2c8ca1e7","tarball":"http://localhost:4260/nopt/nopt-7.2.1.tgz","fileCount":8,"integrity":"sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==","signatures":[{"sig":"MEUCIQDsGsywXebnr3VNxXxSfSuZKiPrOTyj3J5TmMy6Wh+dIQIgOqooSxmxbTSlbegMSG8W/S9pHAsXDSFZAdCxO9OQqaU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/nopt@7.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26203},"main":"lib/nopt.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"6d33cd7a772c9594d42417c69e7adeb497b16b03","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/nopt.git","type":"git"},"_npmVersion":"10.7.0","description":"Option parsing for Node, supporting types, shorthands, etc. Used by npm.","directories":{},"templateOSS":{"publish":true,"version":"4.22.0","windowsCI":false,"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"22.1.0","dependencies":{"abbrev":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/nopt.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/nopt#readme","bugs":{"url":"https://github.com/npm/nopt/issues"},"readme":"If you want to write an option parser, and have it be good, there are\ntwo ways to do it. The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser. We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you hit the limit of your frustration just trying to\nmanage them all, and defer it with duct-tape solutions until you see\nexactly to the core of the problem, and finally snap and write an\nawesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system. You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n```javascript\n// my-program.js\nvar nopt = require(\"nopt\")\n , Stream = require(\"stream\").Stream\n , path = require(\"path\")\n , knownOpts = { \"foo\" : [String, null]\n , \"bar\" : [Stream, Number]\n , \"baz\" : path\n , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n , \"flag\" : Boolean\n , \"pick\" : Boolean\n , \"many1\" : [String, Array]\n , \"many2\" : [path, Array]\n }\n , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n , \"b7\" : [\"--bar\", \"7\"]\n , \"m\" : [\"--bloo\", \"medium\"]\n , \"p\" : [\"--pick\"]\n , \"f\" : [\"--flag\"]\n }\n // everything is optional.\n // knownOpts and shorthands default to {}\n // arg list defaults to process.argv\n // slice defaults to 2\n , parsed = nopt(knownOpts, shortHands, process.argv, 2)\nconsole.log(parsed)\n```\n\nThis would give you support for any of the following:\n\n```console\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk -fp # unknown opts are ok.\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array. The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many1 5 --many1 null --many1 foo\n{ many1: [\"5\", \"null\", \"foo\"] }\n\n$ node my-program.js --many2 foo --many2 bar\n{ many2: [\"/path/to/foo\", \"path/to/bar\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string. No parsing is done.\n* path: A file system path. Gets resolved against cwd if not absolute.\n* url: A url. If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`. If an option is a boolean,\n then it does not need a value, and its presence will imply `true` as\n the value. To negate boolean flags, do `--no-whatever` or `--whatever\n false`\n* NaN: Means that the option is strictly not allowed. Any value will\n fail.\n* Stream: An object matching the \"Stream\" class in node. Valuable\n for use when validating programmatically. (npm uses this to let you\n supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n will be parsed as a list of options. This means that multiple values\n can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values. For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents.\n\nYou can also mix types and values, or multiple types, in a list. For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null. When types are ordered, this implies a\npreference, and the first type that can be used to properly interpret\nthe value will be used.\n\nTo define a new type, add it to `nopt.typeDefs`. Each item in that\nhash is an object with a `type` member and a `validate` method. The\n`type` member is an object that matches what goes in the type list. The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`. Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid values for\nknown options are found. You can change this behavior by assigning a method\nto `nopt.invalidHandler`. This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining. If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported. If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts. For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you. So they're sliced off by\ndefault. If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n","readmeFilename":"README.md"}
+{
+ "name": "nopt",
+ "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
+ "dist-tags": {
+ "latest": "7.2.1"
+ },
+ "versions": {
+ "7.2.1": {
+ "name": "nopt",
+ "version": "7.2.1",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "nopt@7.2.1",
+ "bugs": {
+ "url": "https://github.com/npm/nopt/issues"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "1cac0eab9b8e97c9093338446eddd40b2c8ca1e7",
+ "tarball": "http://localhost:4260/nopt/nopt-7.2.1.tgz",
+ "fileCount": 8,
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/nopt@7.2.1",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 26203
+ },
+ "main": "lib/nopt.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "6d33cd7a772c9594d42417c69e7adeb497b16b03",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/nopt.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
+ "directories": {},
+ "templateOSS": {
+ "publish": true,
+ "version": "4.22.0",
+ "windowsCI": false,
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "22.1.0",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/nopt.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/nopt#readme",
+ "bugs": {
+ "url": "https://github.com/npm/nopt/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/normalize-range/registry.json b/tests/registry/npm/normalize-range/registry.json
index 8f4435994..e489fe3b2 100644
--- a/tests/registry/npm/normalize-range/registry.json
+++ b/tests/registry/npm/normalize-range/registry.json
@@ -1 +1,32 @@
-{"name":"normalize-range","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"name":"normalize-range","version":"0.1.2","devDependencies":{"almost-equal":"^1.0.0","codeclimate-test-reporter":"^0.1.0","coveralls":"^2.11.2","istanbul":"^0.3.17","jscs":"^2.1.1","jshint":"^2.8.0","jshint-stylish":"^2.0.1","mocha":"^2.2.5","stringify-pi":"0.0.3"},"dist":{"shasum":"2d10c06bdfd312ea9777695a4d28439456b75942","tarball":"http://localhost:4260/normalize-range/normalize-range-0.1.2.tgz","integrity":"sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE/pPGFro0Dc2jy+Xczxvr24YzO9s1xQynEBZoe2bi1MAiEAu5ZcDlfU7EqSGImCiQY9jpsumxIQCyAlpFAuAnfjDw8="}]},"engines":{"node":">=0.10.0"}}},"modified":"2022-06-22T05:32:01.991Z"}
+{
+ "name": "normalize-range",
+ "dist-tags": {
+ "latest": "0.1.2"
+ },
+ "versions": {
+ "0.1.2": {
+ "name": "normalize-range",
+ "version": "0.1.2",
+ "devDependencies": {
+ "almost-equal": "^1.0.0",
+ "codeclimate-test-reporter": "^0.1.0",
+ "coveralls": "^2.11.2",
+ "istanbul": "^0.3.17",
+ "jscs": "^2.1.1",
+ "jshint": "^2.8.0",
+ "jshint-stylish": "^2.0.1",
+ "mocha": "^2.2.5",
+ "stringify-pi": "0.0.3"
+ },
+ "dist": {
+ "shasum": "2d10c06bdfd312ea9777695a4d28439456b75942",
+ "tarball": "http://localhost:4260/normalize-range/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ }
+ },
+ "modified": "2022-06-22T05:32:01.991Z"
+}
diff --git a/tests/registry/npm/object-keys/registry.json b/tests/registry/npm/object-keys/registry.json
index 6512efa1c..9d1c0f1d4 100644
--- a/tests/registry/npm/object-keys/registry.json
+++ b/tests/registry/npm/object-keys/registry.json
@@ -1 +1,99 @@
-{"name":"object-keys","description":"An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.1":{"name":"object-keys","version":"1.1.1","author":{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"},"description":"An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim","license":"MIT","main":"index.js","scripts":{"pretest":"npm run --silent lint","test":"npm run --silent tests-only","posttest":"npm run --silent audit","tests-only":"node test/index.js","coverage":"covert test/*.js","coverage-quiet":"covert test/*.js --quiet","lint":"eslint .","preaudit":"npm install --package-lock --package-lock-only","audit":"npm audit","postaudit":"rm package-lock.json"},"repository":{"type":"git","url":"git://github.com/ljharb/object-keys.git"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^13.1.1","covert":"^1.1.1","eslint":"^5.13.0","foreach":"^2.0.5","indexof":"^0.0.1","is":"^3.3.0","tape":"^4.9.2"},"testling":{"files":"test/index.js","browsers":["iexplore/6.0..latest","firefox/3.0..6.0","firefox/15.0..latest","firefox/nightly","chrome/4.0..10.0","chrome/20.0..latest","chrome/canary","opera/10.0..latest","opera/next","safari/4.0..latest","ipad/6.0..latest","iphone/6.0..latest","android-browser/4.2"]},"engines":{"node":">= 0.4"},"gitHead":"ba2c1989270c7de969aa8498fc3b7c8e677806f3","bugs":{"url":"https://github.com/ljharb/object-keys/issues"},"_id":"object-keys@1.1.1","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==","shasum":"1c47f272df277f3b1daf061677d9c82e2322c60e","tarball":"http://localhost:4260/object-keys/object-keys-1.1.1.tgz","fileCount":11,"unpackedSize":26544,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqWC7CRA9TVsSAnZWagAApOoQAIGgpq1xnaDCEe3hqJFt\n1fjwFbEKHTyK59hA/zVmvvR4ikMeltZc5KAIKNt5XyDBO4NtuRcA7E1b3D7C\nFX/IMtPwIq5OvZLWhEnGBNTmwlVq8PI9DwZ6AE2hWM4JAmkT5tay7QtjDAur\nYRdTEEB3eqWETNiaybnF9d1GLKuH4dKcM/v9yiHMp+qa9Ivpe9VtWRj7WTr+\nkxc39JZdSVGFbVYNCFkZ8oyj5VbLOtyMB++6JxbR9fYlZ06ibmT+XrFsz7CF\nr7hQ/XFHlyodg0pi34+YhlyDAsPIvk8DOxDoKGs4aFZ6EqZm3hVnWaAlKqgX\n3ikZAT9Z/4d9icoRkEhVMj7INySL4bSd7lFDIlwGruc4j6U6b6phhwgIlhQE\nMsnWmnLL7/AAaPB8oiNhb8Lt/9/jRJsAHwRBRH9NN/DH2VyP0F2hzp66L5dF\niIVw9YUIBCOzfRg5Gr0qd0GCGbIefcq4AomxsJEdBbV+3AFkJvj7dibMrSb7\nJcBVC/TwJCjNv+Ols7VZE+Yj6ZYbNrsuh5KbPkdFchg6qNgds1Dh1tH8GwrJ\nULdSyACz/0stHNGr8p+Boa85mDseApgozr42UUHdEQyohO1/meNonjDGJl9w\ncLlcHMcR7hnLzp4v54jcv+q74EDZa15iEk/ckLdYFoUXXhRhBJo0XyG43zf8\nEO6O\r\n=PzOq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEXnivOzyezLnJgG1VUzWQj/PurnTkz1ZGYX4uYuK0JgIhAKKg/wGdPhn67UneiElcVANcbwapE+3GGhHJftwDOncL"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"#object-keys <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![Build Status][travis-svg]][travis-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\n[![browser support][testling-svg]][testling-url]\n\nAn Object.keys shim. Invoke its \"shim\" method to shim Object.keys if it is unavailable.\n\nMost common usage:\n```js\nvar keys = Object.keys || require('object-keys');\n```\n\n## Example\n\n```js\nvar keys = require('object-keys');\nvar assert = require('assert');\nvar obj = {\n\ta: true,\n\tb: true,\n\tc: true\n};\n\nassert.deepEqual(keys(obj), ['a', 'b', 'c']);\n```\n\n```js\nvar keys = require('object-keys');\nvar assert = require('assert');\n/* when Object.keys is not present */\ndelete Object.keys;\nvar shimmedKeys = keys.shim();\nassert.equal(shimmedKeys, keys);\nassert.deepEqual(Object.keys(obj), keys(obj));\n```\n\n```js\nvar keys = require('object-keys');\nvar assert = require('assert');\n/* when Object.keys is present */\nvar shimmedKeys = keys.shim();\nassert.equal(shimmedKeys, Object.keys);\nassert.deepEqual(Object.keys(obj), keys(obj));\n```\n\n## Source\nImplementation taken directly from [es5-shim][es5-shim-url], with modifications, including from [lodash][lodash-url].\n\n## Tests\nSimply clone the repo, `npm install`, and run `npm test`\n\n[package-url]: https://npmjs.org/package/object-keys\n[npm-version-svg]: http://versionbadg.es/ljharb/object-keys.svg\n[travis-svg]: https://travis-ci.org/ljharb/object-keys.svg\n[travis-url]: https://travis-ci.org/ljharb/object-keys\n[deps-svg]: https://david-dm.org/ljharb/object-keys.svg\n[deps-url]: https://david-dm.org/ljharb/object-keys\n[dev-deps-svg]: https://david-dm.org/ljharb/object-keys/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/object-keys#info=devDependencies\n[testling-svg]: https://ci.testling.com/ljharb/object-keys.png\n[testling-url]: https://ci.testling.com/ljharb/object-keys\n[es5-shim-url]: https://github.com/es-shims/es5-shim/blob/master/es5-shim.js#L542-589\n[lodash-url]: https://github.com/lodash/lodash\n[npm-badge-png]: https://nodei.co/npm/object-keys.png?downloads=true&stars=true\n[license-image]: http://img.shields.io/npm/l/object-keys.svg\n[license-url]: LICENSE\n[downloads-image]: http://img.shields.io/npm/dm/object-keys.svg\n[downloads-url]: http://npm-stat.com/charts.html?package=object-keys\n\n","author":{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"},"repository":{"type":"git","url":"git://github.com/ljharb/object-keys.git"},"readmeFilename":"README.md","homepage":"https://github.com/ljharb/object-keys#readme","bugs":{"url":"https://github.com/ljharb/object-keys/issues"},"license":"MIT"}
+{
+ "name": "object-keys",
+ "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
+ "dist-tags": {
+ "latest": "1.1.1"
+ },
+ "versions": {
+ "1.1.1": {
+ "name": "object-keys",
+ "version": "1.1.1",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
+ "license": "MIT",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "npm run --silent lint",
+ "test": "npm run --silent tests-only",
+ "posttest": "npm run --silent audit",
+ "tests-only": "node test/index.js",
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "lint": "eslint .",
+ "preaudit": "npm install --package-lock --package-lock-only",
+ "audit": "npm audit",
+ "postaudit": "rm package-lock.json"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/object-keys.git"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@ljharb/eslint-config": "^13.1.1",
+ "covert": "^1.1.1",
+ "eslint": "^5.13.0",
+ "foreach": "^2.0.5",
+ "indexof": "^0.0.1",
+ "is": "^3.3.0",
+ "tape": "^4.9.2"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "ba2c1989270c7de969aa8498fc3b7c8e677806f3",
+ "bugs": {
+ "url": "https://github.com/ljharb/object-keys/issues"
+ },
+ "_id": "object-keys@1.1.1",
+ "_nodeVersion": "11.13.0",
+ "_npmVersion": "6.7.0",
+ "dist": {
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "shasum": "1c47f272df277f3b1daf061677d9c82e2322c60e",
+ "tarball": "http://localhost:4260/object-keys/object-keys-1.1.1.tgz",
+ "fileCount": 11,
+ "unpackedSize": 26544
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/object-keys.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/ljharb/object-keys#readme",
+ "bugs": {
+ "url": "https://github.com/ljharb/object-keys/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/p-limit/registry.json b/tests/registry/npm/p-limit/registry.json
index 876dd9e5f..df87853d5 100644
--- a/tests/registry/npm/p-limit/registry.json
+++ b/tests/registry/npm/p-limit/registry.json
@@ -1 +1,74 @@
-{"name":"p-limit","description":"Run multiple promise-returning & async functions with limited concurrency","dist-tags":{"latest":"2.3.0"},"versions":{"2.3.0":{"name":"p-limit","version":"2.3.0","description":"Run multiple promise-returning & async functions with limited concurrency","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-limit.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava && tsd-check"},"dependencies":{"p-try":"^2.0.0"},"devDependencies":{"ava":"^1.2.1","delay":"^4.1.0","in-range":"^1.0.0","random-int":"^1.0.0","time-span":"^2.0.0","tsd-check":"^0.3.0","xo":"^0.24.0"},"gitHead":"a11f02bc5c04490b7c3de2663d866c211fb915ea","bugs":{"url":"https://github.com/sindresorhus/p-limit/issues"},"_id":"p-limit@2.3.0","_nodeVersion":"10.19.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==","shasum":"3dd33c647a214fdfffd835933eb086da0dc21db1","tarball":"http://localhost:4260/p-limit/p-limit-2.3.0.tgz","fileCount":5,"unpackedSize":7390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeifv9CRA9TVsSAnZWagAAC1oQAJgu/ArafOjG7TW97Uxj\n3Y5d+GdiC6Fr40sWDExogt4uS350422jaisNcfU0W0tlucaPqY1OabpASQbe\ntUOGGJWynBIGSgZuLwQslIsXEzcEBxiFj6hC7CtmWAbeFJVuCLAeBIuMXbLS\nBQSzx3z2dJCF/n5ttBJw5CyRSejMKdu/52XgHZzi3Nfdd+IxQMIL9b4Pit2Y\nNljkobCSaSKSKXZE1hd466v5bpifLNjoxQGiag4mFPOPFOvX3uqhvBPyQDLn\nyNCC70Kc4UHGVFA7gnBHgX4YcMyj2HG4FyrrRGtg3OepeOYnIoymKBjHpSzJ\nmLCjN4LO/zaSJC624//GfMzganoYehGNVbz5H080iRa4lashXgEQexQBjdt4\n5Ef0H4FbKbKVyXCBt5gPkdHwhGIVb1iaXysghXQFCkSkCWtjhreVh0VhQ/+D\nOSnoMxeJDLKN5YMpa7GkvNOdxOlkNAKX4ZSA509Bwkx4Y8fKewRjLRNwjsGm\n6vXNVay6B48uhCJvupE0SCXr1+Xe/7aFSrrem80daFyMKAbgGaZ2YBcVjIUJ\na5dfD2Q6bm5L4Zpm0r5qsDgAaqQ93kUZnDRYTe/thkJuJYPO7JiL+OknPk/e\nkgCFHZH/cqeK3YSP0eor+u3UyvhTqG/Jsp261YEtBe1go2gbW6zY/TQrzbrH\n3EKE\r\n=JEtU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHlt9hYbHxGW7zloRi9Qq0+GXUbc70zfkBA1JDaXzzryAiEA7VoBzXgYGN4f5jYZPmlarzfWIuqRoF0Kn9YzC4aGzNE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# p-limit\n\n> Run multiple promise-returning & async functions with limited concurrency\n\n## Install\n\n```\n$ npm install p-limit\n```\n\n## Usage\n\n```js\nimport pLimit from 'p-limit';\n\nconst limit = pLimit(1);\n\nconst input = [\n\tlimit(() => fetchSomething('foo')),\n\tlimit(() => fetchSomething('bar')),\n\tlimit(() => doSomething())\n];\n\n// Only one promise is run at once\nconst result = await Promise.all(input);\nconsole.log(result);\n```\n\n## API\n\n### pLimit(concurrency)\n\nReturns a `limit` function.\n\n#### concurrency\n\nType: `number`\\\nMinimum: `1`\\\nDefault: `Infinity`\n\nConcurrency limit.\n\n### limit(fn, ...args)\n\nReturns the promise returned by calling `fn(...args)`.\n\n#### fn\n\nType: `Function`\n\nPromise-returning/async function.\n\n#### args\n\nAny arguments to pass through to `fn`.\n\nSupport for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a *lot* of functions.\n\n### limit.activeCount\n\nThe number of promises that are currently running.\n\n### limit.pendingCount\n\nThe number of promises that are waiting to run (i.e. their internal `fn` was not called yet).\n\n### limit.clearQueue()\n\nDiscard pending promises that are waiting to run.\n\nThis might be useful if you want to teardown the queue at the end of your program's lifecycle or discard any function calls referencing an intermediary state of your app.\n\nNote: This does not cancel promises that are already running.\n\n## FAQ\n\n### How is this different from the [`p-queue`](https://github.com/sindresorhus/p-queue) package?\n\nThis package is only about limiting the number of concurrent executions, while `p-queue` is a fully featured queue implementation with lots of different options, introspection, and ability to pause the queue.\n\n## Related\n\n- [p-queue](https://github.com/sindresorhus/p-queue) - Promise queue with concurrency control\n- [p-throttle](https://github.com/sindresorhus/p-throttle) - Throttle promise-returning & async functions\n- [p-debounce](https://github.com/sindresorhus/p-debounce) - Debounce promise-returning & async functions\n- [p-all](https://github.com/sindresorhus/p-all) - Run promise-returning & async functions concurrently with optional limited concurrency\n- [More…](https://github.com/sindresorhus/promise-fun)\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-p-limit?utm_source=npm-p-limit&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/p-limit#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-limit.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/p-limit/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "p-limit",
+ "description": "Run multiple promise-returning & async functions with limited concurrency",
+ "dist-tags": {
+ "latest": "2.3.0"
+ },
+ "versions": {
+ "2.3.0": {
+ "name": "p-limit",
+ "version": "2.3.0",
+ "description": "Run multiple promise-returning & async functions with limited concurrency",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-limit.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd-check"
+ },
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "devDependencies": {
+ "ava": "^1.2.1",
+ "delay": "^4.1.0",
+ "in-range": "^1.0.0",
+ "random-int": "^1.0.0",
+ "time-span": "^2.0.0",
+ "tsd-check": "^0.3.0",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "a11f02bc5c04490b7c3de2663d866c211fb915ea",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-limit/issues"
+ },
+ "_id": "p-limit@2.3.0",
+ "_nodeVersion": "10.19.0",
+ "_npmVersion": "6.13.4",
+ "dist": {
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "shasum": "3dd33c647a214fdfffd835933eb086da0dc21db1",
+ "tarball": "http://localhost:4260/p-limit/p-limit-2.3.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 7390
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/p-limit#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-limit.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-limit/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/p-locate/registry.json b/tests/registry/npm/p-locate/registry.json
index 6753ac385..19418e74f 100644
--- a/tests/registry/npm/p-locate/registry.json
+++ b/tests/registry/npm/p-locate/registry.json
@@ -1 +1,72 @@
-{"name":"p-locate","description":"Get the first fulfilled promise that satisfies the provided testing function","dist-tags":{"latest":"4.1.0"},"versions":{"4.1.0":{"name":"p-locate","version":"4.1.0","description":"Get the first fulfilled promise that satisfies the provided testing function","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-locate.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"p-limit":"^2.2.0"},"devDependencies":{"ava":"^1.4.1","delay":"^4.1.0","in-range":"^1.0.0","time-span":"^3.0.0","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"a650b26e49713a8cca58f669a7f8aef9b655554c","bugs":{"url":"https://github.com/sindresorhus/p-locate/issues"},"_id":"p-locate@4.1.0","_nodeVersion":"8.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==","shasum":"a3428bb7088b3a60292f66919278b7c297ad4f07","tarball":"http://localhost:4260/p-locate/p-locate-4.1.0.tgz","fileCount":5,"unpackedSize":7285,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpY/2CRA9TVsSAnZWagAALQMP/3vN0BSJiCM4ZVUWhqjQ\nL3PQu0gcZuncKRGoX4Vpm7nhfubo13PwinE5dDOrueBPoCrdYJQk/uuYBJQS\nugePB/oxbLwK1vL0ZanyaJTRYWrdNJsZmciYRkQ09Pci/oyZ39c6sjtkGj7v\nU8dLhR47iNBHf5RhOlxlEGEaxAHIn7xumDwRnK+xDOZCVJp4HmHcT0XK8J08\ncuraQ3ZDCGDFSJUzoL9XGUhFWlxwLfLsHwcjfBfD7kGdLBchlgrgN1uVIa0m\n8ta73mV2JtzYxrRE2WmDyDqfVdNAE0pSoUrTRrGKVrI60TguIv5c+AhEVR+R\nVYl8gnq0FbesgxhYRHz8h64HfArEBkzrOdDFNARBwZh0HYIxLIEO1gzyBKj4\nfGiyMVXKeAiGrxUWfD47Bra9fCQlxjO2IkA7c4PqWj9Al8C6Q2DfGp6e73JP\n3bXxOTNMQVxAjI/Xej7XEHaAB500KvEmrXv4Mz+wyIT3c8pdpwv8MJtw1PLf\naP1iItAWF2FZl5pyxcX9PRGLkIRz452ncq30ZLRbPohdg8+Lcqrq6zeqAucH\nkmY37n1qWmvT9btNTcHz/TsO658ty+3aiZeXh6Aw9V7SvKfxECVWs2t6rtaU\nojg73RJjxBFDr8eju0DuRXJv2EdFoHe/IgymO+eFXk9K7sw3B1RjMzlwt4Ag\nQLSM\r\n=XPFA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBDHNeeA91skg5DOjOvw5L1TFNYs/8fttpOaXZHLIcyAiEAm8ra3BQ3mwFdFY1sQHqolxuwScU+6MUIzm5fO2ub/e8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# p-locate\n\n> Get the first fulfilled promise that satisfies the provided testing function\n\nThink of it like an async version of [`Array#find`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find).\n\n## Install\n\n```\n$ npm install p-locate\n```\n\n## Usage\n\nHere we find the first file that exists on disk, in array order.\n\n```js\nimport {pathExists} from 'path-exists';\nimport pLocate from 'p-locate';\n\nconst files = [\n\t'unicorn.png',\n\t'rainbow.png', // Only this one actually exists on disk\n\t'pony.png'\n];\n\nconst foundPath = await pLocate(files, file => pathExists(file));\n\nconsole.log(foundPath);\n//=> 'rainbow'\n```\n\n*The above is just an example. Use [`locate-path`](https://github.com/sindresorhus/locate-path) if you need this.*\n\n## API\n\n### pLocate(input, tester, options?)\n\nReturns a `Promise` that is fulfilled when `tester` resolves to `true` or the iterable is done, or rejects if any of the promises reject. The fulfilled value is the current iterable value or `undefined` if `tester` never resolved to `true`.\n\n#### input\n\nType: `Iterable<Promise | unknown>`\n\nAn iterable of promises/values to test.\n\n#### tester(element)\n\nType: `Function`\n\nThis function will receive resolved values from `input` and is expected to return a `Promise<boolean>` or `boolean`.\n\n#### options\n\nType: `object`\n\n##### concurrency\n\nType: `number`\\\nDefault: `Infinity`\\\nMinimum: `1`\n\nThe number of concurrently pending promises returned by `tester`.\n\n##### preserveOrder\n\nType: `boolean`\\\nDefault: `true`\n\nPreserve `input` order when searching.\n\nDisable this to improve performance if you don't care about the order.\n\n## Related\n\n- [p-map](https://github.com/sindresorhus/p-map) - Map over promises concurrently\n- [p-filter](https://github.com/sindresorhus/p-filter) - Filter promises concurrently\n- [p-any](https://github.com/sindresorhus/p-any) - Wait for any promise to be fulfilled\n- [More…](https://github.com/sindresorhus/promise-fun)\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-p-locate?utm_source=npm-p-locate&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/p-locate#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-locate.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/p-locate/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "p-locate",
+ "description": "Get the first fulfilled promise that satisfies the provided testing function",
+ "dist-tags": {
+ "latest": "4.1.0"
+ },
+ "versions": {
+ "4.1.0": {
+ "name": "p-locate",
+ "version": "4.1.0",
+ "description": "Get the first fulfilled promise that satisfies the provided testing function",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-locate.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "delay": "^4.1.0",
+ "in-range": "^1.0.0",
+ "time-span": "^3.0.0",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "a650b26e49713a8cca58f669a7f8aef9b655554c",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-locate/issues"
+ },
+ "_id": "p-locate@4.1.0",
+ "_nodeVersion": "8.15.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "shasum": "a3428bb7088b3a60292f66919278b7c297ad4f07",
+ "tarball": "http://localhost:4260/p-locate/p-locate-4.1.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 7285
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/p-locate#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-locate.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-locate/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/p-map/registry.json b/tests/registry/npm/p-map/registry.json
index c647252c1..33612950a 100644
--- a/tests/registry/npm/p-map/registry.json
+++ b/tests/registry/npm/p-map/registry.json
@@ -1 +1,74 @@
-{"name":"p-map","description":"Map over promises concurrently","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"p-map","version":"4.0.0","description":"Map over promises concurrently","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-map.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"engines":{"node":">=10"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"aggregate-error":"^3.0.0"},"devDependencies":{"ava":"^2.2.0","delay":"^4.1.0","in-range":"^2.0.0","random-int":"^2.0.0","time-span":"^3.1.0","tsd":"^0.7.4","xo":"^0.27.2"},"gitHead":"a4b4dec459544d98880bc53a580e53691aff9fa9","bugs":{"url":"https://github.com/sindresorhus/p-map/issues"},"_id":"p-map@4.0.0","_nodeVersion":"10.18.1","_npmVersion":"6.14.0","dist":{"integrity":"sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==","shasum":"bb2f95a5eda2ec168ec9274e06a747c3e2904d2b","tarball":"http://localhost:4260/p-map/p-map-4.0.0.tgz","fileCount":5,"unpackedSize":8687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeYLuGCRA9TVsSAnZWagAALNkP/icS/zHu6yNrCwiCNS4E\nnbsyyry8rc6iti+rBi4HJkNecN+gWM5J+OC8mmBa29jOWiefCtMlI2vjIPs5\n/UCBVEkHoZhhwriQ5X2Yz8yW5jimdE1QErzYKHhzGsNMFdc9VuPCVGtqartl\nQkrlJT+D0LOPBtOugmaLBt6XWX2Ks1NGYr/WtFwqfsE35kDGQvZ1MaAj9+Fc\naRK5LUoEn/06LPmVqPGjKjhoue3QgihCZSxoBWjMgwYblZyAkbiEM9Xe+Gjg\nB+MCAk2Eh6gZbqzyTmAythHyQgiz+lnNwXTGDXCKAD2rf8R11V7bOl6eFiml\nuMjmDHJ84VTwt9doONukyzxbGhJqCiwc6+38yT85DZCTQpmtUgcniRPygxqC\n5LQTx6DrQQ7nFUfwF+YfUd+q+GFyzGZNknW/+J9lKJazEFd2UCOaNHguRw0F\nPFcENv4j3bX2RfNkral0JZ2I+U8vu2NkpXWG3DmL1o38SgpQ7JC/wdXjSRcn\n4VlIhz5LcBms967YXTg1LAW7OQob73ksIXp2hGaGwiVfaZhPxWowZbCahfbA\nELrajj3H88QN4QDFxmp1CNrkgPkE4AyuBSgpnTiSP9wQTeBL4lZ+mfThBwtn\n4v694zqg4uF4u2vn7v5AkNBS2OlBvYNd59WjScPCOLWWZATQKqiHVVDErAGe\nFdI9\r\n=NTiQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7DQo5ZwXGnm1bMkOmN+5uiS7ZpVvO4j+NbQuzyssCjQIgNdV4S73hWNZCO72WffAW3PYDOVEzEam4A1J4dnk0iCM="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# p-map\n\n> Map over promises concurrently\n\nUseful when you need to run promise-returning & async functions multiple times with different inputs concurrently.\n\nThis is different from `Promise.all()` in that you can control the concurrency and also decide whether or not to stop iterating when there's an error.\n\n## Install\n\n```sh\nnpm install p-map\n```\n\n## Usage\n\n```js\nimport pMap from 'p-map';\nimport got from 'got';\n\nconst sites = [\n\tgetWebsiteFromUsername('sindresorhus'), //=> Promise\n\t'https://avajs.dev',\n\t'https://github.com'\n];\n\nconst mapper = async site => {\n\tconst {requestUrl} = await got.head(site);\n\treturn requestUrl;\n};\n\nconst result = await pMap(sites, mapper, {concurrency: 2});\n\nconsole.log(result);\n//=> ['https://sindresorhus.com/', 'https://avajs.dev/', 'https://github.com/']\n```\n\n## API\n\n### pMap(input, mapper, options?)\n\nReturns a `Promise` that is fulfilled when all promises in `input` and ones returned from `mapper` are fulfilled, or rejects if any of the promises reject. The fulfilled value is an `Array` of the fulfilled values returned from `mapper` in `input` order.\n\n### pMapIterable(input, mapper, options?)\n\nReturns an async iterable that streams each return value from `mapper` in order.\n\n```js\nimport {pMapIterable} from 'p-map';\n\n// Multiple posts are fetched concurrently, with limited concurrency and backpressure\nfor await (const post of pMapIterable(postIds, getPostMetadata, {concurrency: 8})) {\n\tconsole.log(post);\n};\n```\n\n#### input\n\nType: `AsyncIterable<Promise<unknown> | unknown> | Iterable<Promise<unknown> | unknown>`\n\nSynchronous or asynchronous iterable that is iterated over concurrently, calling the `mapper` function for each element. Each iterated item is `await`'d before the `mapper` is invoked so the iterable may return a `Promise` that resolves to an item.\n\nAsynchronous iterables (different from synchronous iterables that return `Promise` that resolves to an item) can be used when the next item may not be ready without waiting for an asynchronous process to complete and/or the end of the iterable may be reached after the asynchronous process completes. For example, reading from a remote queue when the queue has reached empty, or reading lines from a stream.\n\n#### mapper(element, index)\n\nType: `Function`\n\nExpected to return a `Promise` or value.\n\n#### options\n\nType: `object`\n\n##### concurrency\n\nType: `number` *(Integer)*\\\nDefault: `Infinity`\\\nMinimum: `1`\n\nNumber of concurrently pending promises returned by `mapper`.\n\n##### backpressure\n\n**Only for `pMapIterable`**\n\nType: `number` *(Integer)*\\\nDefault: `options.concurrency`\\\nMinimum: `options.concurrency`\n\nMaximum number of promises returned by `mapper` that have resolved but not yet collected by the consumer of the async iterable. Calls to `mapper` will be limited so that there is never too much backpressure.\n\nUseful whenever you are consuming the iterable slower than what the mapper function can produce concurrently. For example, to avoid making an overwhelming number of HTTP requests if you are saving each of the results to a database.\n\n##### stopOnError\n\n**Only for `pMap`**\n\nType: `boolean`\\\nDefault: `true`\n\nWhen `true`, the first mapper rejection will be rejected back to the consumer.\n\nWhen `false`, instead of stopping when a promise rejects, it will wait for all the promises to settle and then reject with an [`AggregateError`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError) containing all the errors from the rejected promises.\n\nCaveat: When `true`, any already-started async mappers will continue to run until they resolve or reject. In the case of infinite concurrency with sync iterables, *all* mappers are invoked on startup and will continue after the first rejection. [Issue #51](https://github.com/sindresorhus/p-map/issues/51) can be implemented for abort control.\n\n##### signal\n\n**Only for `pMap`**\n\nType: [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal)\n\nYou can abort the promises using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n\n```js\nimport pMap from 'p-map';\nimport delay from 'delay';\n\nconst abortController = new AbortController();\n\nsetTimeout(() => {\n\tabortController.abort();\n}, 500);\n\nconst mapper = async value => value;\n\nawait pMap([delay(1000), delay(1000)], mapper, {signal: abortController.signal});\n// Throws AbortError (DOMException) after 500 ms.\n```\n\n### pMapSkip\n\nReturn this value from a `mapper` function to skip including the value in the returned array.\n\n```js\nimport pMap, {pMapSkip} from 'p-map';\nimport got from 'got';\n\nconst sites = [\n\tgetWebsiteFromUsername('sindresorhus'), //=> Promise\n\t'https://avajs.dev',\n\t'https://example.invalid',\n\t'https://github.com'\n];\n\nconst mapper = async site => {\n\ttry {\n\t\tconst {requestUrl} = await got.head(site);\n\t\treturn requestUrl;\n\t} catch {\n\t\treturn pMapSkip;\n\t}\n};\n\nconst result = await pMap(sites, mapper, {concurrency: 2});\n\nconsole.log(result);\n//=> ['https://sindresorhus.com/', 'https://avajs.dev/', 'https://github.com/']\n```\n\n## Related\n\n- [p-all](https://github.com/sindresorhus/p-all) - Run promise-returning & async functions concurrently with optional limited concurrency\n- [p-filter](https://github.com/sindresorhus/p-filter) - Filter promises concurrently\n- [p-times](https://github.com/sindresorhus/p-times) - Run promise-returning & async functions a specific number of times concurrently\n- [p-props](https://github.com/sindresorhus/p-props) - Like `Promise.all()` but for `Map` and `Object`\n- [p-map-series](https://github.com/sindresorhus/p-map-series) - Map over promises serially\n- [More…](https://github.com/sindresorhus/promise-fun)\n","homepage":"https://github.com/sindresorhus/p-map#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-map.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/p-map/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "p-map",
+ "description": "Map over promises concurrently",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "p-map",
+ "version": "4.0.0",
+ "description": "Map over promises concurrently",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-map.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.2.0",
+ "delay": "^4.1.0",
+ "in-range": "^2.0.0",
+ "random-int": "^2.0.0",
+ "time-span": "^3.1.0",
+ "tsd": "^0.7.4",
+ "xo": "^0.27.2"
+ },
+ "gitHead": "a4b4dec459544d98880bc53a580e53691aff9fa9",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-map/issues"
+ },
+ "_id": "p-map@4.0.0",
+ "_nodeVersion": "10.18.1",
+ "_npmVersion": "6.14.0",
+ "dist": {
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "shasum": "bb2f95a5eda2ec168ec9274e06a747c3e2904d2b",
+ "tarball": "http://localhost:4260/p-map/p-map-4.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 8687
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/p-map#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-map.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-map/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/p-try/registry.json b/tests/registry/npm/p-try/registry.json
index 521a60eca..34a113ec1 100644
--- a/tests/registry/npm/p-try/registry.json
+++ b/tests/registry/npm/p-try/registry.json
@@ -1 +1,66 @@
-{"name":"p-try","description":"`Start a promise chain","dist-tags":{"latest":"2.2.0"},"versions":{"2.2.0":{"name":"p-try","version":"2.2.0","description":"`Start a promise chain","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-try.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.1","xo":"^0.24.0"},"gitHead":"e80e2e130b2d16807345be02aa03541e6e085952","bugs":{"url":"https://github.com/sindresorhus/p-try/issues"},"_id":"p-try@2.2.0","_nodeVersion":"8.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==","shasum":"cb2868540e313d61de58fafbe35ce9004d5540e6","tarball":"http://localhost:4260/p-try/p-try-2.2.0.tgz","fileCount":5,"unpackedSize":4371,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoLPbCRA9TVsSAnZWagAALrsP/ie/GNjXnqYiGeGV/bKQ\nudud/fo7L0Brvq7zY+bNfSDNeyIDc5fosGrrCvaCA7JpK+KYnN+ww6lTy2pa\nY3njArVn6eeqfw2ZnheHrJOduMvftXw3+9EJ2Y0ulJ+OfDxvFI5n3HsE4bia\n4M/hMfvo4ScI4MmDnkcGA0rZEEPnfHg8Ud9u5tJOyIsftV08oY4Czg+cGyOV\nWuLge0A7+BHXhmVz44NR7edufsq2hbbmSsvl14SMyWYEjKV2r9Q3fEwL5XHP\narq39bqA9X+DnD0a12oWtYeT+v3r5ewg4h7H7QtA9Bvxdns/usJw/6KHy1za\nh8haNrRmBn1ze0sF/kNSKeStFcIsH8fp4Iiu4w8mniipVcuSt5tK5mvh3KOv\n0p8rBWzxGEqcxXxsxmI1rLEKGMy0ZthgvLOtRsnYl8a/DG1cxE9ZN5c2oaWA\ngUSDavh3tnwpl8PTag013nAmYSDYTNhA2TmHbWbfTzSCFvAjhivKfbIrcyF6\n1iQX4AckEZgtSTvbzbggC87gQS4xMfM82pi2rmkJuv3i6Iu2RkbDeFrQWphl\nL0FftZLanQQ39WeOiHZK1zNiBLaOxXWH/VWQKLG9CwgYSqFNGDbZIQuq2HkI\n/lJ6uIP2LZs+dMpDlw37K4BUOIS7wxJvOGfbwZmyYHN6gA2AeCA2wYZh4zVc\npEVP\r\n=gHtm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFqJShDf2xjNgk1aoDGnPwZwG+G7HV52faNfi6pOpE0GAiBBrH0yhwIdb+P7KpY/+oabo0DWJVmv0pL/crggmNyfzQ=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# p-try\n\n> Start a promise chain\n\n[How is it useful?](http://cryto.net/~joepie91/blog/2016/05/11/what-is-promise-try-and-why-does-it-matter/)\n\n## Install\n\n```sh\nnpm install p-try\n```\n\n## Usage\n\n```js\nimport pTry from 'p-try';\n\ntry {\n\tconst value = await pTry(() => {\n\t\treturn synchronousFunctionThatMightThrow();\n\t});\n\tconsole.log(value);\n} catch (error) {\n\tconsole.error(error);\n}\n```\n\n## API\n\n### pTry(fn, ...arguments)\n\nReturns a `Promise` resolved with the value of calling `fn(...arguments)`. If the function throws an error, the returned `Promise` will be rejected with that error.\n\nSupport for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a *lot* of functions.\n\n#### fn\n\nThe function to run to start the promise chain.\n\n#### arguments\n\nArguments to pass to `fn`.\n\n## Related\n\n- [More…](https://github.com/sindresorhus/promise-fun)\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-p-try?utm_source=npm-p-try&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/p-try#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/p-try.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/p-try/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "p-try",
+ "description": "`Start a promise chain",
+ "dist-tags": {
+ "latest": "2.2.0"
+ },
+ "versions": {
+ "2.2.0": {
+ "name": "p-try",
+ "version": "2.2.0",
+ "description": "`Start a promise chain",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-try.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.1",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "e80e2e130b2d16807345be02aa03541e6e085952",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-try/issues"
+ },
+ "_id": "p-try@2.2.0",
+ "_nodeVersion": "8.15.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "shasum": "cb2868540e313d61de58fafbe35ce9004d5540e6",
+ "tarball": "http://localhost:4260/p-try/p-try-2.2.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4371
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/p-try#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/p-try.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/p-try/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/package-json-from-dist/registry.json b/tests/registry/npm/package-json-from-dist/registry.json
index 2bc4c9d0a..99c92d5c8 100644
--- a/tests/registry/npm/package-json-from-dist/registry.json
+++ b/tests/registry/npm/package-json-from-dist/registry.json
@@ -1 +1,109 @@
-{"name":"package-json-from-dist","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"package-json-from-dist","version":"1.0.0","description":"Load the local package.json from either src or dist folder","main":"./dist/commonjs/index.js","exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}}},"scripts":{"preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","prepare":"tshy","pretest":"npm run prepare","presnap":"npm run prepare","test":"tap","snap":"tap","format":"prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache","typedoc":"typedoc"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"license":"BlueOak-1.0.0","repository":{"type":"git","url":"git+https://github.com/isaacs/package-json-from-dist.git"},"devDependencies":{"@types/node":"^20.12.12","prettier":"^3.2.5","tap":"^18.5.3","typedoc":"^0.24.8","typescript":"^5.1.6","tshy":"^1.14.0"},"prettier":{"semi":false,"printWidth":70,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf","experimentalTernaries":true},"tshy":{"exports":{"./package.json":"./package.json",".":"./src/index.ts"}},"types":"./dist/commonjs/index.d.ts","type":"module","_id":"package-json-from-dist@1.0.0","gitHead":"b5d50a5510b66886238de2a0d508987da17bb7d8","bugs":{"url":"https://github.com/isaacs/package-json-from-dist/issues"},"_nodeVersion":"20.11.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==","shasum":"e501cd3094b278495eb4258d4c9f6d5ac3019f00","tarball":"http://localhost:4260/package-json-from-dist/package-json-from-dist-1.0.0.tgz","fileCount":13,"unpackedSize":33940,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBk1UxJB1c1W5JqTwhuKr1Dnao3WgyeqtoSK5jKUvZyTAiEA8nD3BvBEUOi8z1O5qVay68RDTcOeH1op6kTxNdKi7CI="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Load the local package.json from either src or dist folder","homepage":"https://github.com/isaacs/package-json-from-dist#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/package-json-from-dist.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://izs.me"},"bugs":{"url":"https://github.com/isaacs/package-json-from-dist/issues"},"license":"BlueOak-1.0.0","readme":"# package-json-from-dist\n\nSometimes you want to load the `package.json` into your\nTypeScript program, and it's tempting to just `import\n'../package.json'`, since that seems to work.\n\nHowever, this requires `tsc` to make an entire copy of your\n`package.json` file into the `dist` folder, which is a problem if\nyou're using something like\n[tshy](https://github.com/isaacs/tshy), which uses the\n`package.json` file in dist for another purpose. Even when that\ndoes work, it's asking the module system to do a bunch of extra\nfs system calls, just to load a version number or something. (See\n[this issue](https://github.com/isaacs/tshy/issues/61).)\n\nThis module helps by just finding the package.json file\nappropriately, and reading and parsing it in the most normal\nfashion.\n\n## Caveats\n\nThis *only* works if your code builds into a target folder called\n`dist`, which is in the root of the package. It also requires\nthat you do not have a folder named `node_modules` anywhere\nwithin your dev environment, or else it'll get the wrong answers\nthere. (But, at least, that'll be in dev, so you're pretty likely\nto notice.)\n\nIf you build to some other location, then you'll need a different\napproach. (Feel free to fork this module and make it your own, or\njust put the code right inline, there's not much of it.)\n\n## USAGE\n\n```js\n// src/index.ts\nimport { findPackageJson, loadPackageJson } from 'package-json-from-dist'\n\nconst pj = findPackageJson(import.meta.url)\nconsole.log(`package.json found at ${pj}`)\n\nconst pkg = loadPackageJson(import.meta.url)\nconsole.log(`Hello from ${pkg.name}@${pkg.version}`)\n```\n\nIf your module is not directly in the `./src` folder, then you need\nto specify the path that you would expect to find the\n`package.json` when it's _not_ built to the `dist` folder.\n\n```js\n// src/components/something.ts\nimport { findPackageJson, loadPackageJson } from 'package-json-from-dist'\n\nconst pj = findPackageJson(import.meta.url, '../../package.json')\nconsole.log(`package.json found at ${pj}`)\n\nconst pkg = loadPackageJson(import.meta.url, '../../package.json')\nconsole.log(`Hello from ${pkg.name}@${pkg.version}`)\n```\n\nWhen running from CommmonJS, use `__filename` instead of\n`import.meta.url`.\n\n```js\n// src/index.cts\nimport { findPackageJson, loadPackageJson } from 'package-json-from-dist'\n\nconst pj = findPackageJson(__filename)\nconsole.log(`package.json found at ${pj}`)\n\nconst pkg = loadPackageJson(__filename)\nconsole.log(`Hello from ${pkg.name}@${pkg.version}`)\n```\n\nSince [tshy](https://github.com/isaacs/tshy) builds _both_\nCommonJS and ESM by default, you may find that you need a\nCommonJS override and some `//@ts-ignore` magic to make it work.\n\n`src/pkg.ts`:\n\n```js\nimport { findPackageJson, loadPackageJson } from 'package-json-from-dist'\n//@ts-ignore\nexport const pkg = loadPackageJson(import.meta.url)\n//@ts-ignore\nexport const pj = findPackageJson(import.meta.url)\n```\n\n`src/pkg-cjs.cts`:\n\n```js\nimport { findPackageJson, loadPackageJson } from 'package-json-from-dist'\nexport const pkg = loadPackageJson(__filename)\nexport const pj = findPackageJson(__filename)\n```\n","readmeFilename":"README.md"}
+{
+ "name": "package-json-from-dist",
+ "dist-tags": {
+ "latest": "1.0.0"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "package-json-from-dist",
+ "version": "1.0.0",
+ "description": "Load the local package.json from either src or dist folder",
+ "main": "./dist/commonjs/index.js",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache",
+ "typedoc": "typedoc"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "BlueOak-1.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/package-json-from-dist.git"
+ },
+ "devDependencies": {
+ "@types/node": "^20.12.12",
+ "prettier": "^3.2.5",
+ "tap": "^18.5.3",
+ "typedoc": "^0.24.8",
+ "typescript": "^5.1.6",
+ "tshy": "^1.14.0"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 70,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf",
+ "experimentalTernaries": true
+ },
+ "tshy": {
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "types": "./dist/commonjs/index.d.ts",
+ "type": "module",
+ "_id": "package-json-from-dist@1.0.0",
+ "gitHead": "b5d50a5510b66886238de2a0d508987da17bb7d8",
+ "bugs": {
+ "url": "https://github.com/isaacs/package-json-from-dist/issues"
+ },
+ "_nodeVersion": "20.11.0",
+ "_npmVersion": "10.7.0",
+ "dist": {
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "shasum": "e501cd3094b278495eb4258d4c9f6d5ac3019f00",
+ "tarball": "http://localhost:4260/package-json-from-dist/package-json-from-dist-1.0.0.tgz",
+ "fileCount": 13,
+ "unpackedSize": 33940
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Load the local package.json from either src or dist folder",
+ "homepage": "https://github.com/isaacs/package-json-from-dist#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/package-json-from-dist.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/package-json-from-dist/issues"
+ },
+ "license": "BlueOak-1.0.0",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/path-exists/registry.json b/tests/registry/npm/path-exists/registry.json
index abc82c171..14e20d049 100644
--- a/tests/registry/npm/path-exists/registry.json
+++ b/tests/registry/npm/path-exists/registry.json
@@ -1 +1,66 @@
-{"name":"path-exists","description":"Check if a path exists","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"path-exists","version":"4.0.0","description":"Check if a path exists","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/path-exists.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"26b1adf80aa6761a7db35927a20cf59e0fd1a00d","bugs":{"url":"https://github.com/sindresorhus/path-exists/issues"},"_id":"path-exists@4.0.0","_nodeVersion":"8.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==","shasum":"513bdbe2d3b95d7762e8c1137efa195c6c61b5b3","tarball":"http://localhost:4260/path-exists/path-exists-4.0.0.tgz","fileCount":5,"unpackedSize":3919,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpXoNCRA9TVsSAnZWagAAnosQAI8XSu8kmOriX6qXOsXw\nVCUJHDFHO4M5dLJdrT1o5o0SDkTQUmOSazUR/CvaA/4pE7rtPjOL58CrHqSI\nKfEF3lTitx+L3kEw3br6bPMVTo+JoSH04L+UXq7YdkfwRigrNmZpjMiIychR\ngxcgTzBfsFBYzRRUia8OUAFkIK9kvzpRorfFSMfzGGB9V+vjbMd2V+OM0N+G\nAc48nmGUsrQKknAiJpkixM5PWMd/51kV5SzO13RLCnwNOYnH/vNij/9oseSt\njO2nkixc7PDMZTD/2kOQoRQpYoKju/gUnFXCynw1A4EHxetv6QB4nbIVLt8t\nyGhu+hrhNlTgP4MBuSddj4iqJ2EY6VpVZzUNNSzI7SzF62AWTZRHoNLG80yM\naSDKS9Vu+9lkT+YOTA1dXFMol2a29Lzo6Q1PAj2vHd++SZ5A0QO5iRVQkocu\ncecYKaeP2XCa6iWaPwAfEN2rJRdnKN3LrKKr1Cbttjd9WI3Kr152uNXYLjw3\nQ4KpUo4B9rNSTArMk7AIJ1/71uDxvCB+T0OYkj+uHTEKAB/wllpUcJXE2V4Q\nnRig/oWco1+oo1qBY0b2OgiiUcTEfuYUDEyecojVV+nmDDzC/GmcO/93hFnL\nEFxqhB1yaFHuaK4+ntJRpFg+fry09I8mu145WqhggK3le4DUTyyrESAjcBOs\n6s47\r\n=Jirh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyfLbncajlWbMDIPi5XGJseXcr9CBh1zovKHHQXBhJGQIgQ9BTBfVebUAF7DtKGmDzoJ0PTS1AWbuzQtjQKkFSdu8="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# path-exists\n\n> Check if a path exists\n\nNOTE: `fs.existsSync` has been un-deprecated in Node.js since 6.8.0. If you only need to check synchronously, this module is not needed.\n\nNever use this before handling a file though:\n\n> In particular, checking if a file exists before opening it is an anti-pattern that leaves you vulnerable to race conditions: another process may remove the file between the calls to `fs.exists()` and `fs.open()`. Just open the file and handle the error when it's not there.\n\n## Install\n\n```\n$ npm install path-exists\n```\n\n## Usage\n\n```js\n// foo.js\nimport {pathExists} from 'path-exists';\n\nconsole.log(await pathExists('foo.js'));\n//=> true\n```\n\n## API\n\n### pathExists(path)\n\nReturns a `Promise<boolean>` of whether the path exists.\n\n### pathExistsSync(path)\n\nReturns a `boolean` of whether the path exists.\n\n## Related\n\n- [path-exists-cli](https://github.com/sindresorhus/path-exists-cli) - CLI for this module\n- [path-type](https://github.com/sindresorhus/path-type) - Check if a path exists and whether it's a file, directory, or symlink\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-path-exists?utm_source=npm-path-exists&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/path-exists#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/path-exists.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/path-exists/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "path-exists",
+ "description": "Check if a path exists",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "path-exists",
+ "version": "4.0.0",
+ "description": "Check if a path exists",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/path-exists.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "26b1adf80aa6761a7db35927a20cf59e0fd1a00d",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/path-exists/issues"
+ },
+ "_id": "path-exists@4.0.0",
+ "_nodeVersion": "8.15.0",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "shasum": "513bdbe2d3b95d7762e8c1137efa195c6c61b5b3",
+ "tarball": "http://localhost:4260/path-exists/path-exists-4.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 3919
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/path-exists#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/path-exists.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/path-exists/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/path-key/registry.json b/tests/registry/npm/path-key/registry.json
index 8acc770bb..bd6185af7 100644
--- a/tests/registry/npm/path-key/registry.json
+++ b/tests/registry/npm/path-key/registry.json
@@ -1 +1,67 @@
-{"name":"path-key","description":"Get the PATH environment variable key cross-platform","dist-tags":{"latest":"3.1.1"},"versions":{"3.1.1":{"name":"path-key","version":"3.1.1","description":"Get the PATH environment variable key cross-platform","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/path-key.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"@types/node":"^11.13.0","ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"caea269db3a5eb0c09c793f4be5435312971d2fa","bugs":{"url":"https://github.com/sindresorhus/path-key/issues"},"_id":"path-key@3.1.1","_nodeVersion":"10.17.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==","shasum":"581f6ade658cbba65a0d3380de7753295054f375","tarball":"http://localhost:4260/path-key/path-key-3.1.1.tgz","fileCount":5,"unpackedSize":4553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2BEWCRA9TVsSAnZWagAAYX0P/Rz/b6MNfPe+VoHlRz8Q\nJQlrCaHeSa+2Hj4XhEt+DWDfpDMXX5OcgAOiz6JzF4Hnsx+VGpQZsYkp7F3q\noQjcL0pQ2sA25U14C5mP06VMKGMmsDnXMX/iIc7VYyC6/JUGdtxAOs42pAJG\n9fs8fha47T2gFWsAziytzdTODop1UCtbfDTsOrO81KUzMfhmLAxVaIBHztaD\nOgdxOeINVMrqyCplRnOYHXjjd10CbqVWBmqtyIAMJj84cHitF/03ZHhpvt1P\ngzpTkH60nVm3gaMnMz+akGLapyy2I72MjZcuRx3Tkw8Qqwm7lGygoE/UCtfR\noo5MtUSgnPPLZf/BHuRGwd2L8rCxqnaLYO6su05/1WC4MmGacRni2czBybTp\niTUh30Lzhwna47u+VfWTv77kPlV3IqcSSMnKVCwF4Ea4Z+diQ8K0BCzp/N7U\nXxpN1nh1jqR8kMcQr9ybgTsQ5Xv/x/KNvMNpGnBu/VfAuy0q7XG4k0efI4NJ\nGXtl3LzeTgw94KtVeaC5V/+iBijPvO2TGCoOoONaSkGPP8UlLaabCr62O76h\nxe15coJ04Yz8cPTzyOOMkoUJrtJmG6whwI/OqIxKaNKGUzL0u0YZDTepeJD2\nYw+LxPkIJwaw5ohi7nMFh6pR4Fva28KOQvbYUMM80/R1VZDvwMBqpQCJNlV0\nYPc9\r\n=1qcn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAwOqg8TUPAYc0BU4fVgYQw5sg3cZlPq2S90+ei63ZrEAiAsWC5WjxqdP1lbFmNySWF/BHy6UfJwkONg7eFU55uHwA=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# path-key\n\n> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform\n\nIt's usually `PATH` but on Windows it can be any casing like `Path`...\n\n## Install\n\n```\n$ npm install path-key\n```\n\n## Usage\n\n```js\nimport pathKey from 'path-key';\n\nconst key = pathKey();\n//=> 'PATH'\n\nconst PATH = process.env[key];\n//=> '/usr/local/bin:/usr/bin:/bin'\n```\n\n## API\n\n### pathKey(options?)\n\n#### options\n\nType: `object`\n\n##### env\n\nType: `object`\\\nDefault: [`process.env`](https://nodejs.org/api/process.html#process_process_env)\n\nUse a custom environment variables object.\n\n#### platform\n\nType: `string`\\\nDefault: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform)\n\nGet the PATH key for a specific platform.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-path-key?utm_source=npm-path-key&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/path-key#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/path-key.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/path-key/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "path-key",
+ "description": "Get the PATH environment variable key cross-platform",
+ "dist-tags": {
+ "latest": "3.1.1"
+ },
+ "versions": {
+ "3.1.1": {
+ "name": "path-key",
+ "version": "3.1.1",
+ "description": "Get the PATH environment variable key cross-platform",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/path-key.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "@types/node": "^11.13.0",
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "caea269db3a5eb0c09c793f4be5435312971d2fa",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/path-key/issues"
+ },
+ "_id": "path-key@3.1.1",
+ "_nodeVersion": "10.17.0",
+ "_npmVersion": "6.11.3",
+ "dist": {
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "shasum": "581f6ade658cbba65a0d3380de7753295054f375",
+ "tarball": "http://localhost:4260/path-key/path-key-3.1.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4553
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/path-key#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/path-key.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/path-key/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/path-scurry/registry.json b/tests/registry/npm/path-scurry/registry.json
index 843833b1a..7eb572ea3 100644
--- a/tests/registry/npm/path-scurry/registry.json
+++ b/tests/registry/npm/path-scurry/registry.json
@@ -1 +1,130 @@
-{"name":"path-scurry","dist-tags":{"latest":"1.11.1"},"versions":{"1.11.1":{"name":"path-scurry","version":"1.11.1","author":{"url":"https://blog.izs.me","name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"BlueOak-1.0.0","_id":"path-scurry@1.11.1","bugs":{"url":"https://github.com/isaacs/path-scurry/issues"},"tap":{"typecheck":true},"dist":{"shasum":"7960a668888594a0720b12a911d1a742ab9f11d2","tarball":"http://localhost:4260/path-scurry/path-scurry-1.11.1.tgz","fileCount":13,"integrity":"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==","signatures":[{"sig":"MEYCIQDBjLbfo2sQti3sfRnzaiinq/kkXl1m+QvSVxxwW4e8xAIhAOU7wQ5HNxGrEROeHVnPM5T/4hhZllwlkzv1Aufgubk8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":535479},"main":"./dist/commonjs/index.js","tshy":{"exports":{".":"./src/index.ts","./package.json":"./package.json"},"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","engines":{"node":">=16 || 14 >=14.18"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/isaacs"},"gitHead":"766c9b06aacef86b43c9999cabc5eb824b5958d6","scripts":{"snap":"tap","test":"tap","bench":"bash ./scripts/bench.sh","format":"prettier --write . --loglevel warn","prepare":"tshy","presnap":"npm run prepare","pretest":"npm run prepare","typedoc":"typedoc --tsconfig tsconfig-esm.json ./src/*.ts","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags"},"prettier":{"semi":false,"useTabs":false,"tabWidth":2,"endOfLine":"lf","printWidth":75,"arrowParens":"avoid","singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"experimentalTernaries":true},"repository":{"url":"git+https://github.com/isaacs/path-scurry.git","type":"git"},"_npmVersion":"10.7.0","description":"walk paths fast and efficiently","directories":{},"_nodeVersion":"20.11.0","dependencies":{"minipass":"^5.0.0 || ^6.0.2 || ^7.0.0","lru-cache":"^10.2.0"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^7.12.0","tap":"^18.7.2","tshy":"^1.14.0","mkdirp":"^3.0.0","rimraf":"^5.0.1","ts-node":"^10.9.2","typedoc":"^0.25.12","prettier":"^3.2.5","typescript":"^5.4.3","@types/node":"^20.12.11","@nodelib/fs.walk":"^1.2.8","eslint-config-prettier":"^8.6.0"}}},"bugs":{"url":"https://github.com/isaacs/path-scurry/issues"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"https://blog.izs.me"},"license":"BlueOak-1.0.0","homepage":"https://github.com/isaacs/path-scurry#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/path-scurry.git"},"description":"walk paths fast and efficiently","readme":"# path-scurry\n\nExtremely high performant utility for building tools that read\nthe file system, minimizing filesystem and path string munging\noperations to the greatest degree possible.\n\n## Ugh, yet another file traversal thing on npm?\n\nYes. None of the existing ones gave me exactly what I wanted.\n\n## Well what is it you wanted?\n\nWhile working on [glob](http://npm.im/glob), I found that I\nneeded a module to very efficiently manage the traversal over a\nfolder tree, such that:\n\n1. No `readdir()` or `stat()` would ever be called on the same\n file or directory more than one time.\n2. No `readdir()` calls would be made if we can be reasonably\n sure that the path is not a directory. (Ie, a previous\n `readdir()` or `stat()` covered the path, and\n `ent.isDirectory()` is false.)\n3. `path.resolve()`, `dirname()`, `basename()`, and other\n string-parsing/munging operations are be minimized. This means\n it has to track \"provisional\" child nodes that may not exist\n (and if we find that they _don't_ exist, store that\n information as well, so we don't have to ever check again).\n4. The API is not limited to use as a stream/iterator/etc. There\n are many cases where an API like node's `fs` is preferrable.\n5. It's more important to prevent excess syscalls than to be up\n to date, but it should be smart enough to know what it\n _doesn't_ know, and go get it seamlessly when requested.\n6. Do not blow up the JS heap allocation if operating on a\n directory with a huge number of entries.\n7. Handle all the weird aspects of Windows paths, like UNC paths\n and drive letters and wrongway slashes, so that the consumer\n can return canonical platform-specific paths without having to\n parse or join or do any error-prone string munging.\n\n## PERFORMANCE\n\nJavaScript people throw around the word \"blazing\" a lot. I hope\nthat this module doesn't blaze anyone. But it does go very fast,\nin the cases it's optimized for, if used properly.\n\nPathScurry provides ample opportunities to get extremely good\nperformance, as well as several options to trade performance for\nconvenience.\n\nBenchmarks can be run by executing `npm run bench`.\n\nAs is always the case, doing more means going slower, doing less\nmeans going faster, and there are trade offs between speed and\nmemory usage.\n\nPathScurry makes heavy use of [LRUCache](http://npm.im/lru-cache)\nto efficiently cache whatever it can, and `Path` objects remain\nin the graph for the lifetime of the walker, so repeated calls\nwith a single PathScurry object will be extremely fast. However,\nadding items to a cold cache means \"doing more\", so in those\ncases, we pay a price. Nothing is free, but every effort has been\nmade to reduce costs wherever possible.\n\nAlso, note that a \"cache as long as possible\" approach means that\nchanges to the filesystem may not be reflected in the results of\nrepeated PathScurry operations.\n\nFor resolving string paths, `PathScurry` ranges from 5-50 times\nfaster than `path.resolve` on repeated resolutions, but around\n100 to 1000 times _slower_ on the first resolution. If your\nprogram is spending a lot of time resolving the _same_ paths\nrepeatedly (like, thousands or millions of times), then this can\nbe beneficial. But both implementations are pretty fast, and\nspeeding up an infrequent operation from 4µs to 400ns is not\ngoing to move the needle on your app's performance.\n\nFor walking file system directory trees, a lot depends on how\noften a given PathScurry object will be used, and also on the\nwalk method used.\n\nWith default settings on a folder tree of 100,000 items,\nconsisting of around a 10-to-1 ratio of normal files to\ndirectories, PathScurry performs comparably to\n[@nodelib/fs.walk](http://npm.im/@nodelib/fs.walk), which is the\nfastest and most reliable file system walker I could find. As far\nas I can tell, it's almost impossible to go much faster in a\nNode.js program, just based on how fast you can push syscalls out\nto the fs thread pool.\n\nOn my machine, that is about 1000-1200 completed walks per second\nfor async or stream walks, and around 500-600 walks per second\nsynchronously.\n\nIn the warm cache state, PathScurry's performance increases\naround 4x for async `for await` iteration, 10-15x faster for\nstreams and synchronous `for of` iteration, and anywhere from 30x\nto 80x faster for the rest.\n\n```\n# walk 100,000 fs entries, 10/1 file/dir ratio\n# operations / ms\n New PathScurry object | Reuse PathScurry object\n stream: 1112.589 | 13974.917\nsync stream: 492.718 | 15028.343\n async walk: 1095.648 | 32706.395\n sync walk: 527.632 | 46129.772\n async iter: 1288.821 | 5045.510\n sync iter: 498.496 | 17920.746\n```\n\nA hand-rolled walk calling `entry.readdir()` and recursing\nthrough the entries can benefit even more from caching, with\ngreater flexibility and without the overhead of streams or\ngenerators.\n\nThe cold cache state is still limited by the costs of file system\noperations, but with a warm cache, the only bottleneck is CPU\nspeed and VM optimizations. Of course, in that case, some care\nmust be taken to ensure that you don't lose performance as a\nresult of silly mistakes, like calling `readdir()` on entries\nthat you know are not directories.\n\n```\n# manual recursive iteration functions\n cold cache | warm cache\nasync: 1164.901 | 17923.320\n cb: 1101.127 | 40999.344\nzalgo: 1082.240 | 66689.936\n sync: 526.935 | 87097.591\n```\n\nIn this case, the speed improves by around 10-20x in the async\ncase, 40x in the case of using `entry.readdirCB` with protections\nagainst synchronous callbacks, and 50-100x with callback\ndeferrals disabled, and _several hundred times faster_ for\nsynchronous iteration.\n\nIf you can think of a case that is not covered in these\nbenchmarks, or an implementation that performs significantly\nbetter than PathScurry, please [let me\nknow](https://github.com/isaacs/path-scurry/issues).\n\n## USAGE\n\n```ts\n// hybrid module, load with either method\nimport { PathScurry, Path } from 'path-scurry'\n// or:\nconst { PathScurry, Path } = require('path-scurry')\n\n// very simple example, say we want to find and\n// delete all the .DS_Store files in a given path\n// note that the API is very similar to just a\n// naive walk with fs.readdir()\nimport { unlink } from 'fs/promises'\n\n// easy way, iterate over the directory and do the thing\nconst pw = new PathScurry(process.cwd())\nfor await (const entry of pw) {\n if (entry.isFile() && entry.name === '.DS_Store') {\n unlink(entry.fullpath())\n }\n}\n\n// here it is as a manual recursive method\nconst walk = async (entry: Path) => {\n const promises: Promise<any> = []\n // readdir doesn't throw on non-directories, it just doesn't\n // return any entries, to save stack trace costs.\n // Items are returned in arbitrary unsorted order\n for (const child of await pw.readdir(entry)) {\n // each child is a Path object\n if (child.name === '.DS_Store' && child.isFile()) {\n // could also do pw.resolve(entry, child.name),\n // just like fs.readdir walking, but .fullpath is\n // a *slightly* more efficient shorthand.\n promises.push(unlink(child.fullpath()))\n } else if (child.isDirectory()) {\n promises.push(walk(child))\n }\n }\n return Promise.all(promises)\n}\n\nwalk(pw.cwd).then(() => {\n console.log('all .DS_Store files removed')\n})\n\nconst pw2 = new PathScurry('/a/b/c') // pw2.cwd is the Path for /a/b/c\nconst relativeDir = pw2.cwd.resolve('../x') // Path entry for '/a/b/x'\nconst relative2 = pw2.cwd.resolve('/a/b/d/../x') // same path, same entry\nassert.equal(relativeDir, relative2)\n```\n\n## API\n\n[Full TypeDoc API](https://isaacs.github.io/path-scurry)\n\nThere are platform-specific classes exported, but for the most\npart, the default `PathScurry` and `Path` exports are what you\nmost likely need, unless you are testing behavior for other\nplatforms.\n\nIntended public API is documented here, but the full\ndocumentation does include internal types, which should not be\naccessed directly.\n\n### Interface `PathScurryOpts`\n\nThe type of the `options` argument passed to the `PathScurry`\nconstructor.\n\n- `nocase`: Boolean indicating that file names should be compared\n case-insensitively. Defaults to `true` on darwin and win32\n implementations, `false` elsewhere.\n\n **Warning** Performing case-insensitive matching on a\n case-sensitive filesystem will result in occasionally very\n bizarre behavior. Performing case-sensitive matching on a\n case-insensitive filesystem may negatively impact performance.\n\n- `childrenCacheSize`: Number of child entries to cache, in order\n to speed up `resolve()` and `readdir()` calls. Defaults to\n `16 * 1024` (ie, `16384`).\n\n Setting it to a higher value will run the risk of JS heap\n allocation errors on large directory trees. Setting it to `256`\n or smaller will significantly reduce the construction time and\n data consumption overhead, but with the downside of operations\n being slower on large directory trees. Setting it to `0` will\n mean that effectively no operations are cached, and this module\n will be roughly the same speed as `fs` for file system\n operations, and _much_ slower than `path.resolve()` for\n repeated path resolution.\n\n- `fs` An object that will be used to override the default `fs`\n methods. Any methods that are not overridden will use Node's\n built-in implementations.\n\n - lstatSync\n - readdir (callback `withFileTypes` Dirent variant, used for\n readdirCB and most walks)\n - readdirSync\n - readlinkSync\n - realpathSync\n - promises: Object containing the following async methods:\n - lstat\n - readdir (Dirent variant only)\n - readlink\n - realpath\n\n### Interface `WalkOptions`\n\nThe options object that may be passed to all walk methods.\n\n- `withFileTypes`: Boolean, default true. Indicates that `Path`\n objects should be returned. Set to `false` to get string paths\n instead.\n- `follow`: Boolean, default false. Attempt to read directory\n entries from symbolic links. Otherwise, only actual directories\n are traversed. Regardless of this setting, a given target path\n will only ever be walked once, meaning that a symbolic link to\n a previously traversed directory will never be followed.\n\n Setting this imposes a slight performance penalty, because\n `readlink` must be called on all symbolic links encountered, in\n order to avoid infinite cycles.\n\n- `filter`: Function `(entry: Path) => boolean`. If provided,\n will prevent the inclusion of any entry for which it returns a\n falsey value. This will not prevent directories from being\n traversed if they do not pass the filter, though it will\n prevent the directories themselves from being included in the\n results. By default, if no filter is provided, then all entries\n are included in the results.\n- `walkFilter`: Function `(entry: Path) => boolean`. If provided,\n will prevent the traversal of any directory (or in the case of\n `follow:true` symbolic links to directories) for which the\n function returns false. This will not prevent the directories\n themselves from being included in the result set. Use `filter`\n for that.\n\nNote that TypeScript return types will only be inferred properly\nfrom static analysis if the `withFileTypes` option is omitted, or\na constant `true` or `false` value.\n\n### Class `PathScurry`\n\nThe main interface. Defaults to an appropriate class based on the\ncurrent platform.\n\nUse `PathScurryWin32`, `PathScurryDarwin`, or `PathScurryPosix`\nif implementation-specific behavior is desired.\n\nAll walk methods may be called with a `WalkOptions` argument to\nwalk over the object's current working directory with the\nsupplied options.\n\n#### `async pw.walk(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nWalk the directory tree according to the options provided,\nresolving to an array of all entries found.\n\n#### `pw.walkSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nWalk the directory tree according to the options provided,\nreturning an array of all entries found.\n\n#### `pw.iterate(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nIterate over the directory asynchronously, for use with `for\nawait of`. This is also the default async iterator method.\n\n#### `pw.iterateSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nIterate over the directory synchronously, for use with `for of`.\nThis is also the default sync iterator method.\n\n#### `pw.stream(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nReturn a [Minipass](http://npm.im/minipass) stream that emits\neach entry or path string in the walk. Results are made available\nasynchronously.\n\n#### `pw.streamSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`\n\nReturn a [Minipass](http://npm.im/minipass) stream that emits\neach entry or path string in the walk. Results are made available\nsynchronously, meaning that the walk will complete in a single\ntick if the stream is fully consumed.\n\n#### `pw.cwd`\n\nPath object representing the current working directory for the\nPathScurry.\n\n#### `pw.chdir(path: string)`\n\nSet the new effective current working directory for the scurry\nobject, so that `path.relative()` and `path.relativePosix()`\nreturn values relative to the new cwd path.\n\n#### `pw.depth(path?: Path | string): number`\n\nReturn the depth of the specified path (or the PathScurry cwd)\nwithin the directory tree.\n\nRoot entries have a depth of `0`.\n\n#### `pw.resolve(...paths: string[])`\n\nCaching `path.resolve()`.\n\nSignificantly faster than `path.resolve()` if called repeatedly\nwith the same paths. Significantly slower otherwise, as it builds\nout the cached Path entries.\n\nTo get a `Path` object resolved from the `PathScurry`, use\n`pw.cwd.resolve(path)`. Note that `Path.resolve` only takes a\nsingle string argument, not multiple.\n\n#### `pw.resolvePosix(...paths: string[])`\n\nCaching `path.resolve()`, but always using posix style paths.\n\nThis is identical to `pw.resolve(...paths)` on posix systems (ie,\neverywhere except Windows).\n\nOn Windows, it returns the full absolute UNC path using `/`\nseparators. Ie, instead of `'C:\\\\foo\\\\bar`, it would return\n`//?/C:/foo/bar`.\n\n#### `pw.relative(path: string | Path): string`\n\nReturn the relative path from the PathWalker cwd to the supplied\npath string or entry.\n\nIf the nearest common ancestor is the root, then an absolute path\nis returned.\n\n#### `pw.relativePosix(path: string | Path): string`\n\nReturn the relative path from the PathWalker cwd to the supplied\npath string or entry, using `/` path separators.\n\nIf the nearest common ancestor is the root, then an absolute path\nis returned.\n\nOn posix platforms (ie, all platforms except Windows), this is\nidentical to `pw.relative(path)`.\n\nOn Windows systems, it returns the resulting string as a\n`/`-delimited path. If an absolute path is returned (because the\ntarget does not share a common ancestor with `pw.cwd`), then a\nfull absolute UNC path will be returned. Ie, instead of\n`'C:\\\\foo\\\\bar`, it would return `//?/C:/foo/bar`.\n\n#### `pw.basename(path: string | Path): string`\n\nReturn the basename of the provided string or Path.\n\n#### `pw.dirname(path: string | Path): string`\n\nReturn the parent directory of the supplied string or Path.\n\n#### `async pw.readdir(dir = pw.cwd, opts = { withFileTypes: true })`\n\nRead the directory and resolve to an array of strings if\n`withFileTypes` is explicitly set to `false` or Path objects\notherwise.\n\nCan be called as `pw.readdir({ withFileTypes: boolean })` as\nwell.\n\nReturns `[]` if no entries are found, or if any error occurs.\n\nNote that TypeScript return types will only be inferred properly\nfrom static analysis if the `withFileTypes` option is omitted, or\na constant `true` or `false` value.\n\n#### `pw.readdirSync(dir = pw.cwd, opts = { withFileTypes: true })`\n\nSynchronous `pw.readdir()`\n\n#### `async pw.readlink(link = pw.cwd, opts = { withFileTypes: false })`\n\nCall `fs.readlink` on the supplied string or Path object, and\nreturn the result.\n\nCan be called as `pw.readlink({ withFileTypes: boolean })` as\nwell.\n\nReturns `undefined` if any error occurs (for example, if the\nargument is not a symbolic link), or a `Path` object if\n`withFileTypes` is explicitly set to `true`, or a string\notherwise.\n\nNote that TypeScript return types will only be inferred properly\nfrom static analysis if the `withFileTypes` option is omitted, or\na constant `true` or `false` value.\n\n#### `pw.readlinkSync(link = pw.cwd, opts = { withFileTypes: false })`\n\nSynchronous `pw.readlink()`\n\n#### `async pw.lstat(entry = pw.cwd)`\n\nCall `fs.lstat` on the supplied string or Path object, and fill\nin as much information as possible, returning the updated `Path`\nobject.\n\nReturns `undefined` if the entry does not exist, or if any error\nis encountered.\n\nNote that some `Stats` data (such as `ino`, `dev`, and `mode`)\nwill not be supplied. For those things, you'll need to call\n`fs.lstat` yourself.\n\n#### `pw.lstatSync(entry = pw.cwd)`\n\nSynchronous `pw.lstat()`\n\n#### `pw.realpath(entry = pw.cwd, opts = { withFileTypes: false })`\n\nCall `fs.realpath` on the supplied string or Path object, and\nreturn the realpath if available.\n\nReturns `undefined` if any error occurs.\n\nMay be called as `pw.realpath({ withFileTypes: boolean })` to run\non `pw.cwd`.\n\n#### `pw.realpathSync(entry = pw.cwd, opts = { withFileTypes: false })`\n\nSynchronous `pw.realpath()`\n\n### Class `Path` implements [fs.Dirent](https://nodejs.org/docs/latest/api/fs.html#class-fsdirent)\n\nObject representing a given path on the filesystem, which may or\nmay not exist.\n\nNote that the actual class in use will be either `PathWin32` or\n`PathPosix`, depending on the implementation of `PathScurry` in\nuse. They differ in the separators used to split and join path\nstrings, and the handling of root paths.\n\nIn `PathPosix` implementations, paths are split and joined using\nthe `'/'` character, and `'/'` is the only root path ever in use.\n\nIn `PathWin32` implementations, paths are split using either\n`'/'` or `'\\\\'` and joined using `'\\\\'`, and multiple roots may\nbe in use based on the drives and UNC paths encountered. UNC\npaths such as `//?/C:/` that identify a drive letter, will be\ntreated as an alias for the same root entry as their associated\ndrive letter (in this case `'C:\\\\'`).\n\n#### `path.name`\n\nName of this file system entry.\n\n**Important**: _always_ test the path name against any test\nstring using the `isNamed` method, and not by directly comparing\nthis string. Otherwise, unicode path strings that the system sees\nas identical will not be properly treated as the same path,\nleading to incorrect behavior and possible security issues.\n\n#### `path.isNamed(name: string): boolean`\n\nReturn true if the path is a match for the given path name. This\nhandles case sensitivity and unicode normalization.\n\nNote: even on case-sensitive systems, it is **not** safe to test\nthe equality of the `.name` property to determine whether a given\npathname matches, due to unicode normalization mismatches.\n\nAlways use this method instead of testing the `path.name`\nproperty directly.\n\n#### `path.isCWD`\n\nSet to true if this `Path` object is the current working\ndirectory of the `PathScurry` collection that contains it.\n\n#### `path.getType()`\n\nReturns the type of the Path object, `'File'`, `'Directory'`,\netc.\n\n#### `path.isType(t: type)`\n\nReturns true if `is{t}()` returns true.\n\nFor example, `path.isType('Directory')` is equivalent to\n`path.isDirectory()`.\n\n#### `path.depth()`\n\nReturn the depth of the Path entry within the directory tree.\nRoot paths have a depth of `0`.\n\n#### `path.fullpath()`\n\nThe fully resolved path to the entry.\n\n#### `path.fullpathPosix()`\n\nThe fully resolved path to the entry, using `/` separators.\n\nOn posix systems, this is identical to `path.fullpath()`. On\nwindows, this will return a fully resolved absolute UNC path\nusing `/` separators. Eg, instead of `'C:\\\\foo\\\\bar'`, it will\nreturn `'//?/C:/foo/bar'`.\n\n#### `path.isFile()`, `path.isDirectory()`, etc.\n\nSame as the identical `fs.Dirent.isX()` methods.\n\n#### `path.isUnknown()`\n\nReturns true if the path's type is unknown. Always returns true\nwhen the path is known to not exist.\n\n#### `path.resolve(p: string)`\n\nReturn a `Path` object associated with the provided path string\nas resolved from the current Path object.\n\n#### `path.relative(): string`\n\nReturn the relative path from the PathWalker cwd to the supplied\npath string or entry.\n\nIf the nearest common ancestor is the root, then an absolute path\nis returned.\n\n#### `path.relativePosix(): string`\n\nReturn the relative path from the PathWalker cwd to the supplied\npath string or entry, using `/` path separators.\n\nIf the nearest common ancestor is the root, then an absolute path\nis returned.\n\nOn posix platforms (ie, all platforms except Windows), this is\nidentical to `pw.relative(path)`.\n\nOn Windows systems, it returns the resulting string as a\n`/`-delimited path. If an absolute path is returned (because the\ntarget does not share a common ancestor with `pw.cwd`), then a\nfull absolute UNC path will be returned. Ie, instead of\n`'C:\\\\foo\\\\bar`, it would return `//?/C:/foo/bar`.\n\n#### `async path.readdir()`\n\nReturn an array of `Path` objects found by reading the associated\npath entry.\n\nIf path is not a directory, or if any error occurs, returns `[]`,\nand marks all children as provisional and non-existent.\n\n#### `path.readdirSync()`\n\nSynchronous `path.readdir()`\n\n#### `async path.readlink()`\n\nReturn the `Path` object referenced by the `path` as a symbolic\nlink.\n\nIf the `path` is not a symbolic link, or any error occurs,\nreturns `undefined`.\n\n#### `path.readlinkSync()`\n\nSynchronous `path.readlink()`\n\n#### `async path.lstat()`\n\nCall `lstat` on the path object, and fill it in with details\ndetermined.\n\nIf path does not exist, or any other error occurs, returns\n`undefined`, and marks the path as \"unknown\" type.\n\n#### `path.lstatSync()`\n\nSynchronous `path.lstat()`\n\n#### `async path.realpath()`\n\nCall `realpath` on the path, and return a Path object\ncorresponding to the result, or `undefined` if any error occurs.\n\n#### `path.realpathSync()`\n\nSynchornous `path.realpath()`\n","readmeFilename":"README.md"}
+{
+ "name": "path-scurry",
+ "dist-tags": {
+ "latest": "1.11.1"
+ },
+ "versions": {
+ "1.11.1": {
+ "name": "path-scurry",
+ "version": "1.11.1",
+ "author": {
+ "url": "https://blog.izs.me",
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "BlueOak-1.0.0",
+ "_id": "path-scurry@1.11.1",
+ "bugs": {
+ "url": "https://github.com/isaacs/path-scurry/issues"
+ },
+ "tap": {
+ "typecheck": true
+ },
+ "dist": {
+ "shasum": "7960a668888594a0720b12a911d1a742ab9f11d2",
+ "tarball": "http://localhost:4260/path-scurry/path-scurry-1.11.1.tgz",
+ "fileCount": 13,
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "unpackedSize": 535479
+ },
+ "main": "./dist/commonjs/index.js",
+ "tshy": {
+ "exports": {
+ ".": "./src/index.ts",
+ "./package.json": "./package.json"
+ },
+ "selfLink": false
+ },
+ "type": "module",
+ "types": "./dist/commonjs/index.d.ts",
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "766c9b06aacef86b43c9999cabc5eb824b5958d6",
+ "scripts": {
+ "snap": "tap",
+ "test": "tap",
+ "bench": "bash ./scripts/bench.sh",
+ "format": "prettier --write . --loglevel warn",
+ "prepare": "tshy",
+ "presnap": "npm run prepare",
+ "pretest": "npm run prepare",
+ "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "prettier": {
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "endOfLine": "lf",
+ "printWidth": 75,
+ "arrowParens": "avoid",
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "experimentalTernaries": true
+ },
+ "repository": {
+ "url": "git+https://github.com/isaacs/path-scurry.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "walk paths fast and efficiently",
+ "directories": {},
+ "_nodeVersion": "20.11.0",
+ "dependencies": {
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "lru-cache": "^10.2.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "c8": "^7.12.0",
+ "tap": "^18.7.2",
+ "tshy": "^1.14.0",
+ "mkdirp": "^3.0.0",
+ "rimraf": "^5.0.1",
+ "ts-node": "^10.9.2",
+ "typedoc": "^0.25.12",
+ "prettier": "^3.2.5",
+ "typescript": "^5.4.3",
+ "@types/node": "^20.12.11",
+ "@nodelib/fs.walk": "^1.2.8",
+ "eslint-config-prettier": "^8.6.0"
+ }
+ }
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/path-scurry/issues"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://blog.izs.me"
+ },
+ "license": "BlueOak-1.0.0",
+ "homepage": "https://github.com/isaacs/path-scurry#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/path-scurry.git"
+ },
+ "description": "walk paths fast and efficiently",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/pathval/registry.json b/tests/registry/npm/pathval/registry.json
index 3d9691e59..f291a5f3c 100644
--- a/tests/registry/npm/pathval/registry.json
+++ b/tests/registry/npm/pathval/registry.json
@@ -1 +1,112 @@
-{"name":"pathval","description":"Object value retrieval given a string path","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.1":{"name":"pathval","description":"Object value retrieval given a string path","version":"1.1.1","license":"MIT","author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"main":"./index.js","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/pathval.git"},"scripts":{"build":"browserify --standalone pathval -o pathval.js","lint":"eslint --ignore-path .gitignore .","lint:fix":"npm run lint -- --fix","prepublish":"npm run build","semantic-release":"semantic-release pre && npm publish && semantic-release post","pretest":"npm run lint","test":"npm run test:node && npm run test:browser && npm run upload-coverage","test:browser":"karma start --singleRun=true","test:node":"nyc mocha","upload-coverage":"lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg"}},"eslintConfig":{"extends":["strict/es5"],"env":{"es6":true},"globals":{"HTMLElement":false},"rules":{"complexity":0,"max-statements":0}},"devDependencies":{"browserify":"^17.0.0","browserify-istanbul":"^3.0.1","coveralls":"^3.1.0","eslint":"^7.13.0","eslint-config-strict":"^14.0.1","eslint-plugin-filenames":"^1.3.2","ghooks":"^2.0.4","karma":"^5.2.3","karma-browserify":"^7.0.0","karma-coverage":"^2.0.3","karma-mocha":"^2.0.1","karma-phantomjs-launcher":"^1.0.4","karma-sauce-launcher":"^4.3.3","lcov-result-merger":"^3.1.0","mocha":"^8.2.1","nyc":"^15.1.0","phantomjs-prebuilt":"^2.1.16","semantic-release":"^17.2.2","simple-assert":"^1.0.0","travis-after-all":"^1.4.5","validate-commit-msg":"^2.14.0"},"engines":{"node":"*"},"gitHead":"db6c3e39c39859564704b7f37149082689f1b172","bugs":{"url":"https://github.com/chaijs/pathval/issues"},"_id":"pathval@1.1.1","_nodeVersion":"14.9.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==","shasum":"8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d","tarball":"http://localhost:4260/pathval/pathval-1.1.1.tgz","fileCount":6,"unpackedSize":15830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgD+x9CRA9TVsSAnZWagAARd4P+wdHojovTrxc91hH6k/c\n3Godh5zA1jYAwNlwjcHWxS88ahx4eOff0OiBeNx+nVhILsAKxrXyCySC0yFc\nf16UdXO6u3IX4O8dzlVFwKYdT7icgioUDzrxsNXioE/sdZMXlEyNFxm6QHN8\nBUz0fI+h5FyTUuHIjt6vd5ZbDL5nsL58+S3JiqWl76KBxNyzUh53j+2AVLW4\n+bTUyNQMkgFUXwY0O3IxNQqBLuDUOrAoiCowF/WsgzESdkvwFbVTu6JY4Hnb\niMw4RSIbV78iEVESSli1Tug3bBFLshjzIzZUNqzdu9En1iy12sPvmqctXDZy\ntimD/2vV7ei5zievT/FjwcXj/V5k2if7mNxwbdBPPEb36UeXnCYzYOyUAmY8\noSZbAav6rVTVJkkBYl+2XXz4eypZ6CNBc07y8M/1y8tQ0vgQYTd43fHvrZ1K\nglH/YtSLj+abkPtW65wCZS1Ahx8Okvg4bsogwkovPL0SUiNbQzBvoUeJz3bz\nPIE2t7H7ZIniuTYEF/l6y+MKWOdVBt1ucq8rsBRiGMov5PQK08/8OzrBOl/K\n3dZY61MkvmcTeBMlw7Ti2pZ8A0+W6Tw4naO31KfmuVh4404Fqp79G3TEu0Xl\ngjoSFM/TdS/3QeuCMCl9v4ol8Cs1aMybSsAjdGe1UOWTetLX5cNd239CXy9o\n1gti\r\n=fphS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCq1EFJ5gpdj/gAtuMvlWrx/gGxxt2sXf3r02rgfLyuQIgN3fLLXsIoODW1d6v4ajwQ6/MikOWcxFFSj9cBcVQTdY="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"ChaiJS\" src=\"http://chaijs.com/img/chai-logo.png\">\n </a>\n <br>\n pathval\n</h1>\n\n<p align=center>\n Tool for Object value retrieval given a string path for <a href=\"http://nodejs.org\">node</a> and the browser.\n</p>\n\n<p align=center>\n <a href=\"./LICENSE\">\n <img\n alt=\"license:mit\"\n src=\"https://img.shields.io/badge/license-mit-green.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://github.com/chaijs/pathval/releases\">\n <img\n alt=\"tag:?\"\n src=\"https://img.shields.io/github/tag/chaijs/pathval.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://travis-ci.org/chaijs/pathval\">\n <img\n alt=\"build:?\"\n src=\"https://img.shields.io/travis/chaijs/pathval/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://coveralls.io/r/chaijs/pathval\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/coveralls/chaijs/pathval/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/pathval\">\n <img\n alt=\"npm:?\"\n src=\"https://img.shields.io/npm/v/pathval.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/pathval\">\n <img\n alt=\"dependencies:?\"\n src=\"https://img.shields.io/npm/dm/pathval.svg?style=flat-square\"\n />\n </a>\n <a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/pathval.svg?style=flat-square\"\n />\n </a>\n <br/>\n <a href=\"https://saucelabs.com/u/chaijs-pathval\">\n <img\n alt=\"Selenium Test Status\"\n src=\"https://saucelabs.com/browser-matrix/chaijs-pathval.svg\"\n />\n </a>\n <br>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/chai\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n</p>\n\n## What is pathval?\n\nPathval is a module which you can use to retrieve or set an Object's property for a given `String` path.\n\n## Installation\n\n### Node.js\n\n`pathval` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install pathval\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `pathval.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/pathval/pathval.js\"></script>\n```\n\n## Usage\n\nThe primary export of `pathval` is an object which has the following methods:\n\n* `hasProperty(object, name)` - Checks whether an `object` has `name`d property or numeric array index.\n* `getPathInfo(object, path)` - Returns an object with info indicating the value of the `parent` of that path, the `name ` of the property we're retrieving and its `value`.\n* `getPathValue(object, path)` - Retrieves the value of a property at a given `path` inside an `object`'.\n* `setPathValue(object, path, value)` - Sets the `value` of a property at a given `path` inside an `object` and returns the object in which the property has been set.\n\n```js\nvar pathval = require('pathval');\n```\n\n#### .hasProperty(object, name)\n\n```js\nvar pathval = require('pathval');\n\nvar obj = { prop: 'a value' };\npathval.hasProperty(obj, 'prop'); // true\n```\n\n#### .getPathInfo(object, path)\n\n```js\nvar pathval = require('pathval');\n\nvar obj = { earth: { country: 'Brazil' } };\npathval.getPathInfo(obj, 'earth.country'); // { parent: { country: 'Brazil' }, name: 'country', value: 'Brazil', exists: true }\n```\n\n#### .getPathValue(object, path)\n\n```js\nvar pathval = require('pathval');\n\nvar obj = { earth: { country: 'Brazil' } };\npathval.getPathValue(obj, 'earth.country'); // 'Brazil'\n```\n\n#### .setPathValue(object, path, value)\n\n```js\nvar pathval = require('pathval');\n\nvar obj = { earth: { country: 'Brazil' } };\npathval.setPathValue(obj, 'earth.country', 'USA');\n\nobj.earth.country; // 'USA'\n```\n","author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/pathval.git"},"homepage":"https://github.com/chaijs/pathval","bugs":{"url":"https://github.com/chaijs/pathval/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "pathval",
+ "description": "Object value retrieval given a string path",
+ "dist-tags": {
+ "latest": "1.1.1"
+ },
+ "versions": {
+ "1.1.1": {
+ "name": "pathval",
+ "description": "Object value retrieval given a string path",
+ "version": "1.1.1",
+ "license": "MIT",
+ "author": {
+ "name": "Veselin Todorov",
+ "email": "hi@vesln.com"
+ },
+ "main": "./index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/pathval.git"
+ },
+ "scripts": {
+ "build": "browserify --standalone pathval -o pathval.js",
+ "lint": "eslint --ignore-path .gitignore .",
+ "lint:fix": "npm run lint -- --fix",
+ "prepublish": "npm run build",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "pretest": "npm run lint",
+ "test": "npm run test:node && npm run test:browser && npm run upload-coverage",
+ "test:browser": "karma start --singleRun=true",
+ "test:node": "nyc mocha",
+ "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0"
+ },
+ "config": {
+ "ghooks": {
+ "commit-msg": "validate-commit-msg"
+ }
+ },
+ "eslintConfig": {
+ "extends": [
+ "strict/es5"
+ ],
+ "env": {
+ "es6": true
+ },
+ "globals": {
+ "HTMLElement": false
+ },
+ "rules": {
+ "complexity": 0,
+ "max-statements": 0
+ }
+ },
+ "devDependencies": {
+ "browserify": "^17.0.0",
+ "browserify-istanbul": "^3.0.1",
+ "coveralls": "^3.1.0",
+ "eslint": "^7.13.0",
+ "eslint-config-strict": "^14.0.1",
+ "eslint-plugin-filenames": "^1.3.2",
+ "ghooks": "^2.0.4",
+ "karma": "^5.2.3",
+ "karma-browserify": "^7.0.0",
+ "karma-coverage": "^2.0.3",
+ "karma-mocha": "^2.0.1",
+ "karma-phantomjs-launcher": "^1.0.4",
+ "karma-sauce-launcher": "^4.3.3",
+ "lcov-result-merger": "^3.1.0",
+ "mocha": "^8.2.1",
+ "nyc": "^15.1.0",
+ "phantomjs-prebuilt": "^2.1.16",
+ "semantic-release": "^17.2.2",
+ "simple-assert": "^1.0.0",
+ "travis-after-all": "^1.4.5",
+ "validate-commit-msg": "^2.14.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "gitHead": "db6c3e39c39859564704b7f37149082689f1b172",
+ "bugs": {
+ "url": "https://github.com/chaijs/pathval/issues"
+ },
+ "_id": "pathval@1.1.1",
+ "_nodeVersion": "14.9.0",
+ "_npmVersion": "6.14.8",
+ "dist": {
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "shasum": "8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d",
+ "tarball": "http://localhost:4260/pathval/pathval-1.1.1.tgz",
+ "fileCount": 6,
+ "unpackedSize": 15830
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Veselin Todorov",
+ "email": "hi@vesln.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/pathval.git"
+ },
+ "homepage": "https://github.com/chaijs/pathval",
+ "bugs": {
+ "url": "https://github.com/chaijs/pathval/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/picocolors/registry.json b/tests/registry/npm/picocolors/registry.json
index 931ff6c98..8ad516162 100644
--- a/tests/registry/npm/picocolors/registry.json
+++ b/tests/registry/npm/picocolors/registry.json
@@ -1 +1,57 @@
-{"name":"picocolors","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"picocolors","version":"1.0.0","main":"./picocolors.js","types":"./picocolors.d.ts","browser":{"./picocolors.js":"./picocolors.browser.js"},"sideEffects":false,"description":"The tiniest and the fastest library for terminal output formatting with ANSI colors","author":{"name":"Alexey Raspopov"},"repository":{"type":"git","url":"git+https://github.com/alexeyraspopov/picocolors.git"},"license":"ISC","gitHead":"228cea3fa726857785b8c069cccc58e9743cd71d","bugs":{"url":"https://github.com/alexeyraspopov/picocolors/issues"},"_id":"picocolors@1.0.0","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==","shasum":"cb5bdc74ff3f51892236eaf79d68bc44564ab81c","tarball":"http://localhost:4260/picocolors/picocolors-1.0.0.tgz","fileCount":7,"unpackedSize":5655,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh22nwCRA9TVsSAnZWagAAufkP/R/CYVS1T3kooVHNOWZ3\nsIFVEZ0qe/zdgbUt3+leoirZ6ZGt16TuzynSZWLgZgLH9TELft0P3CXZbCuM\nuqWdH6NxFwNwadD8hRos2+XG81xHrrb7rDHdrjjwJXZq1e66mqJuYDDX1MOe\nUNIYuZUQ+qiBhzjMKj6tvkOPpuf8t8kl0j1lPlunityAjGOmrmv4JGhtYKB5\nUZtkz39+BEiDL6NDzCsjMg3v9In+T9phNlpNYup44cgJ29U+zAxAatEOA8PM\nbBB+ynEz+R0ewz9s+eo5WYP9dJgH3ztmadcXUxOhqSiZ9AMtsJyS3JSqYZUX\nEY+9Bk8J7t0CJxI1ErrphVoKc5rU8gykxC7RFvLCKGsu9EtPqHmnApObtlh6\nYZDBikEKtyEi5F4lzFhrYIkX78pJm53/zM43vST5igJ5z26crugx1DzEdUhO\ngfYGvR8/NoTMotY1UJPocEGLmWm6rt+es1a3z0lgxbeVBbcV7Bevpr8ZB1/9\njtmrdVvNuAOduDaQKr7JfeEbyJXePTzfsuocechG0POku0BQ9CPb4dLGqMAr\nFW+4jNef32pfTzy1ElFtSzH9hPKqRQ2iuldLRKqupjN6MFOHJehUc88PH6Ij\n7bBxxTtWh/fRhHEDEub4BFJ7b+iZ80yc59mb279VTdnzTChku4LHwPJwLU/I\nY10t\r\n=jcIN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxCChHxcIJX0CufwbTxL7HtG+9h9Me4kC3TCHewLhm0QIgGrMSC82ddA69hW03p8i/KWOfPQ57gHU1C9FyWjtpdzg="}]},"directories":{},"_hasShrinkwrap":false}},"description":"The tiniest and the fastest library for terminal output formatting with ANSI colors","author":{"name":"Alexey Raspopov"},"license":"ISC","readme":"# picocolors\n\nThe tiniest and the fastest library for terminal output formatting with ANSI colors.\n\n```javascript\nimport pc from \"picocolors\"\n\nconsole.log(\n pc.green(`How are ${pc.italic(`you`)} doing?`)\n)\n```\n\n- **No dependencies.**\n- **14 times** smaller and **2 times** faster than chalk.\n- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist.\n- Node.js v6+ & browsers support. Support for both CJS and ESM projects.\n- TypeScript type declarations included.\n- [`NO_COLOR`](https://no-color.org/) friendly.\n\n## Docs\nRead **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub.\n","readmeFilename":"README.md","homepage":"https://github.com/alexeyraspopov/picocolors#readme","repository":{"type":"git","url":"git+https://github.com/alexeyraspopov/picocolors.git"},"bugs":{"url":"https://github.com/alexeyraspopov/picocolors/issues"}}
+{
+ "name": "picocolors",
+ "dist-tags": {
+ "latest": "1.0.0"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "picocolors",
+ "version": "1.0.0",
+ "main": "./picocolors.js",
+ "types": "./picocolors.d.ts",
+ "browser": {
+ "./picocolors.js": "./picocolors.browser.js"
+ },
+ "sideEffects": false,
+ "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors",
+ "author": {
+ "name": "Alexey Raspopov"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/alexeyraspopov/picocolors.git"
+ },
+ "license": "ISC",
+ "gitHead": "228cea3fa726857785b8c069cccc58e9743cd71d",
+ "bugs": {
+ "url": "https://github.com/alexeyraspopov/picocolors/issues"
+ },
+ "_id": "picocolors@1.0.0",
+ "_nodeVersion": "16.10.0",
+ "_npmVersion": "7.24.0",
+ "dist": {
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "shasum": "cb5bdc74ff3f51892236eaf79d68bc44564ab81c",
+ "tarball": "http://localhost:4260/picocolors/picocolors-1.0.0.tgz",
+ "fileCount": 7,
+ "unpackedSize": 5655
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors",
+ "author": {
+ "name": "Alexey Raspopov"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/alexeyraspopov/picocolors#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/alexeyraspopov/picocolors.git"
+ },
+ "bugs": {
+ "url": "https://github.com/alexeyraspopov/picocolors/issues"
+ }
+}
diff --git a/tests/registry/npm/postcss-value-parser/registry.json b/tests/registry/npm/postcss-value-parser/registry.json
index aff3727d9..68f2dfb61 100644
--- a/tests/registry/npm/postcss-value-parser/registry.json
+++ b/tests/registry/npm/postcss-value-parser/registry.json
@@ -1 +1,28 @@
-{"name":"postcss-value-parser","dist-tags":{"latest":"4.2.0"},"versions":{"4.2.0":{"name":"postcss-value-parser","version":"4.2.0","devDependencies":{"eslint":"^5.16.0","husky":"^2.3.0","lint-staged":"^8.1.7","prettier":"^1.17.1","tap-spec":"^5.0.0","tape":"^4.10.2"},"dist":{"integrity":"sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==","shasum":"723c09920836ba6d3e5af019f92bc0971c02e514","tarball":"http://localhost:4260/postcss-value-parser/postcss-value-parser-4.2.0.tgz","fileCount":9,"unpackedSize":27193,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhpLpoCRA9TVsSAnZWagAANQAP/3+FHzKyMlmrztORDqK5\nKXBDOWF1sERpJTyPTldQBNrlYrMJ/WxrnFmx5+1Ixcir1pieRL06KlzQR7/a\nR+r0R3C8TVxA2+nPoGCsyyjh4oYbMdBrAUD8xUpfHpAIxA5tAYUXzvl8UD9Q\nKmcE8hFaKyx/6huIXNJvmXiC0FK12aj5cOLAxkkqghE4CQf+ZDh7sc27P2GK\n99Ln5JOI4OoWMUYRSIXvKUcyleqpBlPzcMixhhKVzJbJ6T7nP0EGpx8UiNWH\nJYJgNDI9HYWGxg8xWQPDb+bz4ZblswlXG7b4FQOjTiwrTXGExOhTbnU7sTkH\nfSCO0WNcLdtMJIgxnMyE5MhHUPnJjE/yZVxTX11eMf1Fa8ouYbL4diAYbekW\ncyjZGHuIFNPGRwxgYkhmTQhn1iNDRZk0epkcFkux6JCgYJJuu37zYqrbR0h2\nm6nulzm4IsURI4NUYyyRAVeYhKGqiB8pEBfuNJdyN1gR64U3Jsdcd0itwarU\nzQhWvuYO9dqdklFLIB9nhzc77aOq+IVuHLBhtmq8tEdDR4H/pKV9XZWIBfCa\nMPw+FuAsOA0JuOqNh/NB0RwBn4SIp0ky4wg+CI1TiWXTBNirVcrdQcw6Cyl7\nt5DQ6AE8WMwfdCM0rdkxfqVPE5U7Ff6/0r23jxDvGRVGxneor3FfP8RaaUkT\n2w8b\r\n=emCf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHNke+7UHWHrilJ/00GKN5UcTpba+h0s7EgnB64Jfv4+AiEAjraq/TQZRHEIdNYNXMi2hmH56oVnwOju8ICvEnjMn8Q="}]}}},"modified":"2022-06-24T11:09:55.679Z"}
+{
+ "name": "postcss-value-parser",
+ "dist-tags": {
+ "latest": "4.2.0"
+ },
+ "versions": {
+ "4.2.0": {
+ "name": "postcss-value-parser",
+ "version": "4.2.0",
+ "devDependencies": {
+ "eslint": "^5.16.0",
+ "husky": "^2.3.0",
+ "lint-staged": "^8.1.7",
+ "prettier": "^1.17.1",
+ "tap-spec": "^5.0.0",
+ "tape": "^4.10.2"
+ },
+ "dist": {
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "shasum": "723c09920836ba6d3e5af019f92bc0971c02e514",
+ "tarball": "http://localhost:4260/postcss-value-parser/postcss-value-parser-4.2.0.tgz",
+ "fileCount": 9,
+ "unpackedSize": 27193
+ }
+ }
+ },
+ "modified": "2022-06-24T11:09:55.679Z"
+}
diff --git a/tests/registry/npm/postcss/registry.json b/tests/registry/npm/postcss/registry.json
index 6ae70e5e6..5f2cbe5ac 100644
--- a/tests/registry/npm/postcss/registry.json
+++ b/tests/registry/npm/postcss/registry.json
@@ -1 +1,115 @@
-{"name":"postcss","description":"Tool for transforming styles with JS plugins","dist-tags":{"latest":"8.4.16"},"versions":{"8.4.16":{"name":"postcss","version":"8.4.16","description":"Tool for transforming styles with JS plugins","engines":{"node":"^10 || ^12 || >=14"},"exports":{".":{"require":"./lib/postcss.js","import":"./lib/postcss.mjs","types":"./lib/postcss.d.ts"},"./lib/at-rule":"./lib/at-rule.js","./lib/comment":"./lib/comment.js","./lib/container":"./lib/container.js","./lib/css-syntax-error":"./lib/css-syntax-error.js","./lib/declaration":"./lib/declaration.js","./lib/fromJSON":"./lib/fromJSON.js","./lib/input":"./lib/input.js","./lib/lazy-result":"./lib/lazy-result.js","./lib/no-work-result":"./lib/no-work-result.js","./lib/list":"./lib/list.js","./lib/map-generator":"./lib/map-generator.js","./lib/node":"./lib/node.js","./lib/parse":"./lib/parse.js","./lib/parser":"./lib/parser.js","./lib/postcss":"./lib/postcss.js","./lib/previous-map":"./lib/previous-map.js","./lib/processor":"./lib/processor.js","./lib/result":"./lib/result.js","./lib/root":"./lib/root.js","./lib/rule":"./lib/rule.js","./lib/stringifier":"./lib/stringifier.js","./lib/stringify":"./lib/stringify.js","./lib/symbols":"./lib/symbols.js","./lib/terminal-highlight":"./lib/terminal-highlight.js","./lib/tokenize":"./lib/tokenize.js","./lib/warn-once":"./lib/warn-once.js","./lib/warning":"./lib/warning.js","./package.json":"./package.json"},"main":"./lib/postcss.js","types":"./lib/postcss.d.ts","funding":[{"type":"opencollective","url":"https://opencollective.com/postcss/"},{"type":"tidelift","url":"https://tidelift.com/funding/github/npm/postcss"}],"author":{"name":"Andrey Sitnik","email":"andrey@sitnik.ru"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/postcss/postcss.git"},"bugs":{"url":"https://github.com/postcss/postcss/issues"},"dependencies":{"nanoid":"^3.3.4","picocolors":"^1.0.0","source-map-js":"^1.0.2"},"browser":{"./lib/terminal-highlight":false,"source-map-js":false,"path":false,"url":false,"fs":false},"gitHead":"bc18340b6bcbea43839e56a8b61b939396b487ef","_id":"postcss@8.4.16","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==","shasum":"33a1d675fac39941f5f445db0de4db2b6e01d43c","tarball":"http://localhost:4260/postcss/postcss-8.4.16.tgz","fileCount":54,"unpackedSize":186792,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFH+UIT24wbZev1em33zx3GPflt/CQpILSoMyWVjE9kAAiEAm+rmAT1EpBpKUBSHt5thUpbQx2yrjT2lx551OlFR6+U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7roqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp51g/5ANdhuKbUu/vTRgvT0z3wuujoja1OBzpykXOk25AILOFI9jdd\r\nu/SJrsHzbYqnpLJmgYDlTTSVidJfwaTOcAGY18/rVXsU+5ivxPGqjzTs51e2\r\n3OoQOKlLj9lLNyua0DJkK7FY2Jx05Z51Q67MO8iDpUt7RMtg2RMPv+GHMcP5\r\nJb1YuU18kCNa54wryaENApQFLjiNiqh05acJob2hXT6rUTTS0wdxZwm6RRUC\r\nDFTGe/yb7ECqEt9dKCwfrjay/GklAi3WLT2Bv2xGICK6eemnp2kLeNfzz95q\r\nbAmYSZxOwRBXagoaDZ7PXKZ6ZWkTYbaj7yyuhIRb3801nzDodPEd+zGnoxso\r\ne4lgIoXEpsvRfp+aF9DnoxZygiuOylb12Dkbpl78ENH3xrliZEIzUYDJhFYn\r\nzBRLAo6OhvRcGHh+BTSzkuMStzlsIgnPupsCoGrq2zSg3LDoRNFwRDXtmZHa\r\n2U8SjyN8WSPzT+ZU3PkU2miDpWs3JHvkoiBVbtYydR9FBfuwxxrbUJqzpIAW\r\ngtYUeAiSiUl+Qtb3XKzLNgInQSDV522Bs7rFG2NqlyZ2rKFp/cfr1/fXnNQ8\r\nNU6F04FDq/e92bohVExgnJiqb1kHy7iU46WA0Xl/Dt6V+eTLQ7WZ0gqnFzwU\r\nxjyltxUByKuT/EtQeqbK7iLUevog7Nt/LKk=\r\n=MS1+\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# PostCSS [![Gitter][chat-img]][chat]\n\n<img align=\"right\" width=\"95\" height=\"95\"\n alt=\"Philosopher’s stone, logo of PostCSS\"\n src=\"https://postcss.org/logo.svg\">\n\n[chat-img]: https://img.shields.io/badge/Gitter-Join_the_PostCSS_chat-brightgreen.svg\n[chat]: https://gitter.im/postcss/postcss\n\nPostCSS is a tool for transforming styles with JS plugins.\nThese plugins can lint your CSS, support variables and mixins,\ntranspile future CSS syntax, inline images, and more.\n\nPostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba,\nand JetBrains. The [Autoprefixer] PostCSS plugin is one of the most popular\nCSS processors.\n\nPostCSS takes a CSS file and provides an API to analyze and modify its rules\n(by transforming them into an [Abstract Syntax Tree]).\nThis API can then be used by [plugins] to do a lot of useful things,\ne.g., to find errors automatically, or to insert vendor prefixes.\n\n**Support / Discussion:** [Gitter](https://gitter.im/postcss/postcss)<br>\n**Twitter account:** [@postcss](https://twitter.com/postcss)<br>\n**VK.com page:** [postcss](https://vk.com/postcss)<br>\n**中文翻译**: [`docs/README-cn.md`](./docs/README-cn.md)\n\nFor PostCSS commercial support (consulting, improving the front-end culture\nof your company, PostCSS plugins), contact [Evil Martians]\nat <postcss@evilmartians.com>.\n\n[Abstract Syntax Tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree\n[Evil Martians]: https://evilmartians.com/?utm_source=postcss\n[Autoprefixer]: https://github.com/postcss/autoprefixer\n[plugins]: https://github.com/postcss/postcss#plugins\n\n<a href=\"https://evilmartians.com/?utm_source=postcss\">\n <img src=\"https://evilmartians.com/badges/sponsored-by-evil-martians.svg\"\n alt=\"Sponsored by Evil Martians\" width=\"236\" height=\"54\">\n</a>\n\n\n## Docs\nRead **[full docs](https://github.com/postcss/postcss#readme)** on GitHub.\n","author":{"name":"Andrey Sitnik","email":"andrey@sitnik.ru"},"repository":{"type":"git","url":"git+https://github.com/postcss/postcss.git"},"readmeFilename":"README.md","bugs":{"url":"https://github.com/postcss/postcss/issues"},"license":"MIT","homepage":"https://postcss.org/"}
+{
+ "name": "postcss",
+ "description": "Tool for transforming styles with JS plugins",
+ "dist-tags": {
+ "latest": "8.4.16"
+ },
+ "versions": {
+ "8.4.16": {
+ "name": "postcss",
+ "version": "8.4.16",
+ "description": "Tool for transforming styles with JS plugins",
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "exports": {
+ ".": {
+ "require": "./lib/postcss.js",
+ "import": "./lib/postcss.mjs",
+ "types": "./lib/postcss.d.ts"
+ },
+ "./lib/at-rule": "./lib/at-rule.js",
+ "./lib/comment": "./lib/comment.js",
+ "./lib/container": "./lib/container.js",
+ "./lib/css-syntax-error": "./lib/css-syntax-error.js",
+ "./lib/declaration": "./lib/declaration.js",
+ "./lib/fromJSON": "./lib/fromJSON.js",
+ "./lib/input": "./lib/input.js",
+ "./lib/lazy-result": "./lib/lazy-result.js",
+ "./lib/no-work-result": "./lib/no-work-result.js",
+ "./lib/list": "./lib/list.js",
+ "./lib/map-generator": "./lib/map-generator.js",
+ "./lib/node": "./lib/node.js",
+ "./lib/parse": "./lib/parse.js",
+ "./lib/parser": "./lib/parser.js",
+ "./lib/postcss": "./lib/postcss.js",
+ "./lib/previous-map": "./lib/previous-map.js",
+ "./lib/processor": "./lib/processor.js",
+ "./lib/result": "./lib/result.js",
+ "./lib/root": "./lib/root.js",
+ "./lib/rule": "./lib/rule.js",
+ "./lib/stringifier": "./lib/stringifier.js",
+ "./lib/stringify": "./lib/stringify.js",
+ "./lib/symbols": "./lib/symbols.js",
+ "./lib/terminal-highlight": "./lib/terminal-highlight.js",
+ "./lib/tokenize": "./lib/tokenize.js",
+ "./lib/warn-once": "./lib/warn-once.js",
+ "./lib/warning": "./lib/warning.js",
+ "./package.json": "./package.json"
+ },
+ "main": "./lib/postcss.js",
+ "types": "./lib/postcss.d.ts",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "author": {
+ "name": "Andrey Sitnik",
+ "email": "andrey@sitnik.ru"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/postcss/postcss.git"
+ },
+ "bugs": {
+ "url": "https://github.com/postcss/postcss/issues"
+ },
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "browser": {
+ "./lib/terminal-highlight": false,
+ "source-map-js": false,
+ "path": false,
+ "url": false,
+ "fs": false
+ },
+ "gitHead": "bc18340b6bcbea43839e56a8b61b939396b487ef",
+ "_id": "postcss@8.4.16",
+ "_nodeVersion": "18.7.0",
+ "_npmVersion": "8.15.0",
+ "dist": {
+ "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
+ "shasum": "33a1d675fac39941f5f445db0de4db2b6e01d43c",
+ "tarball": "http://localhost:4260/postcss/postcss-8.4.16.tgz",
+ "fileCount": 54,
+ "unpackedSize": 186792
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Andrey Sitnik",
+ "email": "andrey@sitnik.ru"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/postcss/postcss.git"
+ },
+ "readmeFilename": "README.md",
+ "bugs": {
+ "url": "https://github.com/postcss/postcss/issues"
+ },
+ "license": "MIT",
+ "homepage": "https://postcss.org/"
+}
diff --git a/tests/registry/npm/preact-render-to-string/registry.json b/tests/registry/npm/preact-render-to-string/registry.json
index 88ca82fe8..f9d97fe52 100644
--- a/tests/registry/npm/preact-render-to-string/registry.json
+++ b/tests/registry/npm/preact-render-to-string/registry.json
@@ -1 +1,183 @@
-{"name":"preact-render-to-string","description":"Render JSX to an HTML string, with support for Preact components.","dist-tags":{"latest":"6.4.0"},"versions":{"6.4.0":{"name":"preact-render-to-string","amdName":"preactRenderToString","version":"6.4.0","description":"Render JSX to an HTML string, with support for Preact components.","main":"dist/index.js","umd:main":"dist/index.umd.js","module":"dist/index.module.js","jsnext:main":"dist/index.module.js","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","browser":"./dist/index.module.js","umd":"./dist/index.umd.js","import":"./dist/index.mjs","require":"./dist/index.js"},"./jsx":{"types":"./jsx.d.ts","browser":"./dist/jsx.module.js","umd":"./dist/jsx.umd.js","import":"./dist/jsx.mjs","require":"./dist/jsx.js"},"./package.json":"./package.json"},"scripts":{"bench":"BABEL_ENV=test node -r @babel/register benchmarks index.js","bench:v8":"BABEL_ENV=test microbundle benchmarks/index.js -f modern --alias benchmarkjs-pretty=benchmarks/lib/benchmark-lite.js --external none --target node --no-compress --no-sourcemap --raw -o benchmarks/.v8.mjs && v8 --module benchmarks/.v8.mjs","build":"npm run -s transpile && npm run -s transpile:jsx && npm run -s copy-typescript-definition","postbuild":"node ./config/node-13-exports.js && node ./config/node-commonjs.js && node ./config/node-verify-exports.js","transpile":"microbundle src/index.js -f es,cjs,umd --target web --external preact","transpile:jsx":"microbundle src/jsx.js -o dist/jsx.js --target web --external preact && microbundle dist/jsx.js -o dist/jsx.js -f cjs --external preact","copy-typescript-definition":"copyfiles -f src/*.d.ts dist","test":"eslint src test && tsc && npm run test:mocha && npm run test:mocha:compat && npm run test:mocha:debug && npm run bench","test:mocha":"BABEL_ENV=test mocha -r @babel/register -r test/setup.js test/*.test.js","test:mocha:compat":"BABEL_ENV=test mocha -r @babel/register -r test/setup.js 'test/compat/*.test.js'","test:mocha:debug":"BABEL_ENV=test mocha -r @babel/register -r test/setup.js 'test/debug/index.test.js'","format":"prettier src/**/*.{d.ts,js} test/**/*.js --write","prepublishOnly":"npm run build","release":"npm run build && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags && npm publish"},"eslintConfig":{"extends":"developit","rules":{"react/prefer-stateless-function":0,"react/jsx-no-bind":0,"react/no-danger":0,"jest/valid-expect":0,"new-cap":0,"curly":"off","brace-style":"off","indent":"off"},"settings":{"react":{"version":"16.8"}}},"babel":{"env":{"test":{"presets":[["@babel/preset-env",{"targets":{"node":true}}]],"plugins":[["@babel/plugin-transform-react-jsx",{"pragma":"h"}]]}}},"minify":{"compress":{"reduce_funcs":false}},"author":{"name":"Jason Miller","email":"jason@developit.ca"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/developit/preact-render-to-string.git"},"bugs":{"url":"https://github.com/developit/preact-render-to-string/issues"},"peerDependencies":{"preact":">=10"},"devDependencies":{"@babel/plugin-transform-react-jsx":"^7.22.15","@babel/preset-env":"^7.23.2","@babel/register":"^7.22.15","@changesets/changelog-github":"^0.4.1","@changesets/cli":"^2.18.0","benchmarkjs-pretty":"^2.0.1","chai":"^4.3.10","copyfiles":"^2.4.1","eslint":"^7.16.0","eslint-config-developit":"^1.2.0","husky":"^4.3.6","lint-staged":"^10.5.3","microbundle":"^0.15.1","mocha":"^10.2.0","baseline-rts":"npm:preact-render-to-string@latest","preact":"^10.13.0","prettier":"^2.2.1","sinon":"^9.2.2","sinon-chai":"^3.5.0","typescript":"^5.0.0"},"dependencies":{"pretty-format":"^3.8.0"},"prettier":{"singleQuote":true,"trailingComma":"none","useTabs":true,"tabWidth":2},"lint-staged":{"**/*.{js,jsx,ts,tsx,yml}":["prettier --write"]},"husky":{"hooks":{"pre-commit":"lint-staged"}},"gitHead":"797c82fd7a8cb49c2cfd1f5c3f5e94a44b473956","_id":"preact-render-to-string@6.4.0","_nodeVersion":"18.15.0","_npmVersion":"9.5.0","dist":{"integrity":"sha512-pzDwezZaLbK371OiJjXDsZJwVOALzFX5M1wEh2Kr0pEApq5AV6bRH/DFbA/zNA7Lck/duyREPQLLvzu2G6hEQQ==","shasum":"03cdd661d35e9ac76bed9f0e37ccceb42cae5fa5","tarball":"http://localhost:4260/preact-render-to-string/preact-render-to-string-6.4.0.tgz","fileCount":37,"unpackedSize":438403,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTa+cBqkHxRPuwDWpHw9h6UF0HFVokRCpvLEgoiEaZtwIhAJSIy8Q2fXZda8KVTd8CpzeT5jFPbCiww9rvyCyA125q"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# preact-render-to-string\n\n[![NPM](http://img.shields.io/npm/v/preact-render-to-string.svg)](https://www.npmjs.com/package/preact-render-to-string)\n[![Build status](https://github.com/preactjs/preact-render-to-string/actions/workflows/ci.yml/badge.svg)](https://github.com/preactjs/preact-render-to-string/actions/workflows/ci.yml)\n\nRender JSX and [Preact](https://github.com/preactjs/preact) components to an HTML string.\n\nWorks in Node & the browser, making it useful for universal/isomorphic rendering.\n\n\\>\\> **[Cute Fox-Related Demo](http://codepen.io/developit/pen/dYZqjE?editors=001)** _(@ CodePen)_ <<\n\n---\n\n### Render JSX/VDOM to HTML\n\n```js\nimport { render } from 'preact-render-to-string';\nimport { h } from 'preact';\n/** @jsx h */\n\nlet vdom = <div class=\"foo\">content</div>;\n\nlet html = render(vdom);\nconsole.log(html);\n// <div class=\"foo\">content</div>\n```\n\n### Render Preact Components to HTML\n\n```js\nimport { render } from 'preact-render-to-string';\nimport { h, Component } from 'preact';\n/** @jsx h */\n\n// Classical components work\nclass Fox extends Component {\n\trender({ name }) {\n\t\treturn <span class=\"fox\">{name}</span>;\n\t}\n}\n\n// ... and so do pure functional components:\nconst Box = ({ type, children }) => (\n\t<div class={`box box-${type}`}>{children}</div>\n);\n\nlet html = render(\n\t<Box type=\"open\">\n\t\t<Fox name=\"Finn\" />\n\t</Box>\n);\n\nconsole.log(html);\n// <div class=\"box box-open\"><span class=\"fox\">Finn</span></div>\n```\n\n---\n\n### Render JSX / Preact / Whatever via Express!\n\n```js\nimport express from 'express';\nimport { h } from 'preact';\nimport { render } from 'preact-render-to-string';\n/** @jsx h */\n\n// silly example component:\nconst Fox = ({ name }) => (\n\t<div class=\"fox\">\n\t\t<h5>{name}</h5>\n\t\t<p>This page is all about {name}.</p>\n\t</div>\n);\n\n// basic HTTP server via express:\nconst app = express();\napp.listen(8080);\n\n// on each request, render and return a component:\napp.get('/:fox', (req, res) => {\n\tlet html = render(<Fox name={req.params.fox} />);\n\t// send it back wrapped up as an HTML5 document:\n\tres.send(`<!DOCTYPE html><html><body>${html}</body></html>`);\n});\n```\n\n### Error Boundaries\n\nRendering errors can be caught by Preact via `getDerivedStateFromErrors` or `componentDidCatch`. To enable that feature in `preact-render-to-string` set `errorBoundaries = true`\n\n```js\nimport { options } from 'preact';\n\n// Enable error boundaries in `preact-render-to-string`\noptions.errorBoundaries = true;\n```\n\n---\n\n### `Suspense` & `lazy` components with [`preact/compat`](https://www.npmjs.com/package/preact) & [`preact-ssr-prepass`](https://www.npmjs.com/package/preact-ssr-prepass)\n\n```bash\nnpm install preact preact-render-to-string preact-ssr-prepass\n```\n\n```jsx\nexport default () => {\n\treturn <h1>Home page</h1>;\n};\n```\n\n```jsx\nimport { Suspense, lazy } from 'preact/compat';\n\n// Creation of the lazy component\nconst HomePage = lazy(() => import('./pages/home'));\n\nconst Main = () => {\n\treturn (\n\t\t<Suspense fallback={<p>Loading</p>}>\n\t\t\t<HomePage />\n\t\t</Suspense>\n\t);\n};\n```\n\n```jsx\nimport { render } from 'preact-render-to-string';\nimport prepass from 'preact-ssr-prepass';\nimport { Main } from './main';\n\nconst main = async () => {\n\t// Creation of the virtual DOM\n\tconst vdom = <Main />;\n\n\t// Pre-rendering of lazy components\n\tawait prepass(vdom);\n\n\t// Rendering of components\n\tconst html = render(vdom);\n\n\tconsole.log(html);\n\t// <h1>Home page</h1>\n};\n\n// Execution & error handling\nmain().catch((error) => {\n\tconsole.error(error);\n});\n```\n\n---\n\n### License\n\n[MIT](http://choosealicense.com/licenses/mit/)\n","author":{"name":"Jason Miller","email":"jason@developit.ca"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/developit/preact-render-to-string","repository":{"type":"git","url":"git+https://github.com/developit/preact-render-to-string.git"},"bugs":{"url":"https://github.com/developit/preact-render-to-string/issues"}}
+{
+ "name": "preact-render-to-string",
+ "description": "Render JSX to an HTML string, with support for Preact components.",
+ "dist-tags": {
+ "latest": "6.4.0"
+ },
+ "versions": {
+ "6.4.0": {
+ "name": "preact-render-to-string",
+ "amdName": "preactRenderToString",
+ "version": "6.4.0",
+ "description": "Render JSX to an HTML string, with support for Preact components.",
+ "main": "dist/index.js",
+ "umd:main": "dist/index.umd.js",
+ "module": "dist/index.module.js",
+ "jsnext:main": "dist/index.module.js",
+ "types": "src/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./src/index.d.ts",
+ "browser": "./dist/index.module.js",
+ "umd": "./dist/index.umd.js",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js"
+ },
+ "./jsx": {
+ "types": "./jsx.d.ts",
+ "browser": "./dist/jsx.module.js",
+ "umd": "./dist/jsx.umd.js",
+ "import": "./dist/jsx.mjs",
+ "require": "./dist/jsx.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "bench": "BABEL_ENV=test node -r @babel/register benchmarks index.js",
+ "bench:v8": "BABEL_ENV=test microbundle benchmarks/index.js -f modern --alias benchmarkjs-pretty=benchmarks/lib/benchmark-lite.js --external none --target node --no-compress --no-sourcemap --raw -o benchmarks/.v8.mjs && v8 --module benchmarks/.v8.mjs",
+ "build": "npm run -s transpile && npm run -s transpile:jsx && npm run -s copy-typescript-definition",
+ "postbuild": "node ./config/node-13-exports.js && node ./config/node-commonjs.js && node ./config/node-verify-exports.js",
+ "transpile": "microbundle src/index.js -f es,cjs,umd --target web --external preact",
+ "transpile:jsx": "microbundle src/jsx.js -o dist/jsx.js --target web --external preact && microbundle dist/jsx.js -o dist/jsx.js -f cjs --external preact",
+ "copy-typescript-definition": "copyfiles -f src/*.d.ts dist",
+ "test": "eslint src test && tsc && npm run test:mocha && npm run test:mocha:compat && npm run test:mocha:debug && npm run bench",
+ "test:mocha": "BABEL_ENV=test mocha -r @babel/register -r test/setup.js test/*.test.js",
+ "test:mocha:compat": "BABEL_ENV=test mocha -r @babel/register -r test/setup.js 'test/compat/*.test.js'",
+ "test:mocha:debug": "BABEL_ENV=test mocha -r @babel/register -r test/setup.js 'test/debug/index.test.js'",
+ "format": "prettier src/**/*.{d.ts,js} test/**/*.js --write",
+ "prepublishOnly": "npm run build",
+ "release": "npm run build && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags && npm publish"
+ },
+ "eslintConfig": {
+ "extends": "developit",
+ "rules": {
+ "react/prefer-stateless-function": 0,
+ "react/jsx-no-bind": 0,
+ "react/no-danger": 0,
+ "jest/valid-expect": 0,
+ "new-cap": 0,
+ "curly": "off",
+ "brace-style": "off",
+ "indent": "off"
+ },
+ "settings": {
+ "react": {
+ "version": "16.8"
+ }
+ }
+ },
+ "babel": {
+ "env": {
+ "test": {
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "targets": {
+ "node": true
+ }
+ }
+ ]
+ ],
+ "plugins": [
+ [
+ "@babel/plugin-transform-react-jsx",
+ {
+ "pragma": "h"
+ }
+ ]
+ ]
+ }
+ }
+ },
+ "minify": {
+ "compress": {
+ "reduce_funcs": false
+ }
+ },
+ "author": {
+ "name": "Jason Miller",
+ "email": "jason@developit.ca"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/developit/preact-render-to-string.git"
+ },
+ "bugs": {
+ "url": "https://github.com/developit/preact-render-to-string/issues"
+ },
+ "peerDependencies": {
+ "preact": ">=10"
+ },
+ "devDependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.22.15",
+ "@babel/preset-env": "^7.23.2",
+ "@babel/register": "^7.22.15",
+ "@changesets/changelog-github": "^0.4.1",
+ "@changesets/cli": "^2.18.0",
+ "benchmarkjs-pretty": "^2.0.1",
+ "chai": "^4.3.10",
+ "copyfiles": "^2.4.1",
+ "eslint": "^7.16.0",
+ "eslint-config-developit": "^1.2.0",
+ "husky": "^4.3.6",
+ "lint-staged": "^10.5.3",
+ "microbundle": "^0.15.1",
+ "mocha": "^10.2.0",
+ "baseline-rts": "npm:preact-render-to-string@latest",
+ "preact": "^10.13.0",
+ "prettier": "^2.2.1",
+ "sinon": "^9.2.2",
+ "sinon-chai": "^3.5.0",
+ "typescript": "^5.0.0"
+ },
+ "dependencies": {
+ "pretty-format": "^3.8.0"
+ },
+ "prettier": {
+ "singleQuote": true,
+ "trailingComma": "none",
+ "useTabs": true,
+ "tabWidth": 2
+ },
+ "lint-staged": {
+ "**/*.{js,jsx,ts,tsx,yml}": [
+ "prettier --write"
+ ]
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "gitHead": "797c82fd7a8cb49c2cfd1f5c3f5e94a44b473956",
+ "_id": "preact-render-to-string@6.4.0",
+ "_nodeVersion": "18.15.0",
+ "_npmVersion": "9.5.0",
+ "dist": {
+ "integrity": "sha512-pzDwezZaLbK371OiJjXDsZJwVOALzFX5M1wEh2Kr0pEApq5AV6bRH/DFbA/zNA7Lck/duyREPQLLvzu2G6hEQQ==",
+ "shasum": "03cdd661d35e9ac76bed9f0e37ccceb42cae5fa5",
+ "tarball": "http://localhost:4260/preact-render-to-string/preact-render-to-string-6.4.0.tgz",
+ "fileCount": 37,
+ "unpackedSize": 438403
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Jason Miller",
+ "email": "jason@developit.ca"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/developit/preact-render-to-string",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/developit/preact-render-to-string.git"
+ },
+ "bugs": {
+ "url": "https://github.com/developit/preact-render-to-string/issues"
+ }
+}
diff --git a/tests/registry/npm/preact/registry.json b/tests/registry/npm/preact/registry.json
index c080be609..5adb917ec 100644
--- a/tests/registry/npm/preact/registry.json
+++ b/tests/registry/npm/preact/registry.json
@@ -1 +1,310 @@
-{"name":"preact","description":"Fast 3kb React-compatible Virtual DOM library.","dist-tags":{"latest":"10.19.6"},"versions":{"10.19.6":{"name":"preact","amdName":"preact","version":"10.19.6","private":false,"description":"Fast 3kb React-compatible Virtual DOM library.","main":"dist/preact.js","module":"dist/preact.module.js","umd:main":"dist/preact.umd.js","unpkg":"dist/preact.min.js","source":"src/index.js","exports":{".":{"types":"./src/index.d.ts","browser":"./dist/preact.module.js","umd":"./dist/preact.umd.js","import":"./dist/preact.mjs","require":"./dist/preact.js"},"./compat":{"types":"./compat/src/index.d.ts","browser":"./compat/dist/compat.module.js","umd":"./compat/dist/compat.umd.js","import":"./compat/dist/compat.mjs","require":"./compat/dist/compat.js"},"./debug":{"types":"./debug/src/index.d.ts","browser":"./debug/dist/debug.module.js","umd":"./debug/dist/debug.umd.js","import":"./debug/dist/debug.mjs","require":"./debug/dist/debug.js"},"./devtools":{"types":"./devtools/src/index.d.ts","browser":"./devtools/dist/devtools.module.js","umd":"./devtools/dist/devtools.umd.js","import":"./devtools/dist/devtools.mjs","require":"./devtools/dist/devtools.js"},"./hooks":{"types":"./hooks/src/index.d.ts","browser":"./hooks/dist/hooks.module.js","umd":"./hooks/dist/hooks.umd.js","import":"./hooks/dist/hooks.mjs","require":"./hooks/dist/hooks.js"},"./test-utils":{"types":"./test-utils/src/index.d.ts","browser":"./test-utils/dist/testUtils.module.js","umd":"./test-utils/dist/testUtils.umd.js","import":"./test-utils/dist/testUtils.mjs","require":"./test-utils/dist/testUtils.js"},"./jsx-runtime":{"types":"./jsx-runtime/src/index.d.ts","browser":"./jsx-runtime/dist/jsxRuntime.module.js","umd":"./jsx-runtime/dist/jsxRuntime.umd.js","import":"./jsx-runtime/dist/jsxRuntime.mjs","require":"./jsx-runtime/dist/jsxRuntime.js"},"./jsx-dev-runtime":{"types":"./jsx-runtime/src/index.d.ts","browser":"./jsx-runtime/dist/jsxRuntime.module.js","umd":"./jsx-runtime/dist/jsxRuntime.umd.js","import":"./jsx-runtime/dist/jsxRuntime.mjs","require":"./jsx-runtime/dist/jsxRuntime.js"},"./compat/client":{"import":"./compat/client.mjs","require":"./compat/client.js"},"./compat/server":{"browser":"./compat/server.browser.js","import":"./compat/server.mjs","require":"./compat/server.js"},"./compat/jsx-runtime":{"types":"./jsx-runtime/src/index.d.ts","import":"./compat/jsx-runtime.mjs","require":"./compat/jsx-runtime.js"},"./compat/jsx-dev-runtime":{"types":"./jsx-runtime/src/index.d.ts","import":"./compat/jsx-dev-runtime.mjs","require":"./compat/jsx-dev-runtime.js"},"./compat/scheduler":{"import":"./compat/scheduler.mjs","require":"./compat/scheduler.js"},"./package.json":"./package.json","./compat/package.json":"./compat/package.json","./debug/package.json":"./debug/package.json","./devtools/package.json":"./devtools/package.json","./hooks/package.json":"./hooks/package.json","./test-utils/package.json":"./test-utils/package.json","./jsx-runtime/package.json":"./jsx-runtime/package.json"},"license":"MIT","funding":{"type":"opencollective","url":"https://opencollective.com/preact"},"types":"src/index.d.ts","scripts":{"prepare":"run-s build && check-export-map","build":"npm-run-all --parallel build:*","build:core":"microbundle build --raw --no-generateTypes -f cjs,esm,umd","build:core-min":"microbundle build --raw --no-generateTypes -f cjs,esm,umd,iife src/cjs.js -o dist/preact.min.js","build:debug":"microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd debug","build:devtools":"microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd devtools","build:hooks":"microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd hooks","build:test-utils":"microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd test-utils","build:compat":"microbundle build src/index.js src/scheduler.js --raw --no-generateTypes -f cjs,esm,umd --cwd compat --globals 'preact/hooks=preactHooks'","build:jsx":"microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd jsx-runtime","postbuild":"node ./config/node-13-exports.js && node ./config/compat-entries.js","dev":"microbundle watch --raw --no-generateTypes --format cjs","dev:hooks":"microbundle watch --raw --no-generateTypes --format cjs --cwd hooks","dev:compat":"microbundle watch --raw --no-generateTypes --format cjs --cwd compat --globals 'preact/hooks=preactHooks'","test":"npm-run-all build lint test:unit","test:unit":"run-p test:mocha test:karma:minify test:ts","test:ts":"run-p test:ts:*","test:ts:core":"tsc -p test/ts/ && mocha --require \"@babel/register\" test/ts/**/*-test.js","test:ts:compat":"tsc -p compat/test/ts/","test:mocha":"mocha --recursive --require \"@babel/register\" test/shared test/node","test:mocha:watch":"npm run test:mocha -- --watch","test:karma":"cross-env COVERAGE=true BABEL_NO_MODULES=true karma start karma.conf.js --single-run","test:karma:minify":"cross-env COVERAGE=true MINIFY=true BABEL_NO_MODULES=true karma start karma.conf.js --single-run","test:karma:watch":"cross-env BABEL_NO_MODULES=true karma start karma.conf.js --no-single-run","test:karma:hooks":"cross-env COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=hooks/test/browser/**.js --no-single-run","test:karma:test-utils":"cross-env PERFORMANCE=false COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=test-utils/test/shared/**.js --no-single-run","test:karma:bench":"cross-env PERFORMANCE=true COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=test/benchmarks/**.js --single-run","benchmark":"npm run test:karma:bench -- no-single-run","lint":"run-s eslint tsc","tsc":"tsc -p jsconfig-lint.json","eslint":"eslint src test debug compat hooks test-utils","format":"prettier --write \"**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}\"","format:check":"prettier --check '**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}'"},"eslintConfig":{"extends":["developit","prettier"],"settings":{"react":{"pragma":"createElement"}},"rules":{"camelcase":[1,{"allow":["__test__*","unstable_*","UNSAFE_*"]}],"no-unused-vars":[2,{"args":"none","varsIgnorePattern":"^h|React$"}],"prefer-rest-params":0,"prefer-spread":0,"no-cond-assign":0,"react/jsx-no-bind":0,"react/no-danger":"off","react/prefer-stateless-function":0,"react/sort-comp":0,"jest/valid-expect":0,"jest/no-disabled-tests":0,"jest/no-test-callback":0,"jest/expect-expect":0,"jest/no-standalone-expect":0,"jest/no-export":0,"react/no-find-dom-node":0}},"eslintIgnore":["test/fixtures","test/ts/","*.ts","dist"],"prettier":{"singleQuote":true,"trailingComma":"none","arrowParens":"avoid"},"lint-staged":{"**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}":["prettier --write"]},"husky":{"hooks":{"pre-commit":"lint-staged"}},"authors":["The Preact Authors (https://github.com/preactjs/preact/contributors)"],"repository":{"type":"git","url":"git+https://github.com/preactjs/preact.git"},"bugs":{"url":"https://github.com/preactjs/preact/issues"},"devDependencies":{"@actions/github":"^5.0.0","@actions/glob":"^0.2.0","@babel/core":"^7.7.0","@babel/plugin-proposal-object-rest-spread":"^7.6.2","@babel/plugin-transform-react-jsx":"^7.7.0","@babel/plugin-transform-react-jsx-source":"^7.7.4","@babel/preset-env":"^7.7.1","@babel/register":"^7.7.0","@types/chai":"^4.1.2","@types/mocha":"^5.0.0","@types/node":"^14.14.10","babel-plugin-istanbul":"^6.0.0","babel-plugin-transform-async-to-promises":"^0.8.15","babel-plugin-transform-rename-properties":"0.1.0","benchmark":"^2.1.4","chai":"^4.1.2","check-export-map":"^1.3.0","coveralls":"^3.0.0","cross-env":"^7.0.2","diff":"^5.0.0","errorstacks":"^2.4.0","esbuild":"^0.14.50","eslint":"5.15.1","eslint-config-developit":"^1.1.1","eslint-config-prettier":"^6.5.0","eslint-plugin-react":"7.12.4","husky":"^4.3.0","karma":"^6.3.16","karma-chai-sinon":"^0.1.5","karma-chrome-launcher":"^3.1.0","karma-coverage":"^2.1.0","karma-esbuild":"^2.2.4","karma-mocha":"^2.0.1","karma-mocha-reporter":"^2.2.5","karma-sauce-launcher":"^4.3.4","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","kolorist":"^1.2.10","lint-staged":"^10.5.2","lodash":"^4.17.20","microbundle":"^0.15.1","mocha":"^8.2.1","npm-merge-driver-install":"^1.1.1","npm-run-all":"^4.0.0","preact-render-to-string":"^5.2.5","prettier":"^2.8.6","prop-types":"^15.7.2","sade":"^1.7.4","sinon":"^9.2.3","sinon-chai":"^3.5.0","typescript":"^4.9.5","undici":"^4.12.0"},"overrides":{"webdriverio":"7.30.2"},"volta":{"node":"20.9.0"},"_id":"preact@10.19.6","_integrity":"sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==","_resolved":"/Users/jovi/Documents/SideProjects/preact/preact-10.19.6.tgz","_from":"file:preact-10.19.6.tgz","_nodeVersion":"18.15.0","_npmVersion":"9.5.0","dist":{"integrity":"sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==","shasum":"66007b67aad4d11899f583df1b0116d94a89b8f5","tarball":"http://localhost:4260/preact/preact-10.19.6.tgz","fileCount":131,"unpackedSize":1370954,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDh1diBOzydVPt9VeQt4EOfIOOPJu7BkY12zPdurgT9zgIgfuNN2AnNgP+o3Vg9jfoa1JFpRCWardIoyTYqKPKUegY="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<p align=\"center\">\n<a href=\"https://preactjs.com\" target=\"_blank\">\n\n![Preact](https://raw.githubusercontent.com/preactjs/preact/8b0bcc927995c188eca83cba30fbc83491cc0b2f/logo.svg?sanitize=true 'Preact')\n\n</a>\n</p>\n<p align=\"center\">Fast <b>3kB</b> alternative to React with the same modern API.</p>\n\n**All the power of Virtual DOM components, without the overhead:**\n\n- Familiar React API & patterns: ES6 Class, hooks, and Functional Components\n- Extensive React compatibility via a simple [preact/compat] alias\n- Everything you need: JSX, <abbr title=\"Virtual DOM\">VDOM</abbr>, [DevTools], <abbr title=\"Hot Module Replacement\">HMR</abbr>, <abbr title=\"Server-Side Rendering\">SSR</abbr>.\n- Highly optimized diff algorithm and seamless hydration from Server Side Rendering\n- Supports all modern browsers and IE11\n- Transparent asynchronous rendering with a pluggable scheduler\n\n### 💁 More information at the [Preact Website ➞](https://preactjs.com)\n\n<table border=\"0\">\n<tbody>\n<tr>\n<td>\n\n[![npm](https://img.shields.io/npm/v/preact.svg)](http://npm.im/preact)\n[![Preact Slack Community](https://img.shields.io/badge/Slack%20Community-preact.slack.com-blue)](https://chat.preactjs.com)\n[![OpenCollective Backers](https://opencollective.com/preact/backers/badge.svg)](#backers)\n[![OpenCollective Sponsors](https://opencollective.com/preact/sponsors/badge.svg)](#sponsors)\n\n[![coveralls](https://img.shields.io/coveralls/preactjs/preact/main.svg)](https://coveralls.io/github/preactjs/preact)\n[![gzip size](http://img.badgesize.io/https://unpkg.com/preact/dist/preact.min.js?compression=gzip&label=gzip)](https://unpkg.com/preact/dist/preact.min.js)\n[![brotli size](http://img.badgesize.io/https://unpkg.com/preact/dist/preact.min.js?compression=brotli&label=brotli)](https://unpkg.com/preact/dist/preact.min.js)\n\n</td>\n<td>\n\n<img src=\"https://saucelabs.com/browser-matrix/preact.svg\" title=\"Browser support matrix\">\n\n</td>\n</tr>\n</tbody>\n</table>\n\nYou can find some awesome libraries in the [awesome-preact list](https://github.com/preactjs/awesome-preact) :sunglasses:\n\n---\n\n## Getting Started\n\n> 💁 _**Note:** You [don't need ES2015 to use Preact](https://github.com/developit/preact-in-es3)... but give it a try!_\n\n#### Tutorial: Building UI with Preact\n\nWith Preact, you create user interfaces by assembling trees of components and elements. Components are functions or classes that return a description of what their tree should output. These descriptions are typically written in [JSX](https://facebook.github.io/jsx/) (shown underneath), or [HTM](https://github.com/developit/htm) which leverages standard JavaScript Tagged Templates. Both syntaxes can express trees of elements with \"props\" (similar to HTML attributes) and children.\n\nTo get started using Preact, first look at the render() function. This function accepts a tree description and creates the structure described. Next, it appends this structure to a parent DOM element provided as the second argument. Future calls to render() will reuse the existing tree and update it in-place in the DOM. Internally, render() will calculate the difference from previous outputted structures in an attempt to perform as few DOM operations as possible.\n\n```js\nimport { h, render } from 'preact';\n// Tells babel to use h for JSX. It's better to configure this globally.\n// See https://babeljs.io/docs/en/babel-plugin-transform-react-jsx#usage\n// In tsconfig you can specify this with the jsxFactory\n/** @jsx h */\n\n// create our tree and append it to document.body:\nrender(\n\t<main>\n\t\t<h1>Hello</h1>\n\t</main>,\n\tdocument.body\n);\n\n// update the tree in-place:\nrender(\n\t<main>\n\t\t<h1>Hello World!</h1>\n\t</main>,\n\tdocument.body\n);\n// ^ this second invocation of render(...) will use a single DOM call to update the text of the <h1>\n```\n\nHooray! render() has taken our structure and output a User Interface! This approach demonstrates a simple case, but would be difficult to use as an application grows in complexity. Each change would be forced to calculate the difference between the current and updated structure for the entire application. Components can help here – by dividing the User Interface into nested Components each can calculate their difference from their mounted point. Here's an example:\n\n```js\nimport { render, h } from 'preact';\nimport { useState } from 'preact/hooks';\n\n/** @jsx h */\n\nconst App = () => {\n\tconst [input, setInput] = useState('');\n\n\treturn (\n\t\t<div>\n\t\t\t<p>Do you agree to the statement: \"Preact is awesome\"?</p>\n\t\t\t<input value={input} onInput={e => setInput(e.target.value)} />\n\t\t</div>\n\t);\n};\n\nrender(<App />, document.body);\n```\n\n---\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/preact#sponsor)]\n\n<a href=\"https://opencollective.com/preact/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/4/avatar.svg\"></a>\n<a href=\"https://snyk.co/preact\" target=\"_blank\"><img src=\"https://res.cloudinary.com/snyk/image/upload/snyk-marketingui/brand-logos/wordmark-logo-color.svg\" width=\"192\" height=\"64\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/15/avatar.svg\"></a>\n<a href=\"https://github.com/guardian\" target=\"_blank\"> &nbsp; &nbsp; &nbsp; <img src=\"https://github.com/guardian.png\" width=\"64\" height=\"64\"> &nbsp; &nbsp; &nbsp; </a>\n<a href=\"https://opencollective.com/preact/sponsor/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/sponsor/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/sponsor/29/avatar.svg\"></a>\n\n## Backers\n\nSupport us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/preact#backer)]\n\n<a href=\"https://opencollective.com/preact/backer/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/preact/backer/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/preact/backer/29/avatar.svg\"></a>\n\n---\n\n## License\n\nMIT\n\n[![Preact](https://i.imgur.com/YqCHvEW.gif)](https://preactjs.com)\n\n[preact/compat]: https://github.com/preactjs/preact/tree/main/compat\n[hyperscript]: https://github.com/dominictarr/hyperscript\n[DevTools]: https://github.com/preactjs/preact-devtools\n","homepage":"https://preactjs.com","repository":{"type":"git","url":"git+https://github.com/preactjs/preact.git"},"bugs":{"url":"https://github.com/preactjs/preact/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "preact",
+ "description": "Fast 3kb React-compatible Virtual DOM library.",
+ "dist-tags": {
+ "latest": "10.19.6"
+ },
+ "versions": {
+ "10.19.6": {
+ "name": "preact",
+ "amdName": "preact",
+ "version": "10.19.6",
+ "private": false,
+ "description": "Fast 3kb React-compatible Virtual DOM library.",
+ "main": "dist/preact.js",
+ "module": "dist/preact.module.js",
+ "umd:main": "dist/preact.umd.js",
+ "unpkg": "dist/preact.min.js",
+ "source": "src/index.js",
+ "exports": {
+ ".": {
+ "types": "./src/index.d.ts",
+ "browser": "./dist/preact.module.js",
+ "umd": "./dist/preact.umd.js",
+ "import": "./dist/preact.mjs",
+ "require": "./dist/preact.js"
+ },
+ "./compat": {
+ "types": "./compat/src/index.d.ts",
+ "browser": "./compat/dist/compat.module.js",
+ "umd": "./compat/dist/compat.umd.js",
+ "import": "./compat/dist/compat.mjs",
+ "require": "./compat/dist/compat.js"
+ },
+ "./debug": {
+ "types": "./debug/src/index.d.ts",
+ "browser": "./debug/dist/debug.module.js",
+ "umd": "./debug/dist/debug.umd.js",
+ "import": "./debug/dist/debug.mjs",
+ "require": "./debug/dist/debug.js"
+ },
+ "./devtools": {
+ "types": "./devtools/src/index.d.ts",
+ "browser": "./devtools/dist/devtools.module.js",
+ "umd": "./devtools/dist/devtools.umd.js",
+ "import": "./devtools/dist/devtools.mjs",
+ "require": "./devtools/dist/devtools.js"
+ },
+ "./hooks": {
+ "types": "./hooks/src/index.d.ts",
+ "browser": "./hooks/dist/hooks.module.js",
+ "umd": "./hooks/dist/hooks.umd.js",
+ "import": "./hooks/dist/hooks.mjs",
+ "require": "./hooks/dist/hooks.js"
+ },
+ "./test-utils": {
+ "types": "./test-utils/src/index.d.ts",
+ "browser": "./test-utils/dist/testUtils.module.js",
+ "umd": "./test-utils/dist/testUtils.umd.js",
+ "import": "./test-utils/dist/testUtils.mjs",
+ "require": "./test-utils/dist/testUtils.js"
+ },
+ "./jsx-runtime": {
+ "types": "./jsx-runtime/src/index.d.ts",
+ "browser": "./jsx-runtime/dist/jsxRuntime.module.js",
+ "umd": "./jsx-runtime/dist/jsxRuntime.umd.js",
+ "import": "./jsx-runtime/dist/jsxRuntime.mjs",
+ "require": "./jsx-runtime/dist/jsxRuntime.js"
+ },
+ "./jsx-dev-runtime": {
+ "types": "./jsx-runtime/src/index.d.ts",
+ "browser": "./jsx-runtime/dist/jsxRuntime.module.js",
+ "umd": "./jsx-runtime/dist/jsxRuntime.umd.js",
+ "import": "./jsx-runtime/dist/jsxRuntime.mjs",
+ "require": "./jsx-runtime/dist/jsxRuntime.js"
+ },
+ "./compat/client": {
+ "import": "./compat/client.mjs",
+ "require": "./compat/client.js"
+ },
+ "./compat/server": {
+ "browser": "./compat/server.browser.js",
+ "import": "./compat/server.mjs",
+ "require": "./compat/server.js"
+ },
+ "./compat/jsx-runtime": {
+ "types": "./jsx-runtime/src/index.d.ts",
+ "import": "./compat/jsx-runtime.mjs",
+ "require": "./compat/jsx-runtime.js"
+ },
+ "./compat/jsx-dev-runtime": {
+ "types": "./jsx-runtime/src/index.d.ts",
+ "import": "./compat/jsx-dev-runtime.mjs",
+ "require": "./compat/jsx-dev-runtime.js"
+ },
+ "./compat/scheduler": {
+ "import": "./compat/scheduler.mjs",
+ "require": "./compat/scheduler.js"
+ },
+ "./package.json": "./package.json",
+ "./compat/package.json": "./compat/package.json",
+ "./debug/package.json": "./debug/package.json",
+ "./devtools/package.json": "./devtools/package.json",
+ "./hooks/package.json": "./hooks/package.json",
+ "./test-utils/package.json": "./test-utils/package.json",
+ "./jsx-runtime/package.json": "./jsx-runtime/package.json"
+ },
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ },
+ "types": "src/index.d.ts",
+ "scripts": {
+ "prepare": "run-s build && check-export-map",
+ "build": "npm-run-all --parallel build:*",
+ "build:core": "microbundle build --raw --no-generateTypes -f cjs,esm,umd",
+ "build:core-min": "microbundle build --raw --no-generateTypes -f cjs,esm,umd,iife src/cjs.js -o dist/preact.min.js",
+ "build:debug": "microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd debug",
+ "build:devtools": "microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd devtools",
+ "build:hooks": "microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd hooks",
+ "build:test-utils": "microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd test-utils",
+ "build:compat": "microbundle build src/index.js src/scheduler.js --raw --no-generateTypes -f cjs,esm,umd --cwd compat --globals 'preact/hooks=preactHooks'",
+ "build:jsx": "microbundle build --raw --no-generateTypes -f cjs,esm,umd --cwd jsx-runtime",
+ "postbuild": "node ./config/node-13-exports.js && node ./config/compat-entries.js",
+ "dev": "microbundle watch --raw --no-generateTypes --format cjs",
+ "dev:hooks": "microbundle watch --raw --no-generateTypes --format cjs --cwd hooks",
+ "dev:compat": "microbundle watch --raw --no-generateTypes --format cjs --cwd compat --globals 'preact/hooks=preactHooks'",
+ "test": "npm-run-all build lint test:unit",
+ "test:unit": "run-p test:mocha test:karma:minify test:ts",
+ "test:ts": "run-p test:ts:*",
+ "test:ts:core": "tsc -p test/ts/ && mocha --require \"@babel/register\" test/ts/**/*-test.js",
+ "test:ts:compat": "tsc -p compat/test/ts/",
+ "test:mocha": "mocha --recursive --require \"@babel/register\" test/shared test/node",
+ "test:mocha:watch": "npm run test:mocha -- --watch",
+ "test:karma": "cross-env COVERAGE=true BABEL_NO_MODULES=true karma start karma.conf.js --single-run",
+ "test:karma:minify": "cross-env COVERAGE=true MINIFY=true BABEL_NO_MODULES=true karma start karma.conf.js --single-run",
+ "test:karma:watch": "cross-env BABEL_NO_MODULES=true karma start karma.conf.js --no-single-run",
+ "test:karma:hooks": "cross-env COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=hooks/test/browser/**.js --no-single-run",
+ "test:karma:test-utils": "cross-env PERFORMANCE=false COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=test-utils/test/shared/**.js --no-single-run",
+ "test:karma:bench": "cross-env PERFORMANCE=true COVERAGE=false BABEL_NO_MODULES=true karma start karma.conf.js --grep=test/benchmarks/**.js --single-run",
+ "benchmark": "npm run test:karma:bench -- no-single-run",
+ "lint": "run-s eslint tsc",
+ "tsc": "tsc -p jsconfig-lint.json",
+ "eslint": "eslint src test debug compat hooks test-utils",
+ "format": "prettier --write \"**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}\"",
+ "format:check": "prettier --check '**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}'"
+ },
+ "eslintConfig": {
+ "extends": [
+ "developit",
+ "prettier"
+ ],
+ "settings": {
+ "react": {
+ "pragma": "createElement"
+ }
+ },
+ "rules": {
+ "camelcase": [
+ 1,
+ {
+ "allow": [
+ "__test__*",
+ "unstable_*",
+ "UNSAFE_*"
+ ]
+ }
+ ],
+ "no-unused-vars": [
+ 2,
+ {
+ "args": "none",
+ "varsIgnorePattern": "^h|React$"
+ }
+ ],
+ "prefer-rest-params": 0,
+ "prefer-spread": 0,
+ "no-cond-assign": 0,
+ "react/jsx-no-bind": 0,
+ "react/no-danger": "off",
+ "react/prefer-stateless-function": 0,
+ "react/sort-comp": 0,
+ "jest/valid-expect": 0,
+ "jest/no-disabled-tests": 0,
+ "jest/no-test-callback": 0,
+ "jest/expect-expect": 0,
+ "jest/no-standalone-expect": 0,
+ "jest/no-export": 0,
+ "react/no-find-dom-node": 0
+ }
+ },
+ "eslintIgnore": [
+ "test/fixtures",
+ "test/ts/",
+ "*.ts",
+ "dist"
+ ],
+ "prettier": {
+ "singleQuote": true,
+ "trailingComma": "none",
+ "arrowParens": "avoid"
+ },
+ "lint-staged": {
+ "**/*.{js,jsx,mjs,cjs,ts,tsx,yml,json,html,md,css,scss}": [
+ "prettier --write"
+ ]
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "authors": [
+ "The Preact Authors (https://github.com/preactjs/preact/contributors)"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/preactjs/preact.git"
+ },
+ "bugs": {
+ "url": "https://github.com/preactjs/preact/issues"
+ },
+ "devDependencies": {
+ "@actions/github": "^5.0.0",
+ "@actions/glob": "^0.2.0",
+ "@babel/core": "^7.7.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
+ "@babel/plugin-transform-react-jsx": "^7.7.0",
+ "@babel/plugin-transform-react-jsx-source": "^7.7.4",
+ "@babel/preset-env": "^7.7.1",
+ "@babel/register": "^7.7.0",
+ "@types/chai": "^4.1.2",
+ "@types/mocha": "^5.0.0",
+ "@types/node": "^14.14.10",
+ "babel-plugin-istanbul": "^6.0.0",
+ "babel-plugin-transform-async-to-promises": "^0.8.15",
+ "babel-plugin-transform-rename-properties": "0.1.0",
+ "benchmark": "^2.1.4",
+ "chai": "^4.1.2",
+ "check-export-map": "^1.3.0",
+ "coveralls": "^3.0.0",
+ "cross-env": "^7.0.2",
+ "diff": "^5.0.0",
+ "errorstacks": "^2.4.0",
+ "esbuild": "^0.14.50",
+ "eslint": "5.15.1",
+ "eslint-config-developit": "^1.1.1",
+ "eslint-config-prettier": "^6.5.0",
+ "eslint-plugin-react": "7.12.4",
+ "husky": "^4.3.0",
+ "karma": "^6.3.16",
+ "karma-chai-sinon": "^0.1.5",
+ "karma-chrome-launcher": "^3.1.0",
+ "karma-coverage": "^2.1.0",
+ "karma-esbuild": "^2.2.4",
+ "karma-mocha": "^2.0.1",
+ "karma-mocha-reporter": "^2.2.5",
+ "karma-sauce-launcher": "^4.3.4",
+ "karma-sinon": "^1.0.5",
+ "karma-sourcemap-loader": "^0.3.7",
+ "kolorist": "^1.2.10",
+ "lint-staged": "^10.5.2",
+ "lodash": "^4.17.20",
+ "microbundle": "^0.15.1",
+ "mocha": "^8.2.1",
+ "npm-merge-driver-install": "^1.1.1",
+ "npm-run-all": "^4.0.0",
+ "preact-render-to-string": "^5.2.5",
+ "prettier": "^2.8.6",
+ "prop-types": "^15.7.2",
+ "sade": "^1.7.4",
+ "sinon": "^9.2.3",
+ "sinon-chai": "^3.5.0",
+ "typescript": "^4.9.5",
+ "undici": "^4.12.0"
+ },
+ "overrides": {
+ "webdriverio": "7.30.2"
+ },
+ "volta": {
+ "node": "20.9.0"
+ },
+ "_id": "preact@10.19.6",
+ "_integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==",
+ "_resolved": "/Users/jovi/Documents/SideProjects/preact/preact-10.19.6.tgz",
+ "_from": "file:preact-10.19.6.tgz",
+ "_nodeVersion": "18.15.0",
+ "_npmVersion": "9.5.0",
+ "dist": {
+ "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==",
+ "shasum": "66007b67aad4d11899f583df1b0116d94a89b8f5",
+ "tarball": "http://localhost:4260/preact/preact-10.19.6.tgz",
+ "fileCount": 131,
+ "unpackedSize": 1370954
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://preactjs.com",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/preactjs/preact.git"
+ },
+ "bugs": {
+ "url": "https://github.com/preactjs/preact/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/pretty-format/registry.json b/tests/registry/npm/pretty-format/registry.json
index a224b0a14..27a6f83d6 100644
--- a/tests/registry/npm/pretty-format/registry.json
+++ b/tests/registry/npm/pretty-format/registry.json
@@ -1 +1,68 @@
-{"name":"pretty-format","description":"Stringify any JavaScript value.","dist-tags":{"latest":"3.8.0"},"versions":{"3.8.0":{"name":"pretty-format","version":"3.8.0","description":"Stringify any JavaScript value.","license":"MIT","main":"index.js","author":{"name":"James Kyle","email":"me@thejameskyle.com"},"repository":{"type":"git","url":"git+https://github.com/thejameskyle/pretty-format.git"},"bugs":{"url":"https://github.com/thejameskyle/pretty-format/issues"},"scripts":{"test":"jest","perf":"node perf/test.js"},"jest":{"testEnvironment":"node","verbose":true},"devDependencies":{"chalk":"^1.1.3","jest":"^15.1.1","left-pad":"^1.1.1","react":"15.3.0"},"gitHead":"556f97f5ba896f15bf8e07e191636d31828f63a8","_id":"pretty-format@3.8.0","_shasum":"bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.12.0","dist":{"shasum":"bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385","tarball":"http://localhost:4260/pretty-format/pretty-format-3.8.0.tgz","integrity":"sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKlYEJdj9xJ42shTyj1xLJPtlxl86Orhd+3IFzXGNAHAiB5446kTOhc9tundS9ZoqzhyxjBFpHKD7hFpaCmaVfrAA=="}]},"directories":{}}},"readme":"","repository":{"type":"git","url":"git+https://github.com/jestjs/jest.git","directory":"packages/pretty-format"},"author":{"name":"James Kyle","email":"me@thejameskyle.com"},"license":"MIT","readmeFilename":"","homepage":"https://github.com/jestjs/jest#readme","bugs":{"url":"https://github.com/jestjs/jest/issues"}}
+{
+ "name": "pretty-format",
+ "description": "Stringify any JavaScript value.",
+ "dist-tags": {
+ "latest": "3.8.0"
+ },
+ "versions": {
+ "3.8.0": {
+ "name": "pretty-format",
+ "version": "3.8.0",
+ "description": "Stringify any JavaScript value.",
+ "license": "MIT",
+ "main": "index.js",
+ "author": {
+ "name": "James Kyle",
+ "email": "me@thejameskyle.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/thejameskyle/pretty-format.git"
+ },
+ "bugs": {
+ "url": "https://github.com/thejameskyle/pretty-format/issues"
+ },
+ "scripts": {
+ "test": "jest",
+ "perf": "node perf/test.js"
+ },
+ "jest": {
+ "testEnvironment": "node",
+ "verbose": true
+ },
+ "devDependencies": {
+ "chalk": "^1.1.3",
+ "jest": "^15.1.1",
+ "left-pad": "^1.1.1",
+ "react": "15.3.0"
+ },
+ "gitHead": "556f97f5ba896f15bf8e07e191636d31828f63a8",
+ "_id": "pretty-format@3.8.0",
+ "_shasum": "bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385",
+ "_from": ".",
+ "_npmVersion": "3.8.6",
+ "_nodeVersion": "5.12.0",
+ "dist": {
+ "shasum": "bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385",
+ "tarball": "http://localhost:4260/pretty-format/pretty-format-3.8.0.tgz",
+ "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+ },
+ "directories": {}
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jestjs/jest.git",
+ "directory": "packages/pretty-format"
+ },
+ "author": {
+ "name": "James Kyle",
+ "email": "me@thejameskyle.com"
+ },
+ "license": "MIT",
+ "readmeFilename": "",
+ "homepage": "https://github.com/jestjs/jest#readme",
+ "bugs": {
+ "url": "https://github.com/jestjs/jest/issues"
+ }
+}
diff --git a/tests/registry/npm/proc-log/registry.json b/tests/registry/npm/proc-log/registry.json
index 48775c9f1..07bdfb213 100644
--- a/tests/registry/npm/proc-log/registry.json
+++ b/tests/registry/npm/proc-log/registry.json
@@ -1 +1,145 @@
-{"name":"proc-log","description":"just emit 'log' events on the process object","dist-tags":{"latest":"4.2.0"},"versions":{"3.0.0":{"name":"proc-log","version":"3.0.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"proc-log@3.0.0","bugs":{"url":"https://github.com/npm/proc-log/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8","tarball":"http://localhost:4260/proc-log/proc-log-3.0.0.tgz","fileCount":4,"integrity":"sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==","signatures":[{"sig":"MEUCIHifbHgF6M3IpbNVu8XNpsbTUeNJM3qIs5XF1g0YLliHAiEAuptlCUzpR9akldhsbgMLMxeuPC7hOWXL8fkpJ1WgP7E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":5215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjSPI6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjPQ//UPSrpMvLqry94iJkulfi5zOWvurCtHjX2ttnkkZ/s0H+SigN\r\nvOe8PQcIacbmrBqYSydLuM4XBf3vUErBZXjwegNzTY28q0kNL6JMZink/28e\r\nAaKu2EY50BfKG/yB+StonfnfXiv9XGqtIvdqoVF0yMKbwghjVUNfLb3mjx4+\r\n4D3S3obKZPksS1up5yLCMyMOiz3h5W30M05Ipyyp0IHTVc4NQB7zpVN/fVrt\r\nRBt/Z0aml3JPe+A2tKq8rtIFegVsuyp8oDT/xGugZRNI7cuK3bLTQxQXZvJW\r\neusL/Q/TzuyieN35bZuzrdzk0Ofs7Sx4LUEcbwv2AbBOhUdSZHM71gXe4GHq\r\nP+5qLsmZEoQ/dDbaQ/mYst/bYlvb36Avt0naN+SizCBrS7AuNErb+vW6Lud6\r\nnNF4q0iT0IBERbMAKqMUfAoriTidLInRwHL+YA7Zd4Plw9djUqWF2X3L7q1z\r\n/kwvinhV6tP04LpOlnKOlB5eUD8yyWF5WN0vJPRJu5TseUMOAdSEQ0/qlwRh\r\nA32FMskN+dBEHy6mDa5fJfMkXA8/lARwdyHKq/PvNbQCJCL5FU6WhPgk3heK\r\n94sOQbe4zwx6VHJ1InfFRElXW/MsmN+S4sQnUhbQVHOQp+04h38e54IqqcwF\r\nQbFZXz2zcDVctGitwZjS6dIuinKsLDuXivk=\r\n=QR6L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"a3318aac6541572d897f404c1db7d905016c5cfe","scripts":{"lint":"eslint \"**/*.js\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","postsnap":"eslint index.js test/*.js --fix","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/proc-log.git","type":"git"},"_npmVersion":"8.19.2","description":"just emit 'log' events on the process object","directories":{},"templateOSS":{"version":"4.5.1","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"18.10.0","_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.1","@npmcli/template-oss":"4.5.1","@npmcli/eslint-config":"^3.0.1"}},"4.2.0":{"name":"proc-log","version":"4.2.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"proc-log@4.2.0","bugs":{"url":"https://github.com/npm/proc-log/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"b6f461e4026e75fdfe228b265e9f7a00779d7034","tarball":"http://localhost:4260/proc-log/proc-log-4.2.0.tgz","fileCount":4,"integrity":"sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==","signatures":[{"sig":"MEUCIQCNStNROA4yNJ9PelPPE2Zu/qXkWLycFqs2cUlUrvGcfQIgQloGakWeTeBxeHy8tAlNpXjvlDF+X8/oZk7PB1DfNrQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/proc-log@4.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12261},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"953e6035670f9afe2ec93f6286d76db2828854d6","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","postsnap":"eslint index.js test/*.js --fix","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/proc-log.git","type":"git"},"_npmVersion":"10.5.2","description":"just emit 'log' events on the process object","directories":{},"templateOSS":{"publish":true,"version":"4.21.3","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"20.12.1","_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.1","@npmcli/template-oss":"4.21.3","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/proc-log.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/proc-log#readme","bugs":{"url":"https://github.com/npm/proc-log/issues"},"readme":"# proc-log\n\nEmits events on the process object which a listener can consume and print to the terminal or log file.\n\nThis is used by various modules within the npm CLI stack in order to send log events that can be consumed by a listener on the process object.\n\nCurrently emits `log`, `output`, `input`, and `time` events.\n\n## API\n\n```js\nconst { log, output, input, time } = require('proc-log')\n```\n\n#### output\n* `output.standard(...args)` calls `process.emit('output', 'standard', ...args)`\n \n This is for general standard output. Consumers will typically show this on stdout (after optionally formatting or filtering it).\n\n* `output.error(...args)` calls `process.emit('output', 'error', ...args)`\n \n This is for general error output. Consumers will typically show this on stderr (after optionally formatting or filtering it).\n\n* `output.buffer(...args)` calls `process.emit('output', 'buffer', ...args)`\n \n This is for buffered output. Consumers will typically buffer this until they are ready to display.\n\n* `output.flush(...args)` calls `process.emit('output', 'flush', ...args)`\n \n This is to indicate that the output buffer should be flushed.\n\n* `output.LEVELS` an array of strings of all output method names\n\n#### log\n* `log.error(...args)` calls `process.emit('log', 'error', ...args)`\n \n The highest log level. For printing extremely serious errors that indicate something went wrong.\n\n* `log.warn(...args)` calls `process.emit('log', 'warn', ...args)`\n \n A fairly high log level. Things that the user needs to be aware of, but which won't necessarily cause improper functioning of the system.\n\n* `log.notice(...args)` calls `process.emit('log', 'notice', ...args)`\n \n Notices which are important, but not necessarily dangerous or a cause for excess concern.\n\n* `log.info(...args)` calls `process.emit('log', 'info', ...args)`\n \n Informative messages that may benefit the user, but aren't particularly important.\n\n* `log.verbose(...args)` calls `process.emit('log', 'verbose', ...args)`\n \n Noisy output that is more detail that most users will care about.\n\n* `log.silly(...args)` calls `process.emit('log', 'silly', ...args)`\n \n Extremely noisy excessive logging messages that are typically only useful for debugging.\n\n* `log.http(...args)` calls `process.emit('log', 'http', ...args)`\n \n Information about HTTP requests made and/or completed.\n\n* `log.timing(...args)` calls `process.emit('log', 'timing', ...args)`\n \n Timing information.\n\n* `log.pause()` calls `process.emit('log', 'pause')`\n \n Used to tell the consumer to stop printing messages.\n\n* `log.resume()` calls `process.emit('log', 'resume')`\n \n Used to tell the consumer that it is ok to print messages again.\n\n* `log.LEVELS` an array of strings of all log method names\n\n#### input\n\n* `input.start(fn?)` calls `process.emit('input', 'start')`\n\n Used to tell the consumer that the terminal is going to begin reading user input. Returns a function that will call `input.end()` for convenience.\n \n This also takes an optional callback which will run `input.end()` on its completion. If the callback returns a `Promise` then `input.end()` will be run during `finally()`.\n\n* `input.end()` calls `process.emit('input', 'end')`\n\n Used to tell the consumer that the terminal has stopped reading user input.\n\n* `input.read(...args): Promise` calls `process.emit('input', 'read', resolve, reject, ...args)`\n\n Used to tell the consumer that the terminal is reading user input and returns a `Promise` that the producer can `await` until the consumer has finished its async action.\n \n This emits `resolve` and `reject` functions (in addition to all passed in arguments) which the consumer must use to resolve the returned `Promise`.\n\n#### time\n\n* `time.start(timerName, fn?)` calls `process.emit('time', 'start', 'timerName')`\n\n Used to start a timer with the specified name. Returns a function that will call `time.end()` for convenience.\n \n This also takes an optional callback which will run `time.end()` on its completion. If the callback returns a `Promise` then `time.end()` will be run during `finally()`.\n\n* `time.end(timerName)` calls `process.emit('time', 'end', timeName)`\n\n Used to tell the consumer to stop a timer with the specified name.\n\n## Examples\n\n### log\n\nEvery `log` method calls `process.emit('log', level, ...otherArgs)` internally. So in order to consume those events you need to do `process.on('log', fn)`.\n\n#### Colorize based on level\n\nHere's an example of how to consume `proc-log` log events and colorize them based on level:\n\n```js\nconst chalk = require('chalk')\n\nprocess.on('log', (level, ...args) => {\n if (level === 'error') {\n console.log(chalk.red(level), ...args)\n } else {\n console.log(chalk.blue(level), ...args)\n }\n})\n```\n\n#### Pause and resume\n\n`log.pause` and `log.resume` are included so you have the ability to tell your consumer that you want to pause or resume your display of logs. In the npm CLI we use this to buffer all logs on init until we know the correct loglevel to display. But we also setup a second handler that writes everything to a file even if paused.\n\n```js\nlet paused = true\nconst buffer = []\n\n// this handler will buffer and replay logs only after `procLog.resume()` is called\nprocess.on('log', (level, ...args) => {\n if (level === 'resume') {\n buffer.forEach((item) => console.log(...item))\n paused = false\n return\n } \n\n if (paused) {\n buffer.push([level, ...args])\n } else {\n console.log(level, ...args)\n }\n})\n\n// this handler will write everything to a file\nprocess.on('log', (...args) => {\n fs.appendFileSync('debug.log', args.join(' '))\n})\n```\n\n### input\n\n### `start` and `end`\n\n**producer.js**\n```js\nconst { output, input } = require('proc-log')\nconst { readFromUserInput } = require('./my-read')\n\n// Using callback passed to `start`\ntry {\n const res = await input.start(\n readFromUserInput({ prompt: 'OK?', default: 'y' })\n )\n output.standard(`User said ${res}`)\n} catch (err) {\n output.error(`User cancelled: ${err}`)\n}\n\n// Manually calling `start` and `end`\ntry {\n input.start()\n const res = await readFromUserInput({ prompt: 'OK?', default: 'y' })\n output.standard(`User said ${res}`)\n} catch (err) {\n output.error(`User cancelled: ${err}`)\n} finally {\n input.end()\n}\n```\n\n**consumer.js**\n```js\nconst { read } = require('read')\n\nprocess.on('input', (level) => {\n if (level === 'start') {\n // Hide UI to make room for user input being read\n } else if (level === 'end') {\n // Restore UI now that reading is ended\n }\n})\n```\n\n### Using `read` to call `read()`\n\n**producer.js**\n```js\nconst { output, input } = require('proc-log')\n\ntry {\n const res = await input.read({ prompt: 'OK?', default: 'y' })\n output.standard(`User said ${res}`)\n} catch (err) {\n output.error(`User cancelled: ${err}`)\n}\n```\n\n**consumer.js**\n```js\nconst { read } = require('read')\n\nprocess.on('input', (level, ...args) => {\n if (level === 'read') {\n const [res, rej, opts] = args\n read(opts).then(res).catch(rej)\n }\n})\n```","readmeFilename":"README.md"}
+{
+ "name": "proc-log",
+ "description": "just emit 'log' events on the process object",
+ "dist-tags": {
+ "latest": "4.2.0"
+ },
+ "versions": {
+ "3.0.0": {
+ "name": "proc-log",
+ "version": "3.0.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "proc-log@3.0.0",
+ "bugs": {
+ "url": "https://github.com/npm/proc-log/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8",
+ "tarball": "http://localhost:4260/proc-log/proc-log-3.0.0.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+ "unpackedSize": 5215
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "a3318aac6541572d897f404c1db7d905016c5cfe",
+ "scripts": {
+ "lint": "eslint \"**/*.js\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "postsnap": "eslint index.js test/*.js --fix",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/proc-log.git",
+ "type": "git"
+ },
+ "_npmVersion": "8.19.2",
+ "description": "just emit 'log' events on the process object",
+ "directories": {},
+ "templateOSS": {
+ "version": "4.5.1",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "18.10.0",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.1",
+ "@npmcli/template-oss": "4.5.1",
+ "@npmcli/eslint-config": "^3.0.1"
+ }
+ },
+ "4.2.0": {
+ "name": "proc-log",
+ "version": "4.2.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "proc-log@4.2.0",
+ "bugs": {
+ "url": "https://github.com/npm/proc-log/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "b6f461e4026e75fdfe228b265e9f7a00779d7034",
+ "tarball": "http://localhost:4260/proc-log/proc-log-4.2.0.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/proc-log@4.2.0",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 12261
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "953e6035670f9afe2ec93f6286d76db2828854d6",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "postsnap": "eslint index.js test/*.js --fix",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/proc-log.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.5.2",
+ "description": "just emit 'log' events on the process object",
+ "directories": {},
+ "templateOSS": {
+ "publish": true,
+ "version": "4.21.3",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "20.12.1",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.1",
+ "@npmcli/template-oss": "4.21.3",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/proc-log.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/proc-log#readme",
+ "bugs": {
+ "url": "https://github.com/npm/proc-log/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/promise-retry/registry.json b/tests/registry/npm/promise-retry/registry.json
index 42ae05fac..3d3de4e34 100644
--- a/tests/registry/npm/promise-retry/registry.json
+++ b/tests/registry/npm/promise-retry/registry.json
@@ -1 +1,71 @@
-{"name":"promise-retry","description":"Retries a function that returns a promise, leveraging the power of the retry module.","dist-tags":{"latest":"2.0.1"},"versions":{"2.0.1":{"name":"promise-retry","version":"2.0.1","description":"Retries a function that returns a promise, leveraging the power of the retry module.","main":"index.js","scripts":{"test":"mocha --bail -t 10000"},"bugs":{"url":"https://github.com/IndigoUnited/node-promise-retry/issues/"},"repository":{"type":"git","url":"git://github.com/IndigoUnited/node-promise-retry.git"},"author":{"name":"IndigoUnited","email":"hello@indigounited.com","url":"http://indigounited.com"},"license":"MIT","devDependencies":{"expect.js":"^0.3.1","mocha":"^8.0.1","sleep-promise":"^8.0.1"},"dependencies":{"err-code":"^2.0.2","retry":"^0.12.0"},"engines":{"node":">=10"},"gitHead":"7fb08491112cffe5a0dd11805eff20ca6b6133ac","_id":"promise-retry@2.0.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.1","dist":{"integrity":"sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==","shasum":"ff747a13620ab57ba688f5fc67855410c370da22","tarball":"http://localhost:4260/promise-retry/promise-retry-2.0.1.tgz","fileCount":8,"unpackedSize":15556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5iFvCRA9TVsSAnZWagAAs+sP/3gQa2kWX2l2wsTAhqem\ngWWXM7Ds/O+GFqE5it5MOiMsoz6eDqKJPgpKJmC0snJbvewZ5qRzvKcRkax1\nzqVPPJStGYVnnM55DYcfciG2QBxE2dgX2h3iE/oxXP54TxbtVGRWoL2vWIQ1\nb+CyY8EKu7hVwXmBPqA0k2LUEVI8x8dluWFr3cNc/uPP0y7aCft5ylXN5HCb\nSs46NvxKnKHX98s8UdXH5Qcqc9t3H03je1dn5o6faq00Yh4JbxzrxL4a3q2N\n4oq8yE97naYSfvHrfjUdfLu/FDCXgC6cksdVJMm/lEtz4bRz1TGhKftmM7BN\nUVX3JqL8UCU+FUUv0XQLXl73ydQR3soutYM2TtIFlmanoXi4SsGOLHZ+jXtX\nPgDVdRc+uCQiX1ro0SLHZO8ZOxnjkAFg2VIzSbD3uClk9YwyNkE7FIF0ZsCq\nF4NLWn8B08fKDDpBFtEmiNAdf/+EtCti3Sy2dPsAjbfMPUIJkt0un3cDpdDU\nKtfrCCNInT1irEyx3xvdTmDVY184KHKxJ28F4yi9I7IdqjdrL696dMUYaqJt\nUpi6nTW3rlhZ9JWPOeRPwZinGLeADN0RlTjfixazctDpFzqRo9dClXiud63u\nmsAF+XjtzzJTJP0QBY2D+wKtcJBUj3GnrIZFGWVxbLoGQTMq7PbArx4A3RIC\n6yBc\r\n=YUSa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuoveu5MeEupK25Y5ewNOYZMy+5SF1GM5edr4BD1TBLwIgWATsYaSUW6HxeuaRuu8bSRjKtAe4SPpu1s90VYNrN4w="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# node-promise-retry\n\n[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]\n\n[npm-url]:https://npmjs.org/package/promise-retry\n[downloads-image]:http://img.shields.io/npm/dm/promise-retry.svg\n[npm-image]:http://img.shields.io/npm/v/promise-retry.svg\n[travis-url]:https://travis-ci.org/IndigoUnited/node-promise-retry\n[travis-image]:http://img.shields.io/travis/IndigoUnited/node-promise-retry/master.svg\n[david-dm-url]:https://david-dm.org/IndigoUnited/node-promise-retry\n[david-dm-image]:https://img.shields.io/david/IndigoUnited/node-promise-retry.svg\n[david-dm-dev-url]:https://david-dm.org/IndigoUnited/node-promise-retry?type=dev\n[david-dm-dev-image]:https://img.shields.io/david/dev/IndigoUnited/node-promise-retry.svg\n[greenkeeper-image]:https://badges.greenkeeper.io/IndigoUnited/node-promise-retry.svg\n[greenkeeper-url]:https://greenkeeper.io/\n\nRetries a function that returns a promise, leveraging the power of the [retry](https://github.com/tim-kos/node-retry) module to the promises world.\n\nThere's already some modules that are able to retry functions that return promises but\nthey were rather difficult to use or do not offer an easy way to do conditional retries.\n\n\n## Installation\n\n`$ npm install promise-retry`\n\n\n## Usage\n\n### promiseRetry(fn, [options])\n\nCalls `fn` until the returned promise ends up fulfilled or rejected with an error different than\na `retry` error. \nThe `options` argument is an object which maps to the [retry](https://github.com/tim-kos/node-retry) module options:\n\n- `retries`: The maximum amount of times to retry the operation. Default is `10`.\n- `factor`: The exponential factor to use. Default is `2`.\n- `minTimeout`: The number of milliseconds before starting the first retry. Default is `1000`.\n- `maxTimeout`: The maximum number of milliseconds between two retries. Default is `Infinity`.\n- `randomize`: Randomizes the timeouts by multiplying with a factor between `1` to `2`. Default is `false`.\n\n\nThe `fn` function will receive a `retry` function as its first argument that should be called with an error whenever you want to retry `fn`. The `retry` function will always throw an error. \nIf there are retries left, it will throw a special `retry` error that will be handled internally to call `fn` again.\nIf there are no retries left, it will throw the actual error passed to it.\n\nIf you prefer, you can pass the options first using the alternative function signature `promiseRetry([options], fn)`.\n\n## Example\n```js\nvar promiseRetry = require('promise-retry');\n\n// Simple example\npromiseRetry(function (retry, number) {\n console.log('attempt number', number);\n\n return doSomething()\n .catch(retry);\n})\n.then(function (value) {\n // ..\n}, function (err) {\n // ..\n});\n\n// Conditional example\npromiseRetry(function (retry, number) {\n console.log('attempt number', number);\n\n return doSomething()\n .catch(function (err) {\n if (err.code === 'ETIMEDOUT') {\n retry(err);\n }\n\n throw err;\n });\n})\n.then(function (value) {\n // ..\n}, function (err) {\n // ..\n});\n```\n\n\n## Tests\n\n`$ npm test`\n\n\n## License\n\nReleased under the [MIT License](http://www.opensource.org/licenses/mit-license.php).\n","homepage":"https://github.com/IndigoUnited/node-promise-retry#readme","repository":{"type":"git","url":"git://github.com/IndigoUnited/node-promise-retry.git"},"author":{"name":"IndigoUnited","email":"hello@indigounited.com","url":"http://indigounited.com"},"bugs":{"url":"https://github.com/IndigoUnited/node-promise-retry/issues/"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "promise-retry",
+ "description": "Retries a function that returns a promise, leveraging the power of the retry module.",
+ "dist-tags": {
+ "latest": "2.0.1"
+ },
+ "versions": {
+ "2.0.1": {
+ "name": "promise-retry",
+ "version": "2.0.1",
+ "description": "Retries a function that returns a promise, leveraging the power of the retry module.",
+ "main": "index.js",
+ "scripts": {
+ "test": "mocha --bail -t 10000"
+ },
+ "bugs": {
+ "url": "https://github.com/IndigoUnited/node-promise-retry/issues/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/IndigoUnited/node-promise-retry.git"
+ },
+ "author": {
+ "name": "IndigoUnited",
+ "email": "hello@indigounited.com",
+ "url": "http://indigounited.com"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "expect.js": "^0.3.1",
+ "mocha": "^8.0.1",
+ "sleep-promise": "^8.0.1"
+ },
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "gitHead": "7fb08491112cffe5a0dd11805eff20ca6b6133ac",
+ "_id": "promise-retry@2.0.1",
+ "_nodeVersion": "12.16.1",
+ "_npmVersion": "6.14.1",
+ "dist": {
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "shasum": "ff747a13620ab57ba688f5fc67855410c370da22",
+ "tarball": "http://localhost:4260/promise-retry/promise-retry-2.0.1.tgz",
+ "fileCount": 8,
+ "unpackedSize": 15556
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/IndigoUnited/node-promise-retry#readme",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/IndigoUnited/node-promise-retry.git"
+ },
+ "author": {
+ "name": "IndigoUnited",
+ "email": "hello@indigounited.com",
+ "url": "http://indigounited.com"
+ },
+ "bugs": {
+ "url": "https://github.com/IndigoUnited/node-promise-retry/issues/"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/punycode/registry.json b/tests/registry/npm/punycode/registry.json
index 365ff25ff..8ac4ddf2e 100644
--- a/tests/registry/npm/punycode/registry.json
+++ b/tests/registry/npm/punycode/registry.json
@@ -1 +1,80 @@
-{"name":"punycode","description":"A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.","dist-tags":{"latest":"2.1.1"},"versions":{"2.1.1":{"name":"punycode","version":"2.1.1","description":"A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.","main":"punycode.js","jsnext:main":"punycode.es6.js","module":"punycode.es6.js","engines":{"node":">=6"},"license":"MIT","author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"repository":{"type":"git","url":"git+https://github.com/bestiejs/punycode.js.git"},"bugs":{"url":"https://github.com/bestiejs/punycode.js/issues"},"files":["LICENSE-MIT.txt","punycode.js","punycode.es6.js"],"scripts":{"test":"mocha tests","prepublish":"node scripts/prepublish.js"},"devDependencies":{"codecov":"^1.0.1","istanbul":"^0.4.1","mocha":"^2.5.3"},"jspm":{"map":{"./punycode.js":{"node":"@node/punycode"}}},"gitHead":"68df855dc42d1086ada161331b3074468e8d848d","_id":"punycode@2.1.1","_npmVersion":"5.6.0","_nodeVersion":"8.11.1","dist":{"integrity":"sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==","shasum":"b58b010ac40c22c5657616c8d2c2c02c7bf479ec","tarball":"http://localhost:4260/punycode/punycode-2.1.1.tgz","fileCount":5,"unpackedSize":32434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbA4SZCRA9TVsSAnZWagAA5ZYP/0UOrnGue5Uhy1In5lOe\nh8pglPP9+qBCRx+nfe+YgmPV45IdYadH6InqCibkxAAeZ+j+Sc0g4I1Vv9SF\nPDXiA34tNt12kmLgFSEmdAhbxa87bGtvTnPCzme1iZfmqYmc7GE/q2iazWxd\n9R2im5Xr1oUwZCe0jiY2Le7HOhd+Mnkd76pdknseybWYJxf1RbNSDCtOxndO\nMsZU2CzhG38CFyPVozm+5+XEf5QD3cjKpwpZKZOxVTJ8dwB9FK5SLAvCQSGW\nO15Bili5YCxi2053KDvP/4VGMGdVxPLIp5E+uJyeZSwqVAiqmtk52iLJq4iO\nTs0B3tkKxi3Rxkk5vr0OvvOk6iIW+jkcgaQTFj8jZaGmvvGXztR5F2RDsrDr\nfrXKkahtw+W7u3eoAahCh4FgvJ3sclI23Ik2+ahQQR7B3+AsJ/hVP365RpZo\nSnR/YC+QtfzFJYwbepvg2rhaOqkiGk3dcWS53r2hUm6Ugd0AIR8Cmjuqbsrd\nUaeS+WfpvoceuU45rC9nSCPYms9bBNYBN0leYPb+okOWFbZI5v/gp86CfRs3\n8gwadUA99Z8IFcjzpiIEkmPkk3Z8y5tGXIw66FGuxVDE/tPBORGmEOCPEVpg\nJ/zsiqblJ9pTTGDKTdKxFF4fNq3koen1N4ZAIAoZqJUq7pGEzwjWy9Zw/+JW\nRaNl\r\n=ncBz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBcK2xxRA8qZpahqjEJb2iYYQ3oB5CZL1nabOwakIbRUAiEAzxUMeTgnO/0/ZBwQCOBSmpV8FR0PGra5FS51nJmaeTw="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"repository":{"type":"git","url":"git+https://github.com/bestiejs/punycode.js.git"},"readme":"# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/codecov/c/github/bestiejs/punycode.js.svg)](https://codecov.io/gh/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js)\n\nPunycode.js is a robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891).\n\nThis JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm:\n\n* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C)\n* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c)\n* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c)\n* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287)\n* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072))\n\nThis project was [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with Node.js from [v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) until [v7](https://github.com/nodejs/node/pull/7941) (soft-deprecated).\n\nThe current version supports recent versions of Node.js only. It provides a CommonJS module and an ES6 module. For the old version that offers the same functionality with broader support, including Rhino, Ringo, Narwhal, and web browsers, see [v1.4.1](https://github.com/bestiejs/punycode.js/releases/tag/v1.4.1).\n\n## Installation\n\nVia [npm](https://www.npmjs.com/):\n\n```bash\nnpm install punycode --save\n```\n\nIn [Node.js](https://nodejs.org/):\n\n```js\nconst punycode = require('punycode');\n```\n\n## API\n\n### `punycode.decode(string)`\n\nConverts a Punycode string of ASCII symbols to a string of Unicode symbols.\n\n```js\n// decode domain name parts\npunycode.decode('maana-pta'); // 'mañana'\npunycode.decode('--dqo34k'); // '☃-⌘'\n```\n\n### `punycode.encode(string)`\n\nConverts a string of Unicode symbols to a Punycode string of ASCII symbols.\n\n```js\n// encode domain name parts\npunycode.encode('mañana'); // 'maana-pta'\npunycode.encode('☃-⌘'); // '--dqo34k'\n```\n\n### `punycode.toUnicode(input)`\n\nConverts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode.\n\n```js\n// decode domain names\npunycode.toUnicode('xn--maana-pta.com');\n// → 'mañana.com'\npunycode.toUnicode('xn----dqo34k.com');\n// → '☃-⌘.com'\n\n// decode email addresses\npunycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq');\n// → 'джумла@джpумлатест.bрфa'\n```\n\n### `punycode.toASCII(input)`\n\nConverts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII.\n\n```js\n// encode domain names\npunycode.toASCII('mañana.com');\n// → 'xn--maana-pta.com'\npunycode.toASCII('☃-⌘.com');\n// → 'xn----dqo34k.com'\n\n// encode email addresses\npunycode.toASCII('джумла@джpумлатест.bрфa');\n// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'\n```\n\n### `punycode.ucs2`\n\n#### `punycode.ucs2.decode(string)`\n\nCreates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.\n\n```js\npunycode.ucs2.decode('abc');\n// → [0x61, 0x62, 0x63]\n// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:\npunycode.ucs2.decode('\\uD834\\uDF06');\n// → [0x1D306]\n```\n\n#### `punycode.ucs2.encode(codePoints)`\n\nCreates a string based on an array of numeric code point values.\n\n```js\npunycode.ucs2.encode([0x61, 0x62, 0x63]);\n// → 'abc'\npunycode.ucs2.encode([0x1D306]);\n// → '\\uD834\\uDF06'\n```\n\n### `punycode.version`\n\nA string representing the current Punycode.js version number.\n\n## Author\n\n| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|\n| [Mathias Bynens](https://mathiasbynens.be/) |\n\n## License\n\nPunycode.js is available under the [MIT](https://mths.be/mit) license.\n","readmeFilename":"README.md","homepage":"https://mths.be/punycode","bugs":{"url":"https://github.com/bestiejs/punycode.js/issues"},"license":"MIT"}
+{
+ "name": "punycode",
+ "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
+ "dist-tags": {
+ "latest": "2.1.1"
+ },
+ "versions": {
+ "2.1.1": {
+ "name": "punycode",
+ "version": "2.1.1",
+ "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
+ "main": "punycode.js",
+ "jsnext:main": "punycode.es6.js",
+ "module": "punycode.es6.js",
+ "engines": {
+ "node": ">=6"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bestiejs/punycode.js.git"
+ },
+ "bugs": {
+ "url": "https://github.com/bestiejs/punycode.js/issues"
+ },
+ "files": [
+ "LICENSE-MIT.txt",
+ "punycode.js",
+ "punycode.es6.js"
+ ],
+ "scripts": {
+ "test": "mocha tests",
+ "prepublish": "node scripts/prepublish.js"
+ },
+ "devDependencies": {
+ "codecov": "^1.0.1",
+ "istanbul": "^0.4.1",
+ "mocha": "^2.5.3"
+ },
+ "jspm": {
+ "map": {
+ "./punycode.js": {
+ "node": "@node/punycode"
+ }
+ }
+ },
+ "gitHead": "68df855dc42d1086ada161331b3074468e8d848d",
+ "_id": "punycode@2.1.1",
+ "_npmVersion": "5.6.0",
+ "_nodeVersion": "8.11.1",
+ "dist": {
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "shasum": "b58b010ac40c22c5657616c8d2c2c02c7bf479ec",
+ "tarball": "http://localhost:4260/punycode/punycode-2.1.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 32434
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bestiejs/punycode.js.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://mths.be/punycode",
+ "bugs": {
+ "url": "https://github.com/bestiejs/punycode.js/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/react-dom/registry.json b/tests/registry/npm/react-dom/registry.json
index 7f9035d05..c0139bcb6 100644
--- a/tests/registry/npm/react-dom/registry.json
+++ b/tests/registry/npm/react-dom/registry.json
@@ -1 +1,81 @@
-{"name":"react-dom","description":"React package for working with the DOM.","dist-tags":{"latest":"18.2.0"},"versions":{"18.2.0":{"name":"react-dom","version":"18.2.0","description":"React package for working with the DOM.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/react-dom"},"license":"MIT","bugs":{"url":"https://github.com/facebook/react/issues"},"dependencies":{"loose-envify":"^1.1.0","scheduler":"^0.23.0"},"peerDependencies":{"react":"^18.2.0"},"exports":{".":"./index.js","./client":"./client.js","./server":{"deno":"./server.browser.js","worker":"./server.browser.js","browser":"./server.browser.js","default":"./server.node.js"},"./server.browser":"./server.browser.js","./server.node":"./server.node.js","./profiling":"./profiling.js","./test-utils":"./test-utils.js","./package.json":"./package.json"},"browser":{"./server.js":"./server.browser.js"},"browserify":{"transform":["loose-envify"]},"scripts":{"start":"node server.js"},"gitHead":"be229c5655074642ee664f532f2e7411dd7dccc7","_id":"react-dom@18.2.0","_nodeVersion":"17.1.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==","shasum":"22aaf38708db2674ed9ada224ca4aa708d821e3d","tarball":"http://localhost:4260/react-dom/react-dom-18.2.0.tgz","fileCount":32,"unpackedSize":4502126,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFuONR/ZM75T69/D+wZB2ISrCRRdJpEazmE9z9Q1/85OAiBhXI23GeB2iSHs3KI7A6aCYAnmcmAXQEP5aTonIB2BPQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqOWoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpByw//eI6uM3zx7T1rud9wwDH0kxpi626o69cqbgqn76aUXTf4i3ZZ\r\njtwRoOa37r64psShlltZELbaUstMVaWIi4O06hSzbwkn06xCVakNcfnseoBB\r\ncPFne9rMRPWLMpXLyLX04G6TltGKuWadyqDZDP/1MOexfAfWYsuSgUx92pwF\r\neJ2K0INPoyBiPakFPQrzh2wZ3bBbSyw2h+fXlz35Q1lMpDErDoW5r6mOJ9s6\r\nwuApEFlHAhFvh8gF2cDes1BGOKGNc+WqevpftYL9mEOYz/B7ysbHyTolpY+G\r\nbv5q/d/YUrk69qx7rKesEGlpG0REpZxGKcB1XzWIN+6Q50MNis5mSyEobTrG\r\nXbsQCgwUUHpSV2iMyAbcrPklR2l5sRT8gQHvDJvtLNUf5jA4DKqIAxZKlvV6\r\nvLRmFehbTf9AmXB4fNdXz5WjfA8ASx/77Jv4I/0qH7U3y37vFxZTWIzGVEoD\r\nxIDL4n4wtmar+DWs2T6m2tnPFW+Ww/LNebGNCNYm+HTZKWwdMcxDqkyf4aD2\r\ntVtSso5TJjdaDzM+j+E8EUD1sn5ii9BO18d3PFN4BnAbTRHGQzH9u0ovxSOm\r\n5LptPLbJEtmD+BYr+VsUdQ6T9gZFhNRmGxMjDxy8k2Fb2L1ssnvGqdsHJHel\r\ndPZI4W0tZfRuWlM/M4eRhxHosGqSwWaVSyg=\r\n=s0bE\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"","homepage":"https://reactjs.org/","repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/react-dom"},"bugs":{"url":"https://github.com/facebook/react/issues"},"license":"MIT","readmeFilename":""}
+{
+ "name": "react-dom",
+ "description": "React package for working with the DOM.",
+ "dist-tags": {
+ "latest": "18.2.0"
+ },
+ "versions": {
+ "18.2.0": {
+ "name": "react-dom",
+ "version": "18.2.0",
+ "description": "React package for working with the DOM.",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/react-dom"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ },
+ "exports": {
+ ".": "./index.js",
+ "./client": "./client.js",
+ "./server": {
+ "deno": "./server.browser.js",
+ "worker": "./server.browser.js",
+ "browser": "./server.browser.js",
+ "default": "./server.node.js"
+ },
+ "./server.browser": "./server.browser.js",
+ "./server.node": "./server.node.js",
+ "./profiling": "./profiling.js",
+ "./test-utils": "./test-utils.js",
+ "./package.json": "./package.json"
+ },
+ "browser": {
+ "./server.js": "./server.browser.js"
+ },
+ "browserify": {
+ "transform": [
+ "loose-envify"
+ ]
+ },
+ "scripts": {
+ "start": "node server.js"
+ },
+ "gitHead": "be229c5655074642ee664f532f2e7411dd7dccc7",
+ "_id": "react-dom@18.2.0",
+ "_nodeVersion": "17.1.0",
+ "_npmVersion": "8.1.2",
+ "dist": {
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "shasum": "22aaf38708db2674ed9ada224ca4aa708d821e3d",
+ "tarball": "http://localhost:4260/react-dom/react-dom-18.2.0.tgz",
+ "fileCount": 32,
+ "unpackedSize": 4502126
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://reactjs.org/",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/react-dom"
+ },
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/react/registry.json b/tests/registry/npm/react/registry.json
index 69d284487..c64d0ac67 100644
--- a/tests/registry/npm/react/registry.json
+++ b/tests/registry/npm/react/registry.json
@@ -1 +1,68 @@
-{"name":"react","description":"React is a JavaScript library for building user interfaces.","dist-tags":{"latest":"18.2.0"},"versions":{"18.2.0":{"name":"react","description":"React is a JavaScript library for building user interfaces.","version":"18.2.0","bugs":{"url":"https://github.com/facebook/react/issues"},"license":"MIT","main":"index.js","exports":{".":{"react-server":"./react.shared-subset.js","default":"./index.js"},"./package.json":"./package.json","./jsx-runtime":"./jsx-runtime.js","./jsx-dev-runtime":"./jsx-dev-runtime.js"},"repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/react"},"engines":{"node":">=0.10.0"},"dependencies":{"loose-envify":"^1.1.0"},"browserify":{"transform":["loose-envify"]},"gitHead":"be229c5655074642ee664f532f2e7411dd7dccc7","_id":"react@18.2.0","_nodeVersion":"17.1.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==","shasum":"555bd98592883255fa00de14f1151a917b5d77d5","tarball":"http://localhost:4260/react/react-18.2.0.tgz","fileCount":20,"unpackedSize":316108,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAXfb8FM76qfXX+VU3UqdUnzSzzf0VgxKIAyTaIcyQlGAiBZe9RowzzXQj/a6oUglf6hle9ljtoHOuVgDBABfbEcYQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqOWeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoECw//QMI1Qhe6EvvhDEk8J/2Isap0QvYd8hnk1AXTVepDmoG1lbbT\r\n79ixKRxVJenkva4h/q66/ati80BH5GkKl26Q37gdV73e8OwECrS+3PfyEqqZ\r\nYlST029ICXSiZ8iNJm18Tl+db6UMJ4PwDyPMomCEiwgtWHkB2QVPejHdZnqj\r\nDhy4sM91BhzhJbEhsDcjG97u9c6+eMJYT15uraOBt0447qM0uqr/R+qD5Wil\r\nMzbmqVUT8wk09vGxpXeOfqWwDvRXwlEAJZEKrAp0G8QLTERv97QP1dnMfQ/z\r\nN1S0D3nVi2Z/5y6dwLhvNUA9cYomKO1Aqjb/rC6xiqJSI2WW9diLXjxO1y/e\r\nSwpViB1AGrj3pJDcyMHpdZboYJBDaHu8kGAiRe0q8n5Ytyq/kUkm1Nzd7v05\r\nLPz//TBwzcWIk+GUe4QwPr9llQUBtnQ/zmZ/zFTNmWZy/n/6VDJaPGZLrxBM\r\nJFaLaFQPDCM7BWnDIxlSzXRuHRxwfLKTLrCNpf42qDOS47DBZLFxrrgo++Vv\r\nGqHtn/h0/ljUYFM9HqzYiKHPpqlfKR/7ZfMrHUj5bhK2qa2myY3YShpKLt6q\r\nrEmt1sc644vphuf1pMtWC7eFD+RxblhD2ppp6rwtweQx55ykdJIG9j6yvMra\r\n6GUbN6wNDv2iU+boWdm4uvf8Ptip0HwQWIw=\r\n=Ca+R\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/react"},"readme":"","readmeFilename":"","homepage":"https://reactjs.org/","bugs":{"url":"https://github.com/facebook/react/issues"},"license":"MIT"}
+{
+ "name": "react",
+ "description": "React is a JavaScript library for building user interfaces.",
+ "dist-tags": {
+ "latest": "18.2.0"
+ },
+ "versions": {
+ "18.2.0": {
+ "name": "react",
+ "description": "React is a JavaScript library for building user interfaces.",
+ "version": "18.2.0",
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "license": "MIT",
+ "main": "index.js",
+ "exports": {
+ ".": {
+ "react-server": "./react.shared-subset.js",
+ "default": "./index.js"
+ },
+ "./package.json": "./package.json",
+ "./jsx-runtime": "./jsx-runtime.js",
+ "./jsx-dev-runtime": "./jsx-dev-runtime.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/react"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "browserify": {
+ "transform": [
+ "loose-envify"
+ ]
+ },
+ "gitHead": "be229c5655074642ee664f532f2e7411dd7dccc7",
+ "_id": "react@18.2.0",
+ "_nodeVersion": "17.1.0",
+ "_npmVersion": "8.1.2",
+ "dist": {
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "shasum": "555bd98592883255fa00de14f1151a917b5d77d5",
+ "tarball": "http://localhost:4260/react/react-18.2.0.tgz",
+ "fileCount": 20,
+ "unpackedSize": 316108
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/react"
+ },
+ "readmeFilename": "",
+ "homepage": "https://reactjs.org/",
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/require-directory/registry.json b/tests/registry/npm/require-directory/registry.json
index 24469af40..6aef61e67 100644
--- a/tests/registry/npm/require-directory/registry.json
+++ b/tests/registry/npm/require-directory/registry.json
@@ -1 +1,66 @@
-{"name":"require-directory","description":"Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.","dist-tags":{"latest":"2.1.1"},"versions":{"2.1.1":{"author":{"name":"Troy Goode","email":"troygoode@gmail.com","url":"http://github.com/troygoode/"},"name":"require-directory","version":"2.1.1","description":"Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.","main":"index.js","repository":{"type":"git","url":"git://github.com/troygoode/node-require-directory.git"},"license":"MIT","bugs":{"url":"http://github.com/troygoode/node-require-directory/issues/"},"engines":{"node":">=0.10.0"},"devDependencies":{"jshint":"^2.6.0","mocha":"^2.1.0"},"scripts":{"test":"mocha","lint":"jshint index.js test/test.js"},"gitHead":"cc71c23dd0c16cefd26855303c16ca1b9b50a36d","_id":"require-directory@2.1.1","_shasum":"8c64ad5fd30dab1c976e2344ffe7f792a6a6df42","_from":".","_npmVersion":"2.5.1","_nodeVersion":"0.12.0","dist":{"shasum":"8c64ad5fd30dab1c976e2344ffe7f792a6a6df42","tarball":"http://localhost:4260/require-directory/require-directory-2.1.1.tgz","integrity":"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGClBqRURzZkkK060ZZVZeHq85UyQvNt6ZF9KOQfN12PAiABryiFbUkYd99blPQeu55J/QCLQFAzUicy/mm6OR5I9g=="}]},"directories":{}}},"readme":"# require-directory\n\nRecursively iterates over specified directory, `require()`'ing each file, and returning a nested hash structure containing those modules.\n\n**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)**\n\n[![NPM](https://nodei.co/npm/require-directory.png?downloads=true&stars=true)](https://nodei.co/npm/require-directory/)\n\n[![build status](https://secure.travis-ci.org/troygoode/node-require-directory.png)](http://travis-ci.org/troygoode/node-require-directory)\n\n## How To Use\n\n### Installation (via [npm](https://npmjs.org/package/require-directory))\n\n```bash\n$ npm install require-directory\n```\n\n### Usage\n\nA common pattern in node.js is to include an index file which creates a hash of the files in its current directory. Given a directory structure like so:\n\n* app.js\n* routes/\n * index.js\n * home.js\n * auth/\n * login.js\n * logout.js\n * register.js\n\n`routes/index.js` uses `require-directory` to build the hash (rather than doing so manually) like so:\n\n```javascript\nvar requireDirectory = require('require-directory');\nmodule.exports = requireDirectory(module);\n```\n\n`app.js` references `routes/index.js` like any other module, but it now has a hash/tree of the exports from the `./routes/` directory:\n\n```javascript\nvar routes = require('./routes');\n\n// snip\n\napp.get('/', routes.home);\napp.get('/register', routes.auth.register);\napp.get('/login', routes.auth.login);\napp.get('/logout', routes.auth.logout);\n```\n\nThe `routes` variable above is the equivalent of this:\n\n```javascript\nvar routes = {\n home: require('routes/home.js'),\n auth: {\n login: require('routes/auth/login.js'),\n logout: require('routes/auth/logout.js'),\n register: require('routes/auth/register.js')\n }\n};\n```\n\n*Note that `routes.index` will be `undefined` as you would hope.*\n\n### Specifying Another Directory\n\nYou can specify which directory you want to build a tree of (if it isn't the current directory for whatever reason) by passing it as the second parameter. Not specifying the path (`requireDirectory(module)`) is the equivelant of `requireDirectory(module, __dirname)`:\n\n```javascript\nvar requireDirectory = require('require-directory');\nmodule.exports = requireDirectory(module, './some/subdirectory');\n```\n\nFor example, in the [example in the Usage section](#usage) we could have avoided creating `routes/index.js` and instead changed the first lines of `app.js` to:\n\n```javascript\nvar requireDirectory = require('require-directory');\nvar routes = requireDirectory(module, './routes');\n```\n\n## Options\n\nYou can pass an options hash to `require-directory` as the 2nd parameter (or 3rd if you're passing the path to another directory as the 2nd parameter already). Here are the available options:\n\n### Whitelisting\n\nWhitelisting (either via RegExp or function) allows you to specify that only certain files be loaded.\n\n```javascript\nvar requireDirectory = require('require-directory'),\n whitelist = /onlyinclude.js$/,\n hash = requireDirectory(module, {include: whitelist});\n```\n\n```javascript\nvar requireDirectory = require('require-directory'),\n check = function(path){\n if(/onlyinclude.js$/.test(path)){\n return true; // don't include\n }else{\n return false; // go ahead and include\n }\n },\n hash = requireDirectory(module, {include: check});\n```\n\n### Blacklisting\n\nBlacklisting (either via RegExp or function) allows you to specify that all but certain files should be loaded.\n\n```javascript\nvar requireDirectory = require('require-directory'),\n blacklist = /dontinclude\\.js$/,\n hash = requireDirectory(module, {exclude: blacklist});\n```\n\n```javascript\nvar requireDirectory = require('require-directory'),\n check = function(path){\n if(/dontinclude\\.js$/.test(path)){\n return false; // don't include\n }else{\n return true; // go ahead and include\n }\n },\n hash = requireDirectory(module, {exclude: check});\n```\n\n### Visiting Objects As They're Loaded\n\n`require-directory` takes a function as the `visit` option that will be called for each module that is added to module.exports.\n\n```javascript\nvar requireDirectory = require('require-directory'),\n visitor = function(obj) {\n console.log(obj); // will be called for every module that is loaded\n },\n hash = requireDirectory(module, {visit: visitor});\n```\n\nThe visitor can also transform the objects by returning a value:\n\n```javascript\nvar requireDirectory = require('require-directory'),\n visitor = function(obj) {\n return obj(new Date());\n },\n hash = requireDirectory(module, {visit: visitor});\n```\n\n### Renaming Keys\n\n```javascript\nvar requireDirectory = require('require-directory'),\n renamer = function(name) {\n return name.toUpperCase();\n },\n hash = requireDirectory(module, {rename: renamer});\n```\n\n### No Recursion\n\n```javascript\nvar requireDirectory = require('require-directory'),\n hash = requireDirectory(module, {recurse: false});\n```\n\n## Run Unit Tests\n\n```bash\n$ npm run lint\n$ npm test\n```\n\n## License\n\n[MIT License](http://www.opensource.org/licenses/mit-license.php)\n\n## Author\n\n[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com))\n\n","author":{"name":"Troy Goode","email":"troygoode@gmail.com","url":"http://github.com/troygoode/"},"repository":{"type":"git","url":"git://github.com/troygoode/node-require-directory.git"},"homepage":"https://github.com/troygoode/node-require-directory/","bugs":{"url":"http://github.com/troygoode/node-require-directory/issues/"},"readmeFilename":"README.markdown","license":"MIT"}
+{
+ "name": "require-directory",
+ "description": "Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.",
+ "dist-tags": {
+ "latest": "2.1.1"
+ },
+ "versions": {
+ "2.1.1": {
+ "author": {
+ "name": "Troy Goode",
+ "email": "troygoode@gmail.com",
+ "url": "http://github.com/troygoode/"
+ },
+ "name": "require-directory",
+ "version": "2.1.1",
+ "description": "Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/troygoode/node-require-directory.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "http://github.com/troygoode/node-require-directory/issues/"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "devDependencies": {
+ "jshint": "^2.6.0",
+ "mocha": "^2.1.0"
+ },
+ "scripts": {
+ "test": "mocha",
+ "lint": "jshint index.js test/test.js"
+ },
+ "gitHead": "cc71c23dd0c16cefd26855303c16ca1b9b50a36d",
+ "_id": "require-directory@2.1.1",
+ "_shasum": "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42",
+ "_from": ".",
+ "_npmVersion": "2.5.1",
+ "_nodeVersion": "0.12.0",
+ "dist": {
+ "shasum": "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42",
+ "tarball": "http://localhost:4260/require-directory/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Troy Goode",
+ "email": "troygoode@gmail.com",
+ "url": "http://github.com/troygoode/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/troygoode/node-require-directory.git"
+ },
+ "homepage": "https://github.com/troygoode/node-require-directory/",
+ "bugs": {
+ "url": "http://github.com/troygoode/node-require-directory/issues/"
+ },
+ "readmeFilename": "README.markdown",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/require-from-string/registry.json b/tests/registry/npm/require-from-string/registry.json
index 046c34cd0..25426e3ef 100644
--- a/tests/registry/npm/require-from-string/registry.json
+++ b/tests/registry/npm/require-from-string/registry.json
@@ -1 +1,68 @@
-{"name":"require-from-string","description":"Require module from string","dist-tags":{"latest":"2.0.2"},"versions":{"2.0.2":{"name":"require-from-string","version":"2.0.2","description":"Require module from string","license":"MIT","repository":{"type":"git","url":"git+https://github.com/floatdrop/require-from-string.git"},"author":{"name":"Vsevolod Strukchinsky","email":"floatdrop@gmail.com","url":"github.com/floatdrop"},"engines":{"node":">=0.10.0"},"scripts":{"test":"mocha"},"files":["index.js"],"dependencies":{},"devDependencies":{"mocha":"*"},"gitHead":"d1575a49065eb7a49b86b4de963f04f1a14dfd60","bugs":{"url":"https://github.com/floatdrop/require-from-string/issues"},"_id":"require-from-string@2.0.2","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","dist":{"integrity":"sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==","shasum":"89a7fdd938261267318eafe14f9c32e598c36909","tarball":"http://localhost:4260/require-from-string/require-from-string-2.0.2.tgz","fileCount":4,"unpackedSize":3422,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE2jrMs9LEA5YwPbB+k86fiEWbTiZrILb/xQp2cSIEePAiEApTYU69t0eG1qFeeVayYDlVRtYxsT4vFi9gJB5pqvtXE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# require-from-string [![Build Status](https://travis-ci.org/floatdrop/require-from-string.svg?branch=master)](https://travis-ci.org/floatdrop/require-from-string)\n\nLoad module from string in Node.\n\n## Install\n\n```\n$ npm install --save require-from-string\n```\n\n\n## Usage\n\n```js\nvar requireFromString = require('require-from-string');\n\nrequireFromString('module.exports = 1');\n//=> 1\n```\n\n\n## API\n\n### requireFromString(code, [filename], [options])\n\n#### code\n\n*Required* \nType: `string`\n\nModule code.\n\n#### filename\nType: `string` \nDefault: `''`\n\nOptional filename.\n\n\n#### options\nType: `object`\n\n##### appendPaths\nType: `Array`\n\nList of `paths`, that will be appended to module `paths`. Useful, when you want\nto be able require modules from these paths.\n\n##### prependPaths\nType: `Array`\n\nSame as `appendPaths`, but paths will be prepended.\n\n## License\n\nMIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)\n","homepage":"https://github.com/floatdrop/require-from-string#readme","repository":{"type":"git","url":"git+https://github.com/floatdrop/require-from-string.git"},"author":{"name":"Vsevolod Strukchinsky","email":"floatdrop@gmail.com","url":"github.com/floatdrop"},"bugs":{"url":"https://github.com/floatdrop/require-from-string/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "require-from-string",
+ "description": "Require module from string",
+ "dist-tags": {
+ "latest": "2.0.2"
+ },
+ "versions": {
+ "2.0.2": {
+ "name": "require-from-string",
+ "version": "2.0.2",
+ "description": "Require module from string",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/floatdrop/require-from-string.git"
+ },
+ "author": {
+ "name": "Vsevolod Strukchinsky",
+ "email": "floatdrop@gmail.com",
+ "url": "github.com/floatdrop"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "files": [
+ "index.js"
+ ],
+ "dependencies": {},
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "gitHead": "d1575a49065eb7a49b86b4de963f04f1a14dfd60",
+ "bugs": {
+ "url": "https://github.com/floatdrop/require-from-string/issues"
+ },
+ "_id": "require-from-string@2.0.2",
+ "_npmVersion": "5.6.0",
+ "_nodeVersion": "9.5.0",
+ "dist": {
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "shasum": "89a7fdd938261267318eafe14f9c32e598c36909",
+ "tarball": "http://localhost:4260/require-from-string/require-from-string-2.0.2.tgz",
+ "fileCount": 4,
+ "unpackedSize": 3422
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/floatdrop/require-from-string#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/floatdrop/require-from-string.git"
+ },
+ "author": {
+ "name": "Vsevolod Strukchinsky",
+ "email": "floatdrop@gmail.com",
+ "url": "github.com/floatdrop"
+ },
+ "bugs": {
+ "url": "https://github.com/floatdrop/require-from-string/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/require-main-filename/registry.json b/tests/registry/npm/require-main-filename/registry.json
index 2147bfe95..ca8a86f92 100644
--- a/tests/registry/npm/require-main-filename/registry.json
+++ b/tests/registry/npm/require-main-filename/registry.json
@@ -1 +1,65 @@
-{"name":"require-main-filename","description":"shim for require.main.filename() that works in as many environments as possible","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"require-main-filename","version":"2.0.0","description":"shim for require.main.filename() that works in as many environments as possible","main":"index.js","scripts":{"pretest":"standard","test":"tap --coverage test.js","release":"standard-version"},"repository":{"type":"git","url":"git+ssh://git@github.com/yargs/require-main-filename.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","bugs":{"url":"https://github.com/yargs/require-main-filename/issues"},"devDependencies":{"chai":"^4.0.0","standard":"^10.0.3","standard-version":"^4.0.0","tap":"^11.0.0"},"gitHead":"1acaf42e8ababa22c191319b319f25df833ffd79","_id":"require-main-filename@2.0.0","_npmVersion":"6.5.0","_nodeVersion":"11.8.0","dist":{"integrity":"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==","shasum":"d0b329ecc7cc0f61649f62215be69af54aa8989b","tarball":"http://localhost:4260/require-main-filename/require-main-filename-2.0.0.tgz","fileCount":5,"unpackedSize":3928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcT1tBCRA9TVsSAnZWagAACpUP/1CWLnQggAgCIbJ6ePHM\n7ts/Xk5ikIFSPfvfLDoMhhy8RSa646sfXLgI88wvPyMSNzAH6VQPlr35xi3q\nSsyR15l51yQCMYdQDnkOUNrhS9puo/4J1LCw8QyODw5MBSc78OIDktXEhzeD\n+oiUrHwkyyzKWDO5hJY2L7xjvcV+Amal9jjcnT8CfcaO0BAdEMquPwIKqTs2\n7kHnkbCvcUKzj6SW2TrOrX0hODD39uWZLK5g0BF2LjNX8qmteg/x3+T/Iql6\n8ZPhT2+7runc+z6wW/bXo0goXNTT7PhephyYrkrozl1fJGs54x2jFyqVINLQ\nGBnIZElcV1nf5VCum+3yOxskbmTEidpOZTgZblRO6quvdR7xHloYkL11PeOV\nSrR73bHuXGwZOY2BCTw86w1IbqQQZTy56bymiPrNwefd74bHrDldzAj9kmKI\nMlOkShj59xXgTLJ5D99u3Dn20PbjLQIuoxVMmxKMEe6482mK3Z4DHRUg6heA\nEhsQwgdwMCCwdPvpjgnewuIbOE7UCEB9sIey8FxkAO0OyOuOaUzQRKys1/03\n3qRkxXmBMFvm7kiMewyQueGEqWRlDzN6AXQn/tp6IR4W7H9xUdnZBzdES8GH\n8kaonlsXbMo6eeMzELxahRkYaZBAqRKbQYT1roHAGeRZz0hs+P36bQiwrhBh\nCRE1\r\n=vsrR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUMjZd0CXGkXuEDDJpoLinAcdl/Kx3AmzDarP2bCoaeAiEA4vtpMx3HagFgrpd5RZSO9XMSul/aTv4wRxwLckjFCNE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# require-main-filename\n\n[![Build Status](https://travis-ci.org/yargs/require-main-filename.png)](https://travis-ci.org/yargs/require-main-filename)\n[![Coverage Status](https://coveralls.io/repos/yargs/require-main-filename/badge.svg?branch=master)](https://coveralls.io/r/yargs/require-main-filename?branch=master)\n[![NPM version](https://img.shields.io/npm/v/require-main-filename.svg)](https://www.npmjs.com/package/require-main-filename)\n\n`require.main.filename` is great for figuring out the entry\npoint for the current application. This can be combined with a module like\n[pkg-conf](https://www.npmjs.com/package/pkg-conf) to, _as if by magic_, load\ntop-level configuration.\n\nUnfortunately, `require.main.filename` sometimes fails when an application is\nexecuted with an alternative process manager, e.g., [iisnode](https://github.com/tjanczuk/iisnode).\n\n`require-main-filename` is a shim that addresses this problem.\n\n## Usage\n\n```js\nvar main = require('require-main-filename')()\n// use main as an alternative to require.main.filename.\n```\n\n## License\n\nISC\n","homepage":"https://github.com/yargs/require-main-filename#readme","repository":{"type":"git","url":"git+ssh://git@github.com/yargs/require-main-filename.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"bugs":{"url":"https://github.com/yargs/require-main-filename/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "require-main-filename",
+ "description": "shim for require.main.filename() that works in as many environments as possible",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "require-main-filename",
+ "version": "2.0.0",
+ "description": "shim for require.main.filename() that works in as many environments as possible",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "standard",
+ "test": "tap --coverage test.js",
+ "release": "standard-version"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/yargs/require-main-filename.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/yargs/require-main-filename/issues"
+ },
+ "devDependencies": {
+ "chai": "^4.0.0",
+ "standard": "^10.0.3",
+ "standard-version": "^4.0.0",
+ "tap": "^11.0.0"
+ },
+ "gitHead": "1acaf42e8ababa22c191319b319f25df833ffd79",
+ "_id": "require-main-filename@2.0.0",
+ "_npmVersion": "6.5.0",
+ "_nodeVersion": "11.8.0",
+ "dist": {
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "shasum": "d0b329ecc7cc0f61649f62215be69af54aa8989b",
+ "tarball": "http://localhost:4260/require-main-filename/require-main-filename-2.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 3928
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/yargs/require-main-filename#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/yargs/require-main-filename.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/require-main-filename/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/retry/registry.json b/tests/registry/npm/retry/registry.json
index fc6cfaefd..3958d28db 100644
--- a/tests/registry/npm/retry/registry.json
+++ b/tests/registry/npm/retry/registry.json
@@ -1 +1,76 @@
-{"name":"retry","description":"Abstraction for exponential and custom retry strategies for failed operations.","dist-tags":{"latest":"0.12.0"},"versions":{"0.12.0":{"author":{"name":"Tim Koschützki","email":"tim@debuggable.com","url":"http://debuggable.com/"},"name":"retry","description":"Abstraction for exponential and custom retry strategies for failed operations.","license":"MIT","version":"0.12.0","repository":{"type":"git","url":"git://github.com/tim-kos/node-retry.git"},"directories":{"lib":"./lib"},"main":"index","engines":{"node":">= 4"},"dependencies":{},"devDependencies":{"fake":"0.2.0","istanbul":"^0.4.5","tape":"^4.8.0"},"scripts":{"test":"istanbul cover ./node_modules/tape/bin/tape ./test/integration/*.js","release:major":"env SEMANTIC=major npm run release","release:minor":"env SEMANTIC=minor npm run release","release:patch":"env SEMANTIC=patch npm run release","release":"npm version ${SEMANTIC:-patch} -m \"Release %s\" && git push && git push --tags && npm publish"},"gitHead":"f802d9edc2fdbca727d3e368234b6d714db06f8e","bugs":{"url":"https://github.com/tim-kos/node-retry/issues"},"_id":"retry@0.12.0","_shasum":"1b42a6266a21f07421d1b0b54b7dc167b01c013b","_from":".","_npmVersion":"4.1.2","_nodeVersion":"6.10.0","dist":{"shasum":"1b42a6266a21f07421d1b0b54b7dc167b01c013b","tarball":"http://localhost:4260/retry/retry-0.12.0.tgz","fileCount":17,"unpackedSize":32210,"integrity":"sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMDGASpQgnZsQGbQrEfU7i4L+ZKTo9locIjyOG8CM7zgIhALH9AixwT4LkB513kWXw3P2vIZ6kqYNzDWTD7UQ/RdD7"}]},"_hasShrinkwrap":false}},"author":{"name":"Tim Koschützki","email":"tim@debuggable.com","url":"http://debuggable.com/"},"repository":{"type":"git","url":"git://github.com/tim-kos/node-retry.git"},"readme":"<!-- badges/ -->\n[![Build Status](https://secure.travis-ci.org/tim-kos/node-retry.svg?branch=master)](http://travis-ci.org/tim-kos/node-retry \"Check this project's build status on TravisCI\")\n[![codecov](https://codecov.io/gh/tim-kos/node-retry/branch/master/graph/badge.svg)](https://codecov.io/gh/tim-kos/node-retry)\n<!-- /badges -->\n\n# retry\n\nAbstraction for exponential and custom retry strategies for failed operations.\n\n## Installation\n\n npm install retry\n\n## Current Status\n\nThis module has been tested and is ready to be used.\n\n## Tutorial\n\nThe example below will retry a potentially failing `dns.resolve` operation\n`10` times using an exponential backoff strategy. With the default settings, this\nmeans the last attempt is made after `17 minutes and 3 seconds`.\n\n``` javascript\nvar dns = require('dns');\nvar retry = require('retry');\n\nfunction faultTolerantResolve(address, cb) {\n var operation = retry.operation();\n\n operation.attempt(function(currentAttempt) {\n dns.resolve(address, function(err, addresses) {\n if (operation.retry(err)) {\n return;\n }\n\n cb(err ? operation.mainError() : null, addresses);\n });\n });\n}\n\nfaultTolerantResolve('nodejs.org', function(err, addresses) {\n console.log(err, addresses);\n});\n```\n\nOf course you can also configure the factors that go into the exponential\nbackoff. See the API documentation below for all available settings.\ncurrentAttempt is an int representing the number of attempts so far.\n\n``` javascript\nvar operation = retry.operation({\n retries: 5,\n factor: 3,\n minTimeout: 1 * 1000,\n maxTimeout: 60 * 1000,\n randomize: true,\n});\n```\n\n## API\n\n### retry.operation([options])\n\nCreates a new `RetryOperation` object. `options` is the same as `retry.timeouts()`'s `options`, with three additions:\n\n* `forever`: Whether to retry forever, defaults to `false`.\n* `unref`: Whether to [unref](https://nodejs.org/api/timers.html#timers_unref) the setTimeout's, defaults to `false`.\n* `maxRetryTime`: The maximum time (in milliseconds) that the retried operation is allowed to run. Default is `Infinity`. \n\n### retry.timeouts([options])\n\nReturns an array of timeouts. All time `options` and return values are in\nmilliseconds. If `options` is an array, a copy of that array is returned.\n\n`options` is a JS object that can contain any of the following keys:\n\n* `retries`: The maximum amount of times to retry the operation. Default is `10`. Seting this to `1` means `do it once, then retry it once`.\n* `factor`: The exponential factor to use. Default is `2`.\n* `minTimeout`: The number of milliseconds before starting the first retry. Default is `1000`.\n* `maxTimeout`: The maximum number of milliseconds between two retries. Default is `Infinity`.\n* `randomize`: Randomizes the timeouts by multiplying with a factor between `1` to `2`. Default is `false`.\n\nThe formula used to calculate the individual timeouts is:\n\n```\nMath.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout)\n```\n\nHave a look at [this article][article] for a better explanation of approach.\n\nIf you want to tune your `factor` / `times` settings to attempt the last retry\nafter a certain amount of time, you can use wolfram alpha. For example in order\nto tune for `10` attempts in `5 minutes`, you can use this equation:\n\n![screenshot](https://github.com/tim-kos/node-retry/raw/master/equation.gif)\n\nExplaining the various values from left to right:\n\n* `k = 0 ... 9`: The `retries` value (10)\n* `1000`: The `minTimeout` value in ms (1000)\n* `x^k`: No need to change this, `x` will be your resulting factor\n* `5 * 60 * 1000`: The desired total amount of time for retrying in ms (5 minutes)\n\nTo make this a little easier for you, use wolfram alpha to do the calculations:\n\n<http://www.wolframalpha.com/input/?i=Sum%5B1000*x^k%2C+{k%2C+0%2C+9}%5D+%3D+5+*+60+*+1000>\n\n[article]: http://dthain.blogspot.com/2009/02/exponential-backoff-in-distributed.html\n\n### retry.createTimeout(attempt, opts)\n\nReturns a new `timeout` (integer in milliseconds) based on the given parameters.\n\n`attempt` is an integer representing for which retry the timeout should be calculated. If your retry operation was executed 4 times you had one attempt and 3 retries. If you then want to calculate a new timeout, you should set `attempt` to 4 (attempts are zero-indexed).\n\n`opts` can include `factor`, `minTimeout`, `randomize` (boolean) and `maxTimeout`. They are documented above.\n\n`retry.createTimeout()` is used internally by `retry.timeouts()` and is public for you to be able to create your own timeouts for reinserting an item, see [issue #13](https://github.com/tim-kos/node-retry/issues/13).\n\n### retry.wrap(obj, [options], [methodNames])\n\nWrap all functions of the `obj` with retry. Optionally you can pass operation options and\nan array of method names which need to be wrapped.\n\n```\nretry.wrap(obj)\n\nretry.wrap(obj, ['method1', 'method2'])\n\nretry.wrap(obj, {retries: 3})\n\nretry.wrap(obj, {retries: 3}, ['method1', 'method2'])\n```\nThe `options` object can take any options that the usual call to `retry.operation` can take.\n\n### new RetryOperation(timeouts, [options])\n\nCreates a new `RetryOperation` where `timeouts` is an array where each value is\na timeout given in milliseconds.\n\nAvailable options:\n* `forever`: Whether to retry forever, defaults to `false`.\n* `unref`: Wether to [unref](https://nodejs.org/api/timers.html#timers_unref) the setTimeout's, defaults to `false`.\n\nIf `forever` is true, the following changes happen:\n* `RetryOperation.errors()` will only output an array of one item: the last error.\n* `RetryOperation` will repeatedly use the `timeouts` array. Once all of its timeouts have been used up, it restarts with the first timeout, then uses the second and so on.\n\n#### retryOperation.errors()\n\nReturns an array of all errors that have been passed to `retryOperation.retry()` so far. The\nreturning array has the errors ordered chronologically based on when they were passed to\n`retryOperation.retry()`, which means the first passed error is at index zero and the last is\nat the last index.\n\n#### retryOperation.mainError()\n\nA reference to the error object that occured most frequently. Errors are\ncompared using the `error.message` property.\n\nIf multiple error messages occured the same amount of time, the last error\nobject with that message is returned.\n\nIf no errors occured so far, the value is `null`.\n\n#### retryOperation.attempt(fn, timeoutOps)\n\nDefines the function `fn` that is to be retried and executes it for the first\ntime right away. The `fn` function can receive an optional `currentAttempt` callback that represents the number of attempts to execute `fn` so far.\n\nOptionally defines `timeoutOps` which is an object having a property `timeout` in miliseconds and a property `cb` callback function.\nWhenever your retry operation takes longer than `timeout` to execute, the timeout callback function `cb` is called.\n\n\n#### retryOperation.try(fn)\n\nThis is an alias for `retryOperation.attempt(fn)`. This is deprecated. Please use `retryOperation.attempt(fn)` instead.\n\n#### retryOperation.start(fn)\n\nThis is an alias for `retryOperation.attempt(fn)`. This is deprecated. Please use `retryOperation.attempt(fn)` instead.\n\n#### retryOperation.retry(error)\n\nReturns `false` when no `error` value is given, or the maximum amount of retries\nhas been reached.\n\nOtherwise it returns `true`, and retries the operation after the timeout for\nthe current attempt number.\n\n#### retryOperation.stop()\n\nAllows you to stop the operation being retried. Useful for aborting the operation on a fatal error etc.\n\n#### retryOperation.reset()\n\nResets the internal state of the operation object, so that you can call `attempt()` again as if this was a new operation object.\n\n#### retryOperation.attempts()\n\nReturns an int representing the number of attempts it took to call `fn` before it was successful.\n\n## License\n\nretry is licensed under the MIT license.\n\n\n# Changelog\n\n0.10.0 Adding `stop` functionality, thanks to @maxnachlinger.\n\n0.9.0 Adding `unref` functionality, thanks to @satazor.\n\n0.8.0 Implementing retry.wrap.\n\n0.7.0 Some bug fixes and made retry.createTimeout() public. Fixed issues [#10](https://github.com/tim-kos/node-retry/issues/10), [#12](https://github.com/tim-kos/node-retry/issues/12), and [#13](https://github.com/tim-kos/node-retry/issues/13).\n\n0.6.0 Introduced optional timeOps parameter for the attempt() function which is an object having a property timeout in milliseconds and a property cb callback function. Whenever your retry operation takes longer than timeout to execute, the timeout callback function cb is called.\n\n0.5.0 Some minor refactoring.\n\n0.4.0 Changed retryOperation.try() to retryOperation.attempt(). Deprecated the aliases start() and try() for it.\n\n0.3.0 Added retryOperation.start() which is an alias for retryOperation.try().\n\n0.2.0 Added attempts() function and parameter to retryOperation.try() representing the number of attempts it took to call fn().\n","homepage":"https://github.com/tim-kos/node-retry","bugs":{"url":"https://github.com/tim-kos/node-retry/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "retry",
+ "description": "Abstraction for exponential and custom retry strategies for failed operations.",
+ "dist-tags": {
+ "latest": "0.12.0"
+ },
+ "versions": {
+ "0.12.0": {
+ "author": {
+ "name": "Tim Koschützki",
+ "email": "tim@debuggable.com",
+ "url": "http://debuggable.com/"
+ },
+ "name": "retry",
+ "description": "Abstraction for exponential and custom retry strategies for failed operations.",
+ "license": "MIT",
+ "version": "0.12.0",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/tim-kos/node-retry.git"
+ },
+ "directories": {
+ "lib": "./lib"
+ },
+ "main": "index",
+ "engines": {
+ "node": ">= 4"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "fake": "0.2.0",
+ "istanbul": "^0.4.5",
+ "tape": "^4.8.0"
+ },
+ "scripts": {
+ "test": "istanbul cover ./node_modules/tape/bin/tape ./test/integration/*.js",
+ "release:major": "env SEMANTIC=major npm run release",
+ "release:minor": "env SEMANTIC=minor npm run release",
+ "release:patch": "env SEMANTIC=patch npm run release",
+ "release": "npm version ${SEMANTIC:-patch} -m \"Release %s\" && git push && git push --tags && npm publish"
+ },
+ "gitHead": "f802d9edc2fdbca727d3e368234b6d714db06f8e",
+ "bugs": {
+ "url": "https://github.com/tim-kos/node-retry/issues"
+ },
+ "_id": "retry@0.12.0",
+ "_shasum": "1b42a6266a21f07421d1b0b54b7dc167b01c013b",
+ "_from": ".",
+ "_npmVersion": "4.1.2",
+ "_nodeVersion": "6.10.0",
+ "dist": {
+ "shasum": "1b42a6266a21f07421d1b0b54b7dc167b01c013b",
+ "tarball": "http://localhost:4260/retry/retry-0.12.0.tgz",
+ "fileCount": 17,
+ "unpackedSize": 32210,
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Tim Koschützki",
+ "email": "tim@debuggable.com",
+ "url": "http://debuggable.com/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/tim-kos/node-retry.git"
+ },
+ "homepage": "https://github.com/tim-kos/node-retry",
+ "bugs": {
+ "url": "https://github.com/tim-kos/node-retry/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/safer-buffer/registry.json b/tests/registry/npm/safer-buffer/registry.json
index e78f3ccf6..7383f74cc 100644
--- a/tests/registry/npm/safer-buffer/registry.json
+++ b/tests/registry/npm/safer-buffer/registry.json
@@ -1 +1,71 @@
-{"name":"safer-buffer","dist-tags":{"latest":"2.1.2"},"versions":{"2.1.2":{"name":"safer-buffer","version":"2.1.2","description":"Modern Buffer API polyfill without footguns","main":"safer.js","scripts":{"browserify-test":"browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js","test":"standard && tape tests.js"},"author":{"name":"Nikita Skovoroda","email":"chalkerx@gmail.com","url":"https://github.com/ChALkeR"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ChALkeR/safer-buffer.git"},"bugs":{"url":"https://github.com/ChALkeR/safer-buffer/issues"},"devDependencies":{"standard":"^11.0.1","tape":"^4.9.0"},"files":["Porting-Buffer.md","Readme.md","tests.js","dangerous.js","safer.js"],"gitHead":"e8ac214944eda30e1e6c6b7d7e7f6a21cf7dce7c","_id":"safer-buffer@2.1.2","_npmVersion":"5.8.0","_nodeVersion":"9.11.1","dist":{"integrity":"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==","shasum":"44fa161b0187b9549dd84bb91802f9bd8385cd6a","tarball":"http://localhost:4260/safer-buffer/safer-buffer-2.1.2.tgz","fileCount":7,"unpackedSize":42299,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCiWlmbOFsq/xKEX4UKFrw7JuXKDGPMQwhMUq5cAT6LggIhAIHQagK183Vhp/6SzFuUWxphk7AbQiAzPiOAMO7etVRH"}]},"directories":{},"_hasShrinkwrap":false}},"description":"Modern Buffer API polyfill without footguns","homepage":"https://github.com/ChALkeR/safer-buffer#readme","repository":{"type":"git","url":"git+https://github.com/ChALkeR/safer-buffer.git"},"author":{"name":"Nikita Skovoroda","email":"chalkerx@gmail.com","url":"https://github.com/ChALkeR"},"bugs":{"url":"https://github.com/ChALkeR/safer-buffer/issues"},"license":"MIT","readme":"# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url]\n\n[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master\n[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer\n[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg\n[npm-url]: https://npmjs.org/package/safer-buffer\n[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg\n[standard-url]: https://standardjs.com\n[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg\n[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md\n\nModern Buffer API polyfill without footguns, working on Node.js from 0.8 to current.\n\n## How to use?\n\nFirst, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API.\n\nThen, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use\n`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new\nBuffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._\n\nAlso, see the\n[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide.\n\n## Do I need it?\n\nHopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that\nis the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()`\nthough.\n\nSee the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md)\nfor a better description.\n\n## Why not [safe-buffer](https://npmjs.com/safe-buffer)?\n\n_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and\nitself contains footguns._\n\n`safe-buffer` could be used safely to get the new API while still keeping support for older\nNode.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API\nI found out that `safe-buffer` is itself causing problems in some cases.\n\nFor example, consider the following snippet:\n\n```console\n$ cat example.unsafe.js\nconsole.log(Buffer(20))\n$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js\n<Buffer 0a 00 00 00 00 00 00 00 28 13 de 02 00 00 00 00 05 00 00 00>\n$ standard example.unsafe.js\nstandard: Use JavaScript Standard Style (https://standardjs.com)\n /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead.\n```\n\nThis is allocates and writes to console an uninitialized chunk of memory.\n[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people\nto avoid using unsafe API.\n\nLet's now throw in `safe-buffer`!\n\n```console\n$ cat example.safe-buffer.js\nconst Buffer = require('safe-buffer').Buffer\nconsole.log(Buffer(20))\n$ standard example.safe-buffer.js\n$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js\n<Buffer 08 00 00 00 00 00 00 00 28 58 01 82 fe 7f 00 00 00 00 00 00>\n```\n\nSee the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior\nremains identiсal to what we had before, and when launched on Node.js 6.x LTS — this dumps out\nchunks of uninitialized memory.\n_And this code will still emit runtime warnings on Node.js 10.x and above._\n\nThat was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or\nemitting warnings on it, but that significantly diverges from `safe-buffer` design. After some\ndiscussion, it was decided to move my approach into a separate package, and _this is that separate\npackage_.\n\nThis footgun is not imaginary — I observed top-downloaded packages doing that kind of thing,\n«fixing» the lint warning by blindly including `safe-buffer` without any actual changes.\n\nAlso in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request\ncan bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go\nunnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even\npass CI. _I also observed that being done in popular packages._\n\nSome examples:\n * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31)\n (a module with 548 759 downloads/month),\n * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61)\n (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)),\n * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c)\n (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)),\n * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec)\n (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)),\n * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1)\n (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)).\n * And there are a lot more over the ecosystem.\n\nI filed a PR at\n[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to\npartially fix that (for cases when that lint rule is used), but it is a semver-major change for\nlinter rules and presets, so it would take significant time for that to reach actual setups.\n_It also hasn't been released yet (2018-03-20)._\n\nAlso, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake.\nIt still supports it with an explicit concern barier, by placing it under\n`require('safer-buffer/dangereous')`.\n\n## But isn't throwing bad?\n\nNot really. It's an error that could be noticed and fixed early, instead of causing havoc later like\nunguarded `new Buffer()` calls that end up receiving user input can do.\n\nThis package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so\nit is really simple to keep track of things and make sure that you don't mix old API usage with that.\nAlso, CI should hint anything that you might have missed.\n\nNew commits, if tested, won't land new usage of unsafe Buffer API this way.\n_Node.js 10.x also deals with that by printing a runtime depecation warning._\n\n### Would it affect third-party modules?\n\nNo, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`.\nDon't do that.\n\n### But I don't want throwing…\n\nThat is also fine!\n\nAlso, it could be better in some cases when you don't comprehensive enough test coverage.\n\nIn that case — just don't override `Buffer` and use\n`var SaferBuffer = require('safer-buffer').Buffer` instead.\n\nThat way, everything using `Buffer` natively would still work, but there would be two drawbacks:\n\n* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and\n `SaferBuffer.alloc` instead.\n* You are still open to accidentally using the insecure deprecated API — use a linter to catch that.\n\nNote that using a linter to catch accidential `Buffer` constructor usage in this case is strongly\nrecommended. `Buffer` is not overriden in this usecase, so linters won't get confused.\n\n## «Without footguns»?\n\nWell, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property\non older versions and duping things from there. You shouldn't do that in your code, probabably.\n\nThe intention is to remove the most significant footguns that affect lots of packages in the\necosystem, and to do it in the proper way.\n\nAlso, this package doesn't protect against security issues affecting some Node.js versions, so for\nusage in your own production code, it is still recommended to update to a Node.js version\n[supported by upstream](https://github.com/nodejs/release#release-schedule).\n","readmeFilename":"Readme.md"}
+{
+ "name": "safer-buffer",
+ "dist-tags": {
+ "latest": "2.1.2"
+ },
+ "versions": {
+ "2.1.2": {
+ "name": "safer-buffer",
+ "version": "2.1.2",
+ "description": "Modern Buffer API polyfill without footguns",
+ "main": "safer.js",
+ "scripts": {
+ "browserify-test": "browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js",
+ "test": "standard && tape tests.js"
+ },
+ "author": {
+ "name": "Nikita Skovoroda",
+ "email": "chalkerx@gmail.com",
+ "url": "https://github.com/ChALkeR"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ChALkeR/safer-buffer.git"
+ },
+ "bugs": {
+ "url": "https://github.com/ChALkeR/safer-buffer/issues"
+ },
+ "devDependencies": {
+ "standard": "^11.0.1",
+ "tape": "^4.9.0"
+ },
+ "files": [
+ "Porting-Buffer.md",
+ "Readme.md",
+ "tests.js",
+ "dangerous.js",
+ "safer.js"
+ ],
+ "gitHead": "e8ac214944eda30e1e6c6b7d7e7f6a21cf7dce7c",
+ "_id": "safer-buffer@2.1.2",
+ "_npmVersion": "5.8.0",
+ "_nodeVersion": "9.11.1",
+ "dist": {
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "shasum": "44fa161b0187b9549dd84bb91802f9bd8385cd6a",
+ "tarball": "http://localhost:4260/safer-buffer/safer-buffer-2.1.2.tgz",
+ "fileCount": 7,
+ "unpackedSize": 42299
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Modern Buffer API polyfill without footguns",
+ "homepage": "https://github.com/ChALkeR/safer-buffer#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ChALkeR/safer-buffer.git"
+ },
+ "author": {
+ "name": "Nikita Skovoroda",
+ "email": "chalkerx@gmail.com",
+ "url": "https://github.com/ChALkeR"
+ },
+ "bugs": {
+ "url": "https://github.com/ChALkeR/safer-buffer/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "Readme.md"
+}
diff --git a/tests/registry/npm/scheduler/registry.json b/tests/registry/npm/scheduler/registry.json
index d5fa73f1a..8e9b94522 100644
--- a/tests/registry/npm/scheduler/registry.json
+++ b/tests/registry/npm/scheduler/registry.json
@@ -1 +1,56 @@
-{"name":"scheduler","description":"Cooperative scheduler for the browser environment.","dist-tags":{"latest":"0.23.0"},"versions":{"0.23.0":{"name":"scheduler","version":"0.23.0","description":"Cooperative scheduler for the browser environment.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/scheduler"},"license":"MIT","bugs":{"url":"https://github.com/facebook/react/issues"},"dependencies":{"loose-envify":"^1.1.0"},"browserify":{"transform":["loose-envify"]},"gitHead":"be229c5655074642ee664f532f2e7411dd7dccc7","_id":"scheduler@0.23.0","_nodeVersion":"17.1.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==","shasum":"ba8041afc3d30eb206a487b6b384002e4e61fdfe","tarball":"http://localhost:4260/scheduler/scheduler-0.23.0.tgz","fileCount":17,"unpackedSize":93383,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCuUFLmRELHjjJvlsHNO7vuJtfOnhT+JnfqmTvwgRYftQIgZhnDzvxglekFIKzPn4lRQixz0fepynlXuH6vCxOF1L0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqOXIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaAg//dMv58QLF2xbMA0hoBS4oT1Fd72lHkEiVvrJzl1VA73WAqDxC\r\nqQZ6SfdB7Bq/rJ8LhU3Tgn6HsFjhlCR5JYKkgjHjs5Gt5kBMEMXPgJ53lIe0\r\nYuO1ZNBWHlu9ZA3T/FYNCpsopmEEINKDCF/ZCizSGXJhid78VXVdZV77ZA1R\r\nPYct63PlVlNVM1HiaOqVyQHKMTHITgi6q0WK+fALKOVXJ0W2j0LoxY3oiS/9\r\nv7mKJpWPbWurhIj4BRnJWDHovEUERFXUFpCx2b3JqGX9/e3nDO2iEu11eI3c\r\nLQqWof4tV6a+eMUH6X/S/rkgvW9FC6Wm5RxoMwFhkCiGJkwqgAK1zWFW1thR\r\nWF1fgMuZZ0lVSRazn8qxRntqoXGBQS/9+DCuhm6n+z2Mp1dLedW5Pwdxqvn4\r\nRCIWkaLtoKwwVc2Qci24qtC1LGkTkpqL/GNfPoV84wKFxbLOAwVQMV+RKf6Y\r\n3k7tmWqFWQWYKFfsdLiqvHWynwi6pPYIQkIpFTDl2+/iJT3Io0Ex6VqasYyL\r\nZUSVN6VskqrHDPO657VD1VIWAQrmVk0MR4NH7ArGLTM3TRQGspwIZ1m+sHwC\r\nZ4nAB09Y1lUSHs+w12Re7FeumFgClavUWTqe69219mzgisiyFa49bOJ3xv6+\r\n43ViKo63xOsKDX1iHqxU2Q5n/XY8dCPul9E=\r\n=q8ie\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"repository":{"type":"git","url":"git+https://github.com/facebook/react.git","directory":"packages/scheduler"},"homepage":"https://reactjs.org/","bugs":{"url":"https://github.com/facebook/react/issues"},"license":"MIT","readme":"","readmeFilename":""}
+{
+ "name": "scheduler",
+ "description": "Cooperative scheduler for the browser environment.",
+ "dist-tags": {
+ "latest": "0.23.0"
+ },
+ "versions": {
+ "0.23.0": {
+ "name": "scheduler",
+ "version": "0.23.0",
+ "description": "Cooperative scheduler for the browser environment.",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/scheduler"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "browserify": {
+ "transform": [
+ "loose-envify"
+ ]
+ },
+ "gitHead": "be229c5655074642ee664f532f2e7411dd7dccc7",
+ "_id": "scheduler@0.23.0",
+ "_nodeVersion": "17.1.0",
+ "_npmVersion": "8.1.2",
+ "dist": {
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "shasum": "ba8041afc3d30eb206a487b6b384002e4e61fdfe",
+ "tarball": "http://localhost:4260/scheduler/scheduler-0.23.0.tgz",
+ "fileCount": 17,
+ "unpackedSize": 93383
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/facebook/react.git",
+ "directory": "packages/scheduler"
+ },
+ "homepage": "https://reactjs.org/",
+ "bugs": {
+ "url": "https://github.com/facebook/react/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/semver/registry.json b/tests/registry/npm/semver/registry.json
index 7f7dcb371..2a1dfdb02 100644
--- a/tests/registry/npm/semver/registry.json
+++ b/tests/registry/npm/semver/registry.json
@@ -1 +1,112 @@
-{"name":"semver","description":"The semantic version parser used by npm.","dist-tags":{"latest":"7.6.2"},"versions":{"7.6.2":{"name":"semver","version":"7.6.2","author":{"name":"GitHub Inc."},"license":"ISC","_id":"semver@7.6.2","bugs":{"url":"https://github.com/npm/node-semver/issues"},"bin":{"semver":"bin/semver.js"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"],"timeout":30,"coverage-map":"map.js"},"dist":{"shasum":"1e3b34759f896e8f14d6134732ce798aeb0c6e13","tarball":"http://localhost:4260/semver/semver-7.6.2.tgz","fileCount":52,"integrity":"sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==","signatures":[{"sig":"MEYCIQD6/pwdiEu5Ip6DyQ8rwsJ13wLppdOMIDtJOClcLbK+nwIhAMgA4McQIu/+mVtitzpO97NIKFlLAt+8ABL6dnMipilm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/semver@7.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95424},"main":"index.js","engines":{"node":">=10"},"gitHead":"eb1380b1ecd74f6572831294d55ef4537dfe1a2a","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/node-semver.git","type":"git"},"_npmVersion":"10.7.0","description":"The semantic version parser used by npm.","directories":{},"templateOSS":{"engines":">=10","publish":"true","version":"4.22.0","distPaths":["classes/","functions/","internal/","ranges/","index.js","preload.js","range.bnf"],"allowPaths":["/classes/","/functions/","/internal/","/ranges/","/index.js","/preload.js","/range.bnf","/benchmarks"],"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"22.1.0","_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.0","benchmark":"^2.1.4","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/node-semver.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/node-semver#readme","bugs":{"url":"https://github.com/npm/node-semver/issues"},"readme":"semver(1) -- The semantic versioner for npm\n===========================================\n\n## Install\n\n```bash\nnpm install semver\n````\n\n## Usage\n\nAs a node module:\n\n```js\nconst semver = require('semver')\n\nsemver.valid('1.2.3') // '1.2.3'\nsemver.valid('a.b.c') // null\nsemver.clean(' =v1.2.3 ') // '1.2.3'\nsemver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\nsemver.gt('1.2.3', '9.8.7') // false\nsemver.lt('1.2.3', '9.8.7') // true\nsemver.minVersion('>=1.0.0') // '1.0.0'\nsemver.valid(semver.coerce('v2')) // '2.0.0'\nsemver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'\n```\n\nYou can also just load the module for the function that you care about if\nyou'd like to minimize your footprint.\n\n```js\n// load the whole API at once in a single object\nconst semver = require('semver')\n\n// or just load the bits you need\n// all of them listed here, just pick and choose what you want\n\n// classes\nconst SemVer = require('semver/classes/semver')\nconst Comparator = require('semver/classes/comparator')\nconst Range = require('semver/classes/range')\n\n// functions for working with versions\nconst semverParse = require('semver/functions/parse')\nconst semverValid = require('semver/functions/valid')\nconst semverClean = require('semver/functions/clean')\nconst semverInc = require('semver/functions/inc')\nconst semverDiff = require('semver/functions/diff')\nconst semverMajor = require('semver/functions/major')\nconst semverMinor = require('semver/functions/minor')\nconst semverPatch = require('semver/functions/patch')\nconst semverPrerelease = require('semver/functions/prerelease')\nconst semverCompare = require('semver/functions/compare')\nconst semverRcompare = require('semver/functions/rcompare')\nconst semverCompareLoose = require('semver/functions/compare-loose')\nconst semverCompareBuild = require('semver/functions/compare-build')\nconst semverSort = require('semver/functions/sort')\nconst semverRsort = require('semver/functions/rsort')\n\n// low-level comparators between versions\nconst semverGt = require('semver/functions/gt')\nconst semverLt = require('semver/functions/lt')\nconst semverEq = require('semver/functions/eq')\nconst semverNeq = require('semver/functions/neq')\nconst semverGte = require('semver/functions/gte')\nconst semverLte = require('semver/functions/lte')\nconst semverCmp = require('semver/functions/cmp')\nconst semverCoerce = require('semver/functions/coerce')\n\n// working with ranges\nconst semverSatisfies = require('semver/functions/satisfies')\nconst semverMaxSatisfying = require('semver/ranges/max-satisfying')\nconst semverMinSatisfying = require('semver/ranges/min-satisfying')\nconst semverToComparators = require('semver/ranges/to-comparators')\nconst semverMinVersion = require('semver/ranges/min-version')\nconst semverValidRange = require('semver/ranges/valid')\nconst semverOutside = require('semver/ranges/outside')\nconst semverGtr = require('semver/ranges/gtr')\nconst semverLtr = require('semver/ranges/ltr')\nconst semverIntersects = require('semver/ranges/intersects')\nconst semverSimplifyRange = require('semver/ranges/simplify')\nconst semverRangeSubset = require('semver/ranges/subset')\n```\n\nAs a command-line utility:\n\n```\n$ semver -h\n\nA JavaScript implementation of the https://semver.org/ specification\nCopyright Isaac Z. Schlueter\n\nUsage: semver [options] <version> [<version> [...]]\nPrints valid versions sorted by SemVer precedence\n\nOptions:\n-r --range <range>\n Print versions that match the specified range.\n\n-i --increment [<level>]\n Increment a version by the specified level. Level can\n be one of: major, minor, patch, premajor, preminor,\n prepatch, or prerelease. Default level is 'patch'.\n Only one version may be specified.\n\n--preid <identifier>\n Identifier to be used to prefix premajor, preminor,\n prepatch or prerelease version increments.\n\n-l --loose\n Interpret versions and ranges loosely\n\n-n <0|1>\n This is the base to be used for the prerelease identifier.\n\n-p --include-prerelease\n Always include prerelease versions in range matching\n\n-c --coerce\n Coerce a string into SemVer if possible\n (does not imply --loose)\n\n--rtl\n Coerce version strings right to left\n\n--ltr\n Coerce version strings left to right (default)\n\nProgram exits successfully if any valid version satisfies\nall supplied ranges, and prints all satisfying versions.\n\nIf no satisfying versions are found, then exits failure.\n\nVersions are printed in ascending order, so supplying\nmultiple versions to the utility will just sort them.\n```\n\n## Versions\n\nA \"version\" is described by the `v2.0.0` specification found at\n<https://semver.org/>.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nA `version range` is a set of `comparators` that specify versions\nthat satisfy the range.\n\nA `comparator` is composed of an `operator` and a `version`. The set\nof primitive `operators` is:\n\n* `<` Less than\n* `<=` Less than or equal to\n* `>` Greater than\n* `>=` Greater than or equal to\n* `=` Equal. If no operator is specified, then equality is assumed,\n so this operator is optional but MAY be included.\n\nFor example, the comparator `>=1.2.7` would match the versions\n`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`\nor `1.1.0`. The comparator `>1` is equivalent to `>=2.0.0` and\nwould match the versions `2.0.0` and `3.1.0`, but not the versions\n`1.0.1` or `1.1.0`.\n\nComparators can be joined by whitespace to form a `comparator set`,\nwhich is satisfied by the **intersection** of all of the comparators\nit includes.\n\nA range is composed of one or more comparator sets, joined by `||`. A\nversion matches a range if and only if every comparator in at least\none of the `||`-separated comparator sets is satisfied by the version.\n\nFor example, the range `>=1.2.7 <1.3.0` would match the versions\n`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,\nor `1.1.0`.\n\nThe range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,\n`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.\n\n### Prerelease Tags\n\nIf a version has a prerelease tag (for example, `1.2.3-alpha.3`) then\nit will only be allowed to satisfy comparator sets if at least one\ncomparator with the same `[major, minor, patch]` tuple also has a\nprerelease tag.\n\nFor example, the range `>1.2.3-alpha.3` would be allowed to match the\nversion `1.2.3-alpha.7`, but it would *not* be satisfied by\n`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically \"greater\nthan\" `1.2.3-alpha.3` according to the SemVer sort rules. The version\nrange only accepts prerelease tags on the `1.2.3` version.\nVersion `3.4.5` *would* satisfy the range because it does not have a\nprerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.\n\nThe purpose of this behavior is twofold. First, prerelease versions\nfrequently are updated very quickly, and contain many breaking changes\nthat are (by the author's design) not yet fit for public consumption.\nTherefore, by default, they are excluded from range-matching\nsemantics.\n\nSecond, a user who has opted into using a prerelease version has\nindicated the intent to use *that specific* set of\nalpha/beta/rc versions. By including a prerelease tag in the range,\nthe user is indicating that they are aware of the risk. However, it\nis still not appropriate to assume that they have opted into taking a\nsimilar risk on the *next* set of prerelease versions.\n\nNote that this behavior can be suppressed (treating all prerelease\nversions as if they were normal versions, for range-matching)\nby setting the `includePrerelease` flag on the options\nobject to any\n[functions](https://github.com/npm/node-semver#functions) that do\nrange matching.\n\n#### Prerelease Identifiers\n\nThe method `.inc` takes an additional `identifier` string argument that\nwill append the value of the string as a prerelease identifier:\n\n```javascript\nsemver.inc('1.2.3', 'prerelease', 'beta')\n// '1.2.4-beta.0'\n```\n\ncommand-line example:\n\n```bash\n$ semver 1.2.3 -i prerelease --preid beta\n1.2.4-beta.0\n```\n\nWhich then can be used to increment further:\n\n```bash\n$ semver 1.2.4-beta.0 -i prerelease\n1.2.4-beta.1\n```\n\n#### Prerelease Identifier Base\n\nThe method `.inc` takes an optional parameter 'identifierBase' string\nthat will let you let your prerelease number as zero-based or one-based.\nSet to `false` to omit the prerelease number altogether.\nIf you do not specify this parameter, it will default to zero-based.\n\n```javascript\nsemver.inc('1.2.3', 'prerelease', 'beta', '1')\n// '1.2.4-beta.1'\n```\n\n```javascript\nsemver.inc('1.2.3', 'prerelease', 'beta', false)\n// '1.2.4-beta'\n```\n\ncommand-line example:\n\n```bash\n$ semver 1.2.3 -i prerelease --preid beta -n 1\n1.2.4-beta.1\n```\n\n```bash\n$ semver 1.2.3 -i prerelease --preid beta -n false\n1.2.4-beta\n```\n\n### Advanced Range Syntax\n\nAdvanced range syntax desugars to primitive comparators in\ndeterministic ways.\n\nAdvanced ranges may be combined in the same way as primitive\ncomparators using white space or `||`.\n\n#### Hyphen Ranges `X.Y.Z - A.B.C`\n\nSpecifies an inclusive set.\n\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n\nIf a partial version is provided as the first version in the inclusive\nrange, then the missing pieces are replaced with zeroes.\n\n* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`\n\nIf a partial version is provided as the second version in the\ninclusive range, then all versions that start with the supplied parts\nof the tuple are accepted, but nothing that would be greater than the\nprovided tuple parts.\n\n* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0`\n* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0`\n\n#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`\n\nAny of `X`, `x`, or `*` may be used to \"stand in\" for one of the\nnumeric values in the `[major, minor, patch]` tuple.\n\n* `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless\n `includePrerelease` is specified, in which case any version at all\n satisfies)\n* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version)\n* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions)\n\nA partial version range is treated as an X-Range, so the special\ncharacter is in fact optional.\n\n* `\"\"` (empty string) := `*` := `>=0.0.0`\n* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0`\n* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0`\n\n#### Tilde Ranges `~1.2.3` `~1.2` `~1`\n\nAllows patch-level changes if a minor version is specified on the\ncomparator. Allows minor-level changes if not.\n\n* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0`\n* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`)\n* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`)\n* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0`\n* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`)\n* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`)\n* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in\n the `1.2.3` version will be allowed, if they are greater than or\n equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but\n `1.2.4-beta.2` would not, because it is a prerelease of a\n different `[major, minor, patch]` tuple.\n\n#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`\n\nAllows changes that do not modify the left-most non-zero element in the\n`[major, minor, patch]` tuple. In other words, this allows patch and\nminor updates for versions `1.0.0` and above, patch updates for\nversions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.\n\nMany authors treat a `0.x` version as if the `x` were the major\n\"breaking-change\" indicator.\n\nCaret ranges are ideal when an author may make breaking changes\nbetween `0.2.4` and `0.3.0` releases, which is a common practice.\nHowever, it presumes that there will *not* be breaking changes between\n`0.2.4` and `0.2.5`. It allows for changes that are presumed to be\nadditive (but non-breaking), according to commonly observed practices.\n\n* `^1.2.3` := `>=1.2.3 <2.0.0-0`\n* `^0.2.3` := `>=0.2.3 <0.3.0-0`\n* `^0.0.3` := `>=0.0.3 <0.0.4-0`\n* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in\n the `1.2.3` version will be allowed, if they are greater than or\n equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but\n `1.2.4-beta.2` would not, because it is a prerelease of a\n different `[major, minor, patch]` tuple.\n* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0` Note that prereleases in the\n `0.0.3` version *only* will be allowed, if they are greater than or\n equal to `beta`. So, `0.0.3-pr.2` would be allowed.\n\nWhen parsing caret ranges, a missing `patch` value desugars to the\nnumber `0`, but will allow flexibility within that value, even if the\nmajor and minor versions are both `0`.\n\n* `^1.2.x` := `>=1.2.0 <2.0.0-0`\n* `^0.0.x` := `>=0.0.0 <0.1.0-0`\n* `^0.0` := `>=0.0.0 <0.1.0-0`\n\nA missing `minor` and `patch` values will desugar to zero, but also\nallow flexibility within those values, even if the major version is\nzero.\n\n* `^1.x` := `>=1.0.0 <2.0.0-0`\n* `^0.x` := `>=0.0.0 <1.0.0-0`\n\n### Range Grammar\n\nPutting all this together, here is a Backus-Naur grammar for ranges,\nfor the benefit of parser authors:\n\n```bnf\nrange-set ::= range ( logical-or range ) *\nlogical-or ::= ( ' ' ) * '||' ( ' ' ) *\nrange ::= hyphen | simple ( ' ' simple ) * | ''\nhyphen ::= partial ' - ' partial\nsimple ::= primitive | partial | tilde | caret\nprimitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial\npartial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?\nxr ::= 'x' | 'X' | '*' | nr\nnr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *\ntilde ::= '~' partial\ncaret ::= '^' partial\nqualifier ::= ( '-' pre )? ( '+' build )?\npre ::= parts\nbuild ::= parts\nparts ::= part ( '.' part ) *\npart ::= nr | [-0-9A-Za-z]+\n```\n\n## Functions\n\nAll methods and classes take a final `options` object argument. All\noptions in this object are `false` by default. The options supported\nare:\n\n- `loose`: Be more forgiving about not-quite-valid semver strings.\n (Any resulting output will always be 100% strict compliant, of\n course.) For backwards compatibility reasons, if the `options`\n argument is a boolean value instead of an object, it is interpreted\n to be the `loose` param.\n- `includePrerelease`: Set to suppress the [default\n behavior](https://github.com/npm/node-semver#prerelease-tags) of\n excluding prerelease tagged versions from ranges unless they are\n explicitly opted into.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* `valid(v)`: Return the parsed version, or null if it's not valid.\n* `inc(v, release, options, identifier, identifierBase)`: \n Return the version incremented by the release\n type (`major`, `premajor`, `minor`, `preminor`, `patch`,\n `prepatch`, or `prerelease`), or null if it's not valid\n * `premajor` in one call will bump the version up to the next major\n version and down to a prerelease of that major version.\n `preminor`, and `prepatch` work the same way.\n * If called from a non-prerelease version, `prerelease` will work the\n same as `prepatch`. It increments the patch version and then makes a\n prerelease. If the input version is already a prerelease it simply\n increments it.\n * `identifier` can be used to prefix `premajor`, `preminor`,\n `prepatch`, or `prerelease` version increments. `identifierBase`\n is the base to be used for the `prerelease` identifier.\n* `prerelease(v)`: Returns an array of prerelease components, or null\n if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`\n* `major(v)`: Return the major version number.\n* `minor(v)`: Return the minor version number.\n* `patch(v)`: Return the patch version number.\n* `intersects(r1, r2, loose)`: Return true if the two supplied ranges\n or comparators intersect.\n* `parse(v)`: Attempt to parse a string as a semantic version, returning either\n a `SemVer` object or `null`.\n\n### Comparison\n\n* `gt(v1, v2)`: `v1 > v2`\n* `gte(v1, v2)`: `v1 >= v2`\n* `lt(v1, v2)`: `v1 < v2`\n* `lte(v1, v2)`: `v1 <= v2`\n* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,\n even if they're not the same string. You already know how to\n compare strings.\n* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.\n* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call\n the corresponding function above. `\"===\"` and `\"!==\"` do simple\n string comparison, but are included for completeness. Throws if an\n invalid comparison string is provided.\n* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if\n `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.\n* `rcompare(v1, v2)`: The reverse of `compare`. Sorts an array of versions\n in descending order when passed to `Array.sort()`.\n* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions\n are equal. Sorts in ascending order if passed to `Array.sort()`.\n* `compareLoose(v1, v2)`: Short for ``compare(v1, v2, { loose: true })`.\n* `diff(v1, v2)`: Returns the difference between two versions by the release type\n (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),\n or null if the versions are the same.\n\n### Sorting\n\n* `sort(versions)`: Returns a sorted array of versions based on the `compareBuild` \n function.\n* `rsort(versions)`: The reverse of `sort`. Returns an array of versions based on\n the `compareBuild` function in descending order.\n\n### Comparators\n\n* `intersects(comparator)`: Return true if the comparators intersect\n\n### Ranges\n\n* `validRange(range)`: Return the valid range or null if it's not valid\n* `satisfies(version, range)`: Return true if the version satisfies the\n range.\n* `maxSatisfying(versions, range)`: Return the highest version in the list\n that satisfies the range, or `null` if none of them do.\n* `minSatisfying(versions, range)`: Return the lowest version in the list\n that satisfies the range, or `null` if none of them do.\n* `minVersion(range)`: Return the lowest version that can match\n the given range.\n* `gtr(version, range)`: Return `true` if the version is greater than all the\n versions possible in the range.\n* `ltr(version, range)`: Return `true` if the version is less than all the\n versions possible in the range.\n* `outside(version, range, hilo)`: Return true if the version is outside\n the bounds of the range in either the high or low direction. The\n `hilo` argument must be either the string `'>'` or `'<'`. (This is\n the function called by `gtr` and `ltr`.)\n* `intersects(range)`: Return true if any of the range comparators intersect.\n* `simplifyRange(versions, range)`: Return a \"simplified\" range that\n matches the same items in the `versions` list as the range specified. Note\n that it does *not* guarantee that it would match the same versions in all\n cases, only for the set of versions provided. This is useful when\n generating ranges by joining together multiple versions with `||`\n programmatically, to provide the user with something a bit more\n ergonomic. If the provided range is shorter in string-length than the\n generated range, then that is returned.\n* `subset(subRange, superRange)`: Return `true` if the `subRange` range is\n entirely contained by the `superRange` range.\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range! For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so version `1.2.10` would not be greater than the\nrange (because `2.0.1` satisfies, which is higher), nor less than the\nrange (since `1.2.8` satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n\n### Coercion\n\n* `coerce(version, options)`: Coerces a string to semver if possible\n\nThis aims to provide a very forgiving translation of a non-semver string to\nsemver. It looks for the first digit in a string and consumes all\nremaining characters which satisfy at least a partial semver (e.g., `1`,\n`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer\nversions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All\nsurrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes\n`3.4.0`). Only text which lacks digits will fail coercion (`version one`\nis not valid). The maximum length for any semver component considered for\ncoercion is 16 characters; longer components will be ignored\n(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any\nsemver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value\ncomponents are invalid (`9999999999999999.4.7.4` is likely invalid).\n\nIf the `options.rtl` flag is set, then `coerce` will return the right-most\ncoercible tuple that does not share an ending index with a longer coercible\ntuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not\n`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of\nany other overlapping SemVer tuple.\n\nIf the `options.includePrerelease` flag is set, then the `coerce` result will contain\nprerelease and build parts of a version. For example, `1.2.3.4-rc.1+rev.2`\nwill preserve prerelease `rc.1` and build `rev.2` in the result.\n\n### Clean\n\n* `clean(version)`: Clean a string to be a valid semver if possible\n\nThis will return a cleaned and trimmed semver version. If the provided\nversion is not valid a null will be returned. This does not work for\nranges.\n\nex.\n* `s.clean(' = v 2.1.5foo')`: `null`\n* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`\n* `s.clean(' = v 2.1.5-foo')`: `null`\n* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`\n* `s.clean('=v2.1.5')`: `'2.1.5'`\n* `s.clean(' =v2.1.5')`: `'2.1.5'`\n* `s.clean(' 2.1.5 ')`: `'2.1.5'`\n* `s.clean('~1.0.0')`: `null`\n\n## Constants\n\nAs a convenience, helper constants are exported to provide information about what `node-semver` supports:\n\n### `RELEASE_TYPES`\n\n- major\n- premajor\n- minor\n- preminor\n- patch\n- prepatch\n- prerelease\n\n```\nconst semver = require('semver');\n\nif (semver.RELEASE_TYPES.includes(arbitraryUserInput)) {\n console.log('This is a valid release type!');\n} else {\n console.warn('This is NOT a valid release type!');\n}\n```\n\n### `SEMVER_SPEC_VERSION`\n\n2.0.0\n\n```\nconst semver = require('semver');\n\nconsole.log('We are currently using the semver specification version:', semver.SEMVER_SPEC_VERSION);\n```\n\n## Exported Modules\n\n<!--\nTODO: Make sure that all of these items are documented (classes aren't,\neg), and then pull the module name into the documentation for that specific\nthing.\n-->\n\nYou may pull in just the part of this semver utility that you need if you\nare sensitive to packing and tree-shaking concerns. The main\n`require('semver')` export uses getter functions to lazily load the parts\nof the API that are used.\n\nThe following modules are available:\n\n* `require('semver')`\n* `require('semver/classes')`\n* `require('semver/classes/comparator')`\n* `require('semver/classes/range')`\n* `require('semver/classes/semver')`\n* `require('semver/functions/clean')`\n* `require('semver/functions/cmp')`\n* `require('semver/functions/coerce')`\n* `require('semver/functions/compare')`\n* `require('semver/functions/compare-build')`\n* `require('semver/functions/compare-loose')`\n* `require('semver/functions/diff')`\n* `require('semver/functions/eq')`\n* `require('semver/functions/gt')`\n* `require('semver/functions/gte')`\n* `require('semver/functions/inc')`\n* `require('semver/functions/lt')`\n* `require('semver/functions/lte')`\n* `require('semver/functions/major')`\n* `require('semver/functions/minor')`\n* `require('semver/functions/neq')`\n* `require('semver/functions/parse')`\n* `require('semver/functions/patch')`\n* `require('semver/functions/prerelease')`\n* `require('semver/functions/rcompare')`\n* `require('semver/functions/rsort')`\n* `require('semver/functions/satisfies')`\n* `require('semver/functions/sort')`\n* `require('semver/functions/valid')`\n* `require('semver/ranges/gtr')`\n* `require('semver/ranges/intersects')`\n* `require('semver/ranges/ltr')`\n* `require('semver/ranges/max-satisfying')`\n* `require('semver/ranges/min-satisfying')`\n* `require('semver/ranges/min-version')`\n* `require('semver/ranges/outside')`\n* `require('semver/ranges/simplify')`\n* `require('semver/ranges/subset')`\n* `require('semver/ranges/to-comparators')`\n* `require('semver/ranges/valid')`\n\n","readmeFilename":"README.md"}
+{
+ "name": "semver",
+ "description": "The semantic version parser used by npm.",
+ "dist-tags": {
+ "latest": "7.6.2"
+ },
+ "versions": {
+ "7.6.2": {
+ "name": "semver",
+ "version": "7.6.2",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "semver@7.6.2",
+ "bugs": {
+ "url": "https://github.com/npm/node-semver/issues"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "timeout": 30,
+ "coverage-map": "map.js"
+ },
+ "dist": {
+ "shasum": "1e3b34759f896e8f14d6134732ce798aeb0c6e13",
+ "tarball": "http://localhost:4260/semver/semver-7.6.2.tgz",
+ "fileCount": 52,
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/semver@7.6.2",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 95424
+ },
+ "main": "index.js",
+ "engines": {
+ "node": ">=10"
+ },
+ "gitHead": "eb1380b1ecd74f6572831294d55ef4537dfe1a2a",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/node-semver.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "The semantic version parser used by npm.",
+ "directories": {},
+ "templateOSS": {
+ "engines": ">=10",
+ "publish": "true",
+ "version": "4.22.0",
+ "distPaths": [
+ "classes/",
+ "functions/",
+ "internal/",
+ "ranges/",
+ "index.js",
+ "preload.js",
+ "range.bnf"
+ ],
+ "allowPaths": [
+ "/classes/",
+ "/functions/",
+ "/internal/",
+ "/ranges/",
+ "/index.js",
+ "/preload.js",
+ "/range.bnf",
+ "/benchmarks"
+ ],
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "22.1.0",
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.0",
+ "benchmark": "^2.1.4",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/node-semver.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/node-semver#readme",
+ "bugs": {
+ "url": "https://github.com/npm/node-semver/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/set-blocking/registry.json b/tests/registry/npm/set-blocking/registry.json
index 1733b777c..bd0cb932c 100644
--- a/tests/registry/npm/set-blocking/registry.json
+++ b/tests/registry/npm/set-blocking/registry.json
@@ -1 +1,70 @@
-{"name":"set-blocking","description":"set blocking stdio and stderr ensuring that terminal output does not truncate","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"set-blocking","version":"2.0.0","description":"set blocking stdio and stderr ensuring that terminal output does not truncate","main":"index.js","scripts":{"pretest":"standard","test":"nyc mocha ./test/*.js","coverage":"nyc report --reporter=text-lcov | coveralls","version":"standard-version"},"repository":{"type":"git","url":"git+https://github.com/yargs/set-blocking.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","bugs":{"url":"https://github.com/yargs/set-blocking/issues"},"devDependencies":{"chai":"^3.5.0","coveralls":"^2.11.9","mocha":"^2.4.5","nyc":"^6.4.4","standard":"^7.0.1","standard-version":"^2.2.1"},"files":["index.js","LICENSE.txt"],"gitHead":"7eec10577b5fff264de477ba3b9d07f404946eff","_id":"set-blocking@2.0.0","_shasum":"045f9782d011ae9a6803ddd382b24392b3d890f7","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","dist":{"shasum":"045f9782d011ae9a6803ddd382b24392b3d890f7","tarball":"http://localhost:4260/set-blocking/set-blocking-2.0.0.tgz","integrity":"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC7PKDtLSfgEG/qqzrcxx2Khs2CK9p75Arv9+g4Bdt8aAiEApBbZwIIifoIUzRmqNhH90HEOVMzYU/PkU6J14r2GWT8="}]}}},"readme":"# set-blocking\n\n[![Build Status](https://travis-ci.org/yargs/set-blocking.svg)](https://travis-ci.org/yargs/set-blocking)\n[![NPM version](https://img.shields.io/npm/v/set-blocking.svg)](https://www.npmjs.com/package/set-blocking)\n[![Coverage Status](https://coveralls.io/repos/yargs/set-blocking/badge.svg?branch=)](https://coveralls.io/r/yargs/set-blocking?branch=master)\n[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)\n\nset blocking `stdio` and `stderr` ensuring that terminal output does not truncate.\n\n```js\nconst setBlocking = require('set-blocking')\nsetBlocking(true)\nconsole.log(someLargeStringToOutput)\n```\n\n## Historical Context/Word of Warning\n\nThis was created as a shim to address the bug discussed in [node #6456](https://github.com/nodejs/node/issues/6456). This bug crops up on\nnewer versions of Node.js (`0.12+`), truncating terminal output.\n\nYou should be mindful of the side-effects caused by using `set-blocking`:\n\n* if your module sets blocking to `true`, it will effect other modules\n consuming your library. In [yargs](https://github.com/yargs/yargs/blob/master/yargs.js#L653) we only call\n `setBlocking(true)` once we already know we are about to call `process.exit(code)`.\n* this patch will not apply to subprocesses spawned with `isTTY = true`, this is\n the [default `spawn()` behavior](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options).\n\n## License\n\nISC\n","homepage":"https://github.com/yargs/set-blocking#readme","repository":{"type":"git","url":"git+https://github.com/yargs/set-blocking.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"bugs":{"url":"https://github.com/yargs/set-blocking/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "set-blocking",
+ "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "set-blocking",
+ "version": "2.0.0",
+ "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "standard",
+ "test": "nyc mocha ./test/*.js",
+ "coverage": "nyc report --reporter=text-lcov | coveralls",
+ "version": "standard-version"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/set-blocking.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/yargs/set-blocking/issues"
+ },
+ "devDependencies": {
+ "chai": "^3.5.0",
+ "coveralls": "^2.11.9",
+ "mocha": "^2.4.5",
+ "nyc": "^6.4.4",
+ "standard": "^7.0.1",
+ "standard-version": "^2.2.1"
+ },
+ "files": [
+ "index.js",
+ "LICENSE.txt"
+ ],
+ "gitHead": "7eec10577b5fff264de477ba3b9d07f404946eff",
+ "_id": "set-blocking@2.0.0",
+ "_shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7",
+ "_from": ".",
+ "_npmVersion": "2.11.3",
+ "_nodeVersion": "0.12.7",
+ "dist": {
+ "shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7",
+ "tarball": "http://localhost:4260/set-blocking/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ }
+ }
+ },
+ "homepage": "https://github.com/yargs/set-blocking#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/set-blocking.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/set-blocking/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/shebang-command/registry.json b/tests/registry/npm/shebang-command/registry.json
index d2d744bbc..abd8ba287 100644
--- a/tests/registry/npm/shebang-command/registry.json
+++ b/tests/registry/npm/shebang-command/registry.json
@@ -1 +1,68 @@
-{"name":"shebang-command","description":"Get the command from a shebang","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"shebang-command","version":"2.0.0","description":"Get the command from a shebang","license":"MIT","repository":{"type":"git","url":"git+https://github.com/kevva/shebang-command.git"},"author":{"name":"Kevin Mårtensson","email":"kevinmartensson@gmail.com","url":"github.com/kevva"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava"},"dependencies":{"shebang-regex":"^3.0.0"},"devDependencies":{"ava":"^2.3.0","xo":"^0.24.0"},"gitHead":"003c4c7d6882d029aa8b3e5777716d726894d734","bugs":{"url":"https://github.com/kevva/shebang-command/issues"},"_id":"shebang-command@2.0.0","_nodeVersion":"12.10.0","_npmVersion":"6.10.3","dist":{"integrity":"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==","shasum":"ccd0af4f8835fbdc265b82461aaf0c36663f34ea","tarball":"http://localhost:4260/shebang-command/shebang-command-2.0.0.tgz","fileCount":4,"unpackedSize":2556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcnLmCRA9TVsSAnZWagAAROUP/3bwpa2H+ex3cAS2e/+8\n5eIXgsHtrSb03h3rZ4rDbpeSBgcpZaH3hBCLTpptdDT+CU781SZI9Dk+XZLJ\npD3f/FT9tt9JSkIUlVqBi1lR2zSY+Ao2cdZMgz6eGW0DN1lIWX6+39p2D3I+\nX09wEatT/wxLRGmu6cjrcSV4KxcvrikLXfSWC5xF892Rzkhs+P6n79KLgsoU\niISEGGg91MPQEB2hyMRCBzFgSTo3UPVtRNaX4joz6CU8Xc9+FSLq/bKLWEUy\nZmPAnqr0B5GhMtqge8bG9NNU/RMg9LV30FUZt0wVCPwWYewxXayOONXmmncw\nudV/EgufhR9M5af2Ah3oJut0BVtTAol1J0+Uvfc3xNjrU/LYsldUHYd/lv8o\ngXL4eg21xqbh+6MmTViC1pyeoY/S0K2YErgii9ZCraf0MAfS+Goj3RaEv974\nNWE+73eyFtPgdTebV2qkCkV+fhCGPOIb4dOIVlcIswyPOBLDQDdSkZQpR4Ja\nSIkNTAFI7CnvEDt0CRjDiEKIdq6t21g6zSBEUmt4eGy8yuG+IJMl294T0NWv\nB+YUWol5Q0KKNopeU2Ss863DuVbL+o2jkP1zkz1RCqzWtwtU3KVfHMi/53tA\ntUUFXbfNT2+dIfRZ+AvBcowtHF+BiIKfQ+C+RH7KQvHi5zQIi7+Vl5t6rC7M\noLaS\r\n=x6EW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC25PLpUCo3H8DMi9MpLxwheAbym3M3S5MW5QaCZpOUEwIhAIka9U63aHBdDqIcMUiGesgVKHjIiySGTAsxdQJx7wSP"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# shebang-command [![Build Status](https://travis-ci.org/kevva/shebang-command.svg?branch=master)](https://travis-ci.org/kevva/shebang-command)\n\n> Get the command from a shebang\n\n\n## Install\n\n```\n$ npm install shebang-command\n```\n\n\n## Usage\n\n```js\nconst shebangCommand = require('shebang-command');\n\nshebangCommand('#!/usr/bin/env node');\n//=> 'node'\n\nshebangCommand('#!/bin/bash');\n//=> 'bash'\n```\n\n\n## API\n\n### shebangCommand(string)\n\n#### string\n\nType: `string`\n\nString containing a shebang.\n","homepage":"https://github.com/kevva/shebang-command#readme","repository":{"type":"git","url":"git+https://github.com/kevva/shebang-command.git"},"author":{"name":"Kevin Mårtensson","email":"kevinmartensson@gmail.com","url":"github.com/kevva"},"bugs":{"url":"https://github.com/kevva/shebang-command/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "shebang-command",
+ "description": "Get the command from a shebang",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "shebang-command",
+ "version": "2.0.0",
+ "description": "Get the command from a shebang",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/kevva/shebang-command.git"
+ },
+ "author": {
+ "name": "Kevin Mårtensson",
+ "email": "kevinmartensson@gmail.com",
+ "url": "github.com/kevva"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.3.0",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "003c4c7d6882d029aa8b3e5777716d726894d734",
+ "bugs": {
+ "url": "https://github.com/kevva/shebang-command/issues"
+ },
+ "_id": "shebang-command@2.0.0",
+ "_nodeVersion": "12.10.0",
+ "_npmVersion": "6.10.3",
+ "dist": {
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "shasum": "ccd0af4f8835fbdc265b82461aaf0c36663f34ea",
+ "tarball": "http://localhost:4260/shebang-command/shebang-command-2.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 2556
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/kevva/shebang-command#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/kevva/shebang-command.git"
+ },
+ "author": {
+ "name": "Kevin Mårtensson",
+ "email": "kevinmartensson@gmail.com",
+ "url": "github.com/kevva"
+ },
+ "bugs": {
+ "url": "https://github.com/kevva/shebang-command/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/shebang-regex/registry.json b/tests/registry/npm/shebang-regex/registry.json
index 16a2978af..533cd68a3 100644
--- a/tests/registry/npm/shebang-regex/registry.json
+++ b/tests/registry/npm/shebang-regex/registry.json
@@ -1 +1,66 @@
-{"name":"shebang-regex","description":"Regular expression for matching a shebang line","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"name":"shebang-regex","version":"3.0.0","description":"Regular expression for matching a shebang line","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/shebang-regex.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.2","xo":"^0.24.0"},"gitHead":"27a9a6f0f85c04b9c37a43cf7503fdb58f5ae8d6","bugs":{"url":"https://github.com/sindresorhus/shebang-regex/issues"},"_id":"shebang-regex@3.0.0","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==","shasum":"ae16f1644d873ecad843b0307b143362d4c42172","tarball":"http://localhost:4260/shebang-regex/shebang-regex-3.0.0.tgz","fileCount":5,"unpackedSize":2828,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcxDL7CRA9TVsSAnZWagAAWYAP/R5EbXIFL5aDT7Yavy5P\nrcZIWN4fQwwlFp/YdSocsX/lBlwgJ0axGZsoVxZ78y5TjJZbvJ+6YwYkUGuf\n4bCkNLWdnmI9xNdShULSc1gExlnH/+3ubiKoosm9hJ2z+5CFNB1OWmuxSIxw\nIo/6aSYhhzFmWDrwKkwB4fbb2SMMuyGnHCAq2TolakuSk75OJlHF7xRZWZ5k\nko/2f0CiSaP1OllRMBYWssHCAaEjdXqjOy1fCvoHgTw+aPYWZWnZSlKyQkzu\n20EAgEVhYQkiyZxNNCj40I6VTgr2mZnxTftZx49HwqfVs5qoU8DmCit+pMJd\nY+chiFfltBymUrF54j986kRUc/MkXNsWsRPFzzVg/9mOJAO+n9dW6rMcAM4f\nLbB7ZT5ah8PbgcXlUVCM4nEexLSFKFUhB9GATw/SSEgG/rTdd8sskIPb7lGj\nwMdqDvYh+oTc2r3r8Dl4lQRt/hrmHX3jk5Mf4de+IAPld5+9YDkqCcsev2w8\n44LoqmclULeuxcJPo2IA6K/gbKBmOjWjIuyBdV+8OX4xZFM4Eu9n1NTT7olT\nbGSIkVxASNiIqiatCMl5qqKnClqzY4F+bDVNe+KK6aaPvvV4ShktD4I682pH\nzULKVxadENPKGKhX/Y2xu7va9+GqbHTVwODuFH77n0AXf+BCirHFiKbGSqZg\nGT1V\r\n=FKXn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9D5iHzHiq8RRcvBjhnVc1TDXKPStoeEAQrqtkEg9qXAIgPFNBElrbSUhCoAjEd/BRJo48gQudG1I1KkUMNo6x+/E="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# shebang-regex\n\n> Regular expression for matching a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) line\n\n## Install\n\n```\n$ npm install shebang-regex\n```\n\n## Usage\n\n```js\nimport shebangRegex from 'shebang-regex';\n\nconst string = '#!/usr/bin/env node\\nconsole.log(\"unicorns\");';\n\nshebangRegex.test(string);\n//=> true\n\nshebangRegex.exec(string)[0];\n//=> '#!/usr/bin/env node'\n\nshebangRegex.exec(string)[1];\n//=> '/usr/bin/env node'\n```\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-shebang-regex?utm_source=npm-shebang-regex&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/shebang-regex#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/shebang-regex.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/shebang-regex/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "shebang-regex",
+ "description": "Regular expression for matching a shebang line",
+ "dist-tags": {
+ "latest": "3.0.0"
+ },
+ "versions": {
+ "3.0.0": {
+ "name": "shebang-regex",
+ "version": "3.0.0",
+ "description": "Regular expression for matching a shebang line",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/shebang-regex.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "27a9a6f0f85c04b9c37a43cf7503fdb58f5ae8d6",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/shebang-regex/issues"
+ },
+ "_id": "shebang-regex@3.0.0",
+ "_nodeVersion": "10.15.3",
+ "_npmVersion": "6.9.0",
+ "dist": {
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "shasum": "ae16f1644d873ecad843b0307b143362d4c42172",
+ "tarball": "http://localhost:4260/shebang-regex/shebang-regex-3.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 2828
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/shebang-regex#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/shebang-regex.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/shebang-regex/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/signal-exit/registry.json b/tests/registry/npm/signal-exit/registry.json
index 8bac2dc31..bc6f13df6 100644
--- a/tests/registry/npm/signal-exit/registry.json
+++ b/tests/registry/npm/signal-exit/registry.json
@@ -1 +1,141 @@
-{"name":"signal-exit","description":"when you want to fire an event no matter how a process exits.","dist-tags":{"latest":"4.1.0"},"versions":{"4.1.0":{"name":"signal-exit","version":"4.1.0","description":"when you want to fire an event no matter how a process exits.","main":"./dist/cjs/index.js","module":"./dist/mjs/index.js","browser":"./dist/mjs/browser.js","types":"./dist/mjs/index.d.ts","exports":{".":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./signals":{"import":{"types":"./dist/mjs/signals.d.ts","default":"./dist/mjs/signals.js"},"require":{"types":"./dist/cjs/signals.d.ts","default":"./dist/cjs/signals.js"}},"./browser":{"import":{"types":"./dist/mjs/browser.d.ts","default":"./dist/mjs/browser.js"},"require":{"types":"./dist/cjs/browser.d.ts","default":"./dist/cjs/browser.js"}}},"engines":{"node":">=14"},"repository":{"type":"git","url":"git+https://github.com/tapjs/signal-exit.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","devDependencies":{"@types/cross-spawn":"^6.0.2","@types/node":"^18.15.11","@types/signal-exit":"^3.0.1","@types/tap":"^15.0.8","c8":"^7.13.0","prettier":"^2.8.6","tap":"^16.3.4","ts-node":"^10.9.1","typedoc":"^0.23.28","typescript":"^5.0.2"},"scripts":{"preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","preprepare":"rm -rf dist","prepare":"tsc -p tsconfig.json && tsc -p tsconfig-esm.json && bash ./scripts/fixup.sh","pretest":"npm run prepare","presnap":"npm run prepare","test":"c8 tap","snap":"c8 tap","format":"prettier --write . --loglevel warn","typedoc":"typedoc --tsconfig tsconfig-esm.json ./src/*.ts"},"prettier":{"semi":false,"printWidth":75,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"tap":{"coverage":false,"jobs":1,"node-arg":["--no-warnings","--loader","ts-node/esm"],"ts":false},"funding":{"url":"https://github.com/sponsors/isaacs"},"gitHead":"458776d9cf8be89712aa1f7b45bb2163ce15ef4a","bugs":{"url":"https://github.com/tapjs/signal-exit/issues"},"_id":"signal-exit@4.1.0","_nodeVersion":"18.16.0","_npmVersion":"9.7.2","dist":{"integrity":"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==","shasum":"952188c1cbd546070e2dd20d0f41c0ae0530cb04","tarball":"http://localhost:4260/signal-exit/signal-exit-4.1.0.tgz","fileCount":29,"unpackedSize":76966,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC17YSNmo/hSXVVI2cchqvs3la7twHltiehlUoPq/9VGgIgD2Hb18tHfjmWx8vendx1mWOOOYvu7+XRLUj+wwxejPE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# signal-exit\n\nWhen you want to fire an event no matter how a process exits:\n\n- reaching the end of execution.\n- explicitly having `process.exit(code)` called.\n- having `process.kill(pid, sig)` called.\n- receiving a fatal signal from outside the process\n\nUse `signal-exit`.\n\n```js\n// Hybrid module, either works\nimport { onExit } from 'signal-exit'\n// or:\n// const { onExit } = require('signal-exit')\n\nonExit((code, signal) => {\n console.log('process exited!', code, signal)\n})\n```\n\n## API\n\n`remove = onExit((code, signal) => {}, options)`\n\nThe return value of the function is a function that will remove\nthe handler.\n\nNote that the function _only_ fires for signals if the signal\nwould cause the process to exit. That is, there are no other\nlisteners, and it is a fatal signal.\n\nIf the global `process` object is not suitable for this purpose\n(ie, it's unset, or doesn't have an `emit` method, etc.) then the\n`onExit` function is a no-op that returns a no-op `remove` method.\n\n### Options\n\n- `alwaysLast`: Run this handler after any other signal or exit\n handlers. This causes `process.emit` to be monkeypatched.\n\n### Capturing Signal Exits\n\nIf the handler returns an exact boolean `true`, and the exit is a\ndue to signal, then the signal will be considered handled, and\nwill _not_ trigger a synthetic `process.kill(process.pid,\nsignal)` after firing the `onExit` handlers.\n\nIn this case, it your responsibility as the caller to exit with a\nsignal (for example, by calling `process.kill()`) if you wish to\npreserve the same exit status that would otherwise have occurred.\nIf you do not, then the process will likely exit gracefully with\nstatus 0 at some point, assuming that no other terminating signal\nor other exit trigger occurs.\n\nPrior to calling handlers, the `onExit` machinery is unloaded, so\nany subsequent exits or signals will not be handled, even if the\nsignal is captured and the exit is thus prevented.\n\nNote that numeric code exits may indicate that the process is\nalready committed to exiting, for example due to a fatal\nexception or unhandled promise rejection, and so there is no way to\nprevent it safely.\n\n### Browser Fallback\n\nThe `'signal-exit/browser'` module is the same fallback shim that\njust doesn't do anything, but presents the same function\ninterface.\n\nPatches welcome to add something that hooks onto\n`window.onbeforeunload` or similar, but it might just not be a\nthing that makes sense there.\n","homepage":"https://github.com/tapjs/signal-exit#readme","repository":{"type":"git","url":"git+https://github.com/tapjs/signal-exit.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"bugs":{"url":"https://github.com/tapjs/signal-exit/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "signal-exit",
+ "description": "when you want to fire an event no matter how a process exits.",
+ "dist-tags": {
+ "latest": "4.1.0"
+ },
+ "versions": {
+ "4.1.0": {
+ "name": "signal-exit",
+ "version": "4.1.0",
+ "description": "when you want to fire an event no matter how a process exits.",
+ "main": "./dist/cjs/index.js",
+ "module": "./dist/mjs/index.js",
+ "browser": "./dist/mjs/browser.js",
+ "types": "./dist/mjs/index.d.ts",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/mjs/index.d.ts",
+ "default": "./dist/mjs/index.js"
+ },
+ "require": {
+ "types": "./dist/cjs/index.d.ts",
+ "default": "./dist/cjs/index.js"
+ }
+ },
+ "./signals": {
+ "import": {
+ "types": "./dist/mjs/signals.d.ts",
+ "default": "./dist/mjs/signals.js"
+ },
+ "require": {
+ "types": "./dist/cjs/signals.d.ts",
+ "default": "./dist/cjs/signals.js"
+ }
+ },
+ "./browser": {
+ "import": {
+ "types": "./dist/mjs/browser.d.ts",
+ "default": "./dist/mjs/browser.js"
+ },
+ "require": {
+ "types": "./dist/cjs/browser.d.ts",
+ "default": "./dist/cjs/browser.js"
+ }
+ }
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tapjs/signal-exit.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "@types/cross-spawn": "^6.0.2",
+ "@types/node": "^18.15.11",
+ "@types/signal-exit": "^3.0.1",
+ "@types/tap": "^15.0.8",
+ "c8": "^7.13.0",
+ "prettier": "^2.8.6",
+ "tap": "^16.3.4",
+ "ts-node": "^10.9.1",
+ "typedoc": "^0.23.28",
+ "typescript": "^5.0.2"
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "preprepare": "rm -rf dist",
+ "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json && bash ./scripts/fixup.sh",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "c8 tap",
+ "snap": "c8 tap",
+ "format": "prettier --write . --loglevel warn",
+ "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "tap": {
+ "coverage": false,
+ "jobs": 1,
+ "node-arg": [
+ "--no-warnings",
+ "--loader",
+ "ts-node/esm"
+ ],
+ "ts": false
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "458776d9cf8be89712aa1f7b45bb2163ce15ef4a",
+ "bugs": {
+ "url": "https://github.com/tapjs/signal-exit/issues"
+ },
+ "_id": "signal-exit@4.1.0",
+ "_nodeVersion": "18.16.0",
+ "_npmVersion": "9.7.2",
+ "dist": {
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "shasum": "952188c1cbd546070e2dd20d0f41c0ae0530cb04",
+ "tarball": "http://localhost:4260/signal-exit/signal-exit-4.1.0.tgz",
+ "fileCount": 29,
+ "unpackedSize": 76966
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/tapjs/signal-exit#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tapjs/signal-exit.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "bugs": {
+ "url": "https://github.com/tapjs/signal-exit/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/smart-buffer/registry.json b/tests/registry/npm/smart-buffer/registry.json
index 399f4355f..1c64950ef 100644
--- a/tests/registry/npm/smart-buffer/registry.json
+++ b/tests/registry/npm/smart-buffer/registry.json
@@ -1 +1,104 @@
-{"name":"smart-buffer","description":"smart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.","dist-tags":{"latest":"4.2.0"},"versions":{"4.2.0":{"name":"smart-buffer","version":"4.2.0","description":"smart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.","main":"build/smartbuffer.js","repository":{"type":"git","url":"git+https://github.com/JoshGlazebrook/smart-buffer.git"},"bugs":{"url":"https://github.com/JoshGlazebrook/smart-buffer/issues"},"engines":{"node":">= 6.0.0","npm":">= 3.0.0"},"author":{"name":"Josh Glazebrook"},"license":"MIT","devDependencies":{"@types/chai":"4.1.7","@types/mocha":"5.2.7","@types/node":"^12.0.0","chai":"4.2.0","coveralls":"3.0.5","istanbul":"^0.4.5","mocha":"6.2.0","mocha-lcov-reporter":"^1.3.0","nyc":"14.1.1","source-map-support":"0.5.12","ts-node":"8.3.0","tslint":"5.18.0","typescript":"^3.2.1"},"typings":"typings/smartbuffer.d.ts","dependencies":{},"scripts":{"prepublish":"npm install -g typescript && npm run build","test":"NODE_ENV=test mocha --recursive --require ts-node/register test/**/*.ts","coverage":"NODE_ENV=test nyc npm test","coveralls":"NODE_ENV=test nyc npm test && nyc report --reporter=text-lcov | coveralls","lint":"tslint --type-check --project tsconfig.json 'src/**/*.ts'","build":"tsc -p ./"},"nyc":{"extension":[".ts",".tsx"],"include":["src/*.ts","src/**/*.ts"],"exclude":["**.*.d.ts","node_modules","typings"],"require":["ts-node/register"],"reporter":["json","html"],"all":true},"gitHead":"2ce01c95312343325997b19e52daa166dc227930","_id":"smart-buffer@4.2.0","_nodeVersion":"12.15.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==","shasum":"6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae","tarball":"http://localhost:4260/smart-buffer/smart-buffer-4.2.0.tgz","fileCount":14,"unpackedSize":138027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDiXOCRA9TVsSAnZWagAAO+QP/2F5Wr4uJuTKXv22jQzC\nGrjpvP2kqaVTOWMd9kOo4OhRBz0LKaNLhHnLM+ckGod0bb8ZwbjgV/9KRNCd\ngRwgA7vqgt2a9PMyviSAf/54BmpShO5enI4e0fWnr9aRaYxjIjno7h7YTmLD\nd6X6Qovlz3KO9yEuPDZtzWpUDVpdUm+ut8ekjlWfgcXsnCb8Q5BhYCp35+X6\n7f9C74u0fxoP97iFQzZ9BNdSeSqv3VGxSRnS4lITSwTw0k+DAbSsHjFUwXrM\nfsSo3JaMI1iuX9HpEufszMnLy8MjPUmCY1vLZc+ELrU+K8JvD2Msj/I2MJPy\nHsxLXiKwGFQGV16Lj0je2PeS3U89bCJxq1oU+Q8duNzYcDCRmQTJQrfBsxyJ\nWV2DH2JyeJd0rLmHf1vSCx84t5kQeUJKZR9B7pDAwVwvjXQ/dLB7TJNqD2kk\niC8Tk/LRXJgYQPSPKW713pw8YClI0xFgkciub0CJAUDFIpfHaG3/GuWkze75\n+7DbuuW80XvfybmKOwLhqmwpK3UIk1BZ0ro9lusgr5X4P9pB7/DV2NUdb3nM\nhXLP+w1mcY4/RLh3vB8VnrgnUOikrG+v1WRa5e9MKVP64Ykk0bray01nQebA\nX5i823xrgi/LA7Bpr8yTt6J9MA176Wqt69kaxnsxmbEd6Iie6e4C9gXEVxSH\nAUG5\r\n=r499\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2wZLWHAReJz5sxVMo9/DxoDHiB46pLxSOQcVFoFbZzQIgKVNzYK1Jg9+fPpdcQ86zDDaKl6OxyiFv/D3TeWcRskM="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"smart-buffer [![Build Status](https://travis-ci.org/JoshGlazebrook/smart-buffer.svg?branch=master)](https://travis-ci.org/JoshGlazebrook/smart-buffer) [![Coverage Status](https://coveralls.io/repos/github/JoshGlazebrook/smart-buffer/badge.svg?branch=master)](https://coveralls.io/github/JoshGlazebrook/smart-buffer?branch=master)\n=============\n\nsmart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.\n\n![stats](https://nodei.co/npm/smart-buffer.png?downloads=true&downloadRank=true&stars=true \"stats\")\n\n**Key Features**:\n* Proxies all of the Buffer write and read functions\n* Keeps track of read and write offsets automatically\n* Grows the internal Buffer as needed\n* Useful string operations. (Null terminating strings)\n* Allows for inserting values at specific points in the Buffer\n* Built in TypeScript\n* Type Definitions Provided\n* Browser Support (using Webpack/Browserify)\n* Full test coverage\n\n**Requirements**:\n* Node v4.0+ is supported at this time. (Versions prior to 2.0 will work on node 0.10)\n\n\n\n## Breaking Changes in v4.0\n\n* Old constructor patterns have been completely removed. It's now required to use the SmartBuffer.fromXXX() factory constructors.\n* rewind(), skip(), moveTo() have been removed. (see [offsets](#offsets))\n* Internal private properties are now prefixed with underscores (_)\n* **All** writeXXX() methods that are given an offset will now **overwrite data** instead of insert. (see [write vs insert](#write-vs-insert))\n* insertXXX() methods have been added for when you want to insert data at a specific offset (this replaces the old behavior of writeXXX() when an offset was provided)\n\n\n## Looking for v3 docs?\n\nLegacy documentation for version 3 and prior can be found [here](https://github.com/JoshGlazebrook/smart-buffer/blob/master/docs/README_v3.md).\n\n## Installing:\n\n`yarn add smart-buffer`\n\nor\n\n`npm install smart-buffer`\n\nNote: The published NPM package includes the built javascript library.\nIf you cloned this repo and wish to build the library manually use:\n\n`npm run build`\n\n## Using smart-buffer\n\n```javascript\n// Javascript\nconst SmartBuffer = require('smart-buffer').SmartBuffer;\n\n// Typescript\nimport { SmartBuffer, SmartBufferOptions} from 'smart-buffer';\n```\n\n### Simple Example\n\nBuilding a packet that uses the following protocol specification:\n\n`[PacketType:2][PacketLength:2][Data:XX]`\n\nTo build this packet using the vanilla Buffer class, you would have to count up the length of the data payload beforehand. You would also need to keep track of the current \"cursor\" position in your Buffer so you write everything in the right places. With smart-buffer you don't have to do either of those things.\n\n```javascript\nfunction createLoginPacket(username, password, age, country) {\n const packet = new SmartBuffer();\n packet.writeUInt16LE(0x0060); // Some packet type\n packet.writeStringNT(username);\n packet.writeStringNT(password);\n packet.writeUInt8(age);\n packet.writeStringNT(country);\n packet.insertUInt16LE(packet.length - 2, 2);\n\n return packet.toBuffer();\n}\n```\nWith the above function, you now can do this:\n```javascript\nconst login = createLoginPacket(\"Josh\", \"secret123\", 22, \"United States\");\n\n// <Buffer 60 00 1e 00 4a 6f 73 68 00 73 65 63 72 65 74 31 32 33 00 16 55 6e 69 74 65 64 20 53 74 61 74 65 73 00>\n```\nNotice that the `[PacketLength:2]` value (1e 00) was inserted at position 2.\n\nReading back the packet we created above is just as easy:\n```javascript\n\nconst reader = SmartBuffer.fromBuffer(login);\n\nconst logininfo = {\n packetType: reader.readUInt16LE(),\n packetLength: reader.readUInt16LE(),\n username: reader.readStringNT(),\n password: reader.readStringNT(),\n age: reader.readUInt8(),\n country: reader.readStringNT()\n};\n\n/*\n{\n packetType: 96, (0x0060)\n packetLength: 30,\n username: 'Josh',\n password: 'secret123',\n age: 22,\n country: 'United States'\n}\n*/\n```\n\n\n## Write vs Insert\nIn prior versions of SmartBuffer, .writeXXX(value, offset) calls would insert data when an offset was provided. In version 4, this will now overwrite the data at the offset position. To insert data there are now corresponding .insertXXX(value, offset) methods.\n\n**SmartBuffer v3**:\n```javascript\nconst buff = SmartBuffer.fromBuffer(new Buffer([1,2,3,4,5,6]));\nbuff.writeInt8(7, 2);\nconsole.log(buff.toBuffer())\n\n// <Buffer 01 02 07 03 04 05 06>\n```\n\n**SmartBuffer v4**:\n```javascript\nconst buff = SmartBuffer.fromBuffer(new Buffer([1,2,3,4,5,6]));\nbuff.writeInt8(7, 2);\nconsole.log(buff.toBuffer());\n\n// <Buffer 01 02 07 04 05 06>\n```\n\nTo insert you instead should use:\n```javascript\nconst buff = SmartBuffer.fromBuffer(new Buffer([1,2,3,4,5,6]));\nbuff.insertInt8(7, 2);\nconsole.log(buff.toBuffer());\n\n// <Buffer 01 02 07 03 04 05 06>\n```\n\n**Note:** Insert/Writing to a position beyond the currently tracked internal Buffer will zero pad to your offset.\n\n## Constructing a smart-buffer\n\nThere are a few different ways to construct a SmartBuffer instance.\n\n```javascript\n// Creating SmartBuffer from existing Buffer\nconst buff = SmartBuffer.fromBuffer(buffer); // Creates instance from buffer. (Uses default utf8 encoding)\nconst buff = SmartBuffer.fromBuffer(buffer, 'ascii'); // Creates instance from buffer with ascii encoding for strings.\n\n// Creating SmartBuffer with specified internal Buffer size. (Note: this is not a hard cap, the internal buffer will grow as needed).\nconst buff = SmartBuffer.fromSize(1024); // Creates instance with internal Buffer size of 1024.\nconst buff = SmartBuffer.fromSize(1024, 'utf8'); // Creates instance with internal Buffer size of 1024, and utf8 encoding for strings.\n\n// Creating SmartBuffer with options object. This one specifies size and encoding.\nconst buff = SmartBuffer.fromOptions({\n size: 1024,\n encoding: 'ascii'\n});\n\n// Creating SmartBuffer with options object. This one specified an existing Buffer.\nconst buff = SmartBuffer.fromOptions({\n buff: buffer\n});\n\n// Creating SmartBuffer from a string.\nconst buff = SmartBuffer.fromBuffer(Buffer.from('some string', 'utf8'));\n\n// Just want a regular SmartBuffer with all default options?\nconst buff = new SmartBuffer();\n```\n\n# Api Reference:\n\n**Note:** SmartBuffer is fully documented with Typescript definitions as well as jsdocs so your favorite editor/IDE will have intellisense.\n\n**Table of Contents**\n\n1. [Constructing](#constructing)\n2. **Numbers**\n 1. [Integers](#integers)\n 2. [Floating Points](#floating-point-numbers)\n3. **Strings**\n 1. [Strings](#strings)\n 2. [Null Terminated Strings](#null-terminated-strings)\n4. [Buffers](#buffers)\n5. [Offsets](#offsets)\n6. [Other](#other)\n\n\n## Constructing\n\n### constructor()\n### constructor([options])\n- ```options``` *{SmartBufferOptions}* An optional options object to construct a SmartBuffer with.\n\nExamples:\n```javascript\nconst buff = new SmartBuffer();\nconst buff = new SmartBuffer({\n size: 1024,\n encoding: 'ascii'\n});\n```\n\n### Class Method: fromBuffer(buffer[, encoding])\n- ```buffer``` *{Buffer}* The Buffer instance to wrap.\n- ```encoding``` *{string}* The string encoding to use. ```Default: 'utf8'```\n\nExamples:\n```javascript\nconst someBuffer = Buffer.from('some string');\nconst buff = SmartBuffer.fromBuffer(someBuffer); // Defaults to utf8\nconst buff = SmartBuffer.fromBuffer(someBuffer, 'ascii');\n```\n\n### Class Method: fromSize(size[, encoding])\n- ```size``` *{number}* The size to initialize the internal Buffer.\n- ```encoding``` *{string}* The string encoding to use. ```Default: 'utf8'```\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromSize(1024); // Defaults to utf8\nconst buff = SmartBuffer.fromSize(1024, 'ascii');\n```\n\n### Class Method: fromOptions(options)\n- ```options``` *{SmartBufferOptions}* The Buffer instance to wrap.\n\n```typescript\ninterface SmartBufferOptions {\n encoding?: BufferEncoding; // Defaults to utf8\n size?: number; // Defaults to 4096\n buff?: Buffer;\n}\n```\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromOptions({\n size: 1024\n};\nconst buff = SmartBuffer.fromOptions({\n size: 1024,\n encoding: 'utf8'\n});\nconst buff = SmartBuffer.fromOptions({\n encoding: 'utf8'\n});\n\nconst someBuff = Buffer.from('some string', 'utf8');\nconst buff = SmartBuffer.fromOptions({\n buffer: someBuff,\n encoding: 'utf8'\n});\n```\n\n## Integers\n\n### buff.readInt8([offset])\n### buff.readUInt8([offset])\n- ```offset``` *{number}* Optional position to start reading data from. **Default**: ```Auto managed offset```\n- Returns *{number}*\n\nRead a Int8 value.\n\n### buff.readInt16BE([offset])\n### buff.readInt16LE([offset])\n### buff.readUInt16BE([offset])\n### buff.readUInt16LE([offset])\n- ```offset``` *{number}* Optional position to start reading data from. **Default**: ```Auto managed offset```\n- Returns *{number}*\n\nRead a 16 bit integer value.\n\n### buff.readInt32BE([offset])\n### buff.readInt32LE([offset])\n### buff.readUInt32BE([offset])\n### buff.readUInt32LE([offset])\n- ```offset``` *{number}* Optional position to start reading data from. **Default**: ```Auto managed offset```\n- Returns *{number}*\n\nRead a 32 bit integer value.\n\n\n### buff.writeInt8(value[, offset])\n### buff.writeUInt8(value[, offset])\n- ```value``` *{number}* The value to write.\n- ```offset``` *{number}* An optional offset to write this value to. **Default:** ```Auto managed offset```\n- Returns *{this}*\n\nWrite a Int8 value.\n\n### buff.insertInt8(value, offset)\n### buff.insertUInt8(value, offset)\n- ```value``` *{number}* The value to insert.\n- ```offset``` *{number}* The offset to insert this data at.\n- Returns *{this}*\n\nInsert a Int8 value.\n\n\n### buff.writeInt16BE(value[, offset])\n### buff.writeInt16LE(value[, offset])\n### buff.writeUInt16BE(value[, offset])\n### buff.writeUInt16LE(value[, offset])\n- ```value``` *{number}* The value to write.\n- ```offset``` *{number}* An optional offset to write this value to. **Default:** ```Auto managed offset```\n- Returns *{this}*\n\nWrite a 16 bit integer value.\n\n### buff.insertInt16BE(value, offset)\n### buff.insertInt16LE(value, offset)\n### buff.insertUInt16BE(value, offset)\n### buff.insertUInt16LE(value, offset)\n- ```value``` *{number}* The value to insert.\n- ```offset``` *{number}* The offset to insert this data at.\n- Returns *{this}*\n\nInsert a 16 bit integer value.\n\n\n### buff.writeInt32BE(value[, offset])\n### buff.writeInt32LE(value[, offset])\n### buff.writeUInt32BE(value[, offset])\n### buff.writeUInt32LE(value[, offset])\n- ```value``` *{number}* The value to write.\n- ```offset``` *{number}* An optional offset to write this value to. **Default:** ```Auto managed offset```\n- Returns *{this}*\n\nWrite a 32 bit integer value.\n\n### buff.insertInt32BE(value, offset)\n### buff.insertInt32LE(value, offset)\n### buff.insertUInt32BE(value, offset)\n### buff.nsertUInt32LE(value, offset)\n- ```value``` *{number}* The value to insert.\n- ```offset``` *{number}* The offset to insert this data at.\n- Returns *{this}*\n\nInsert a 32 bit integer value.\n\n\n## Floating Point Numbers\n\n### buff.readFloatBE([offset])\n### buff.readFloatLE([offset])\n- ```offset``` *{number}* Optional position to start reading data from. **Default**: ```Auto managed offset```\n- Returns *{number}*\n\nRead a Float value.\n\n### buff.readDoubleBE([offset])\n### buff.readDoubleLE([offset])\n- ```offset``` *{number}* Optional position to start reading data from. **Default**: ```Auto managed offset```\n- Returns *{number}*\n\nRead a Double value.\n\n\n### buff.writeFloatBE(value[, offset])\n### buff.writeFloatLE(value[, offset])\n- ```value``` *{number}* The value to write.\n- ```offset``` *{number}* An optional offset to write this value to. **Default:** ```Auto managed offset```\n- Returns *{this}*\n\nWrite a Float value.\n\n### buff.insertFloatBE(value, offset)\n### buff.insertFloatLE(value, offset)\n- ```value``` *{number}* The value to insert.\n- ```offset``` *{number}* The offset to insert this data at.\n- Returns *{this}*\n\nInsert a Float value.\n\n\n### buff.writeDoubleBE(value[, offset])\n### buff.writeDoubleLE(value[, offset])\n- ```value``` *{number}* The value to write.\n- ```offset``` *{number}* An optional offset to write this value to. **Default:** ```Auto managed offset```\n- Returns *{this}*\n\nWrite a Double value.\n\n### buff.insertDoubleBE(value, offset)\n### buff.insertDoubleLE(value, offset)\n- ```value``` *{number}* The value to insert.\n- ```offset``` *{number}* The offset to insert this data at.\n- Returns *{this}*\n\nInsert a Double value.\n\n## Strings\n\n### buff.readString()\n### buff.readString(size[, encoding])\n### buff.readString(encoding)\n- ```size``` *{number}* The number of bytes to read. **Default:** ```Reads to the end of the Buffer.```\n- ```encoding``` *{string}* The string encoding to use. **Default:** ```utf8```.\n\nRead a string value.\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromBuffer(Buffer.from('hello there', 'utf8'));\nbuff.readString(); // 'hello there'\nbuff.readString(2); // 'he'\nbuff.readString(2, 'utf8'); // 'he'\nbuff.readString('utf8'); // 'hello there'\n```\n\n### buff.writeString(value)\n### buff.writeString(value[, offset])\n### buff.writeString(value[, encoding])\n### buff.writeString(value[, offset[, encoding]])\n- ```value``` *{string}* The string value to write.\n- ```offset``` *{number}* The offset to write this value to. **Default:** ```Auto managed offset```\n- ```encoding``` *{string}* An optional string encoding to use. **Default:** ```utf8```\n\nWrite a string value.\n\nExamples:\n```javascript\nbuff.writeString('hello'); // Auto managed offset\nbuff.writeString('hello', 2);\nbuff.writeString('hello', 'utf8') // Auto managed offset\nbuff.writeString('hello', 2, 'utf8');\n```\n\n### buff.insertString(value, offset[, encoding])\n- ```value``` *{string}* The string value to write.\n- ```offset``` *{number}* The offset to write this value to.\n- ```encoding``` *{string}* An optional string encoding to use. **Default:** ```utf8```\n\nInsert a string value.\n\nExamples:\n```javascript\nbuff.insertString('hello', 2);\nbuff.insertString('hello', 2, 'utf8');\n```\n\n## Null Terminated Strings\n\n### buff.readStringNT()\n### buff.readStringNT(encoding)\n- ```encoding``` *{string}* The string encoding to use. **Default:** ```utf8```.\n\nRead a null terminated string value. (If a null is not found, it will read to the end of the Buffer).\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromBuffer(Buffer.from('hello\\0 there', 'utf8'));\nbuff.readStringNT(); // 'hello'\n\n// If we called this again:\nbuff.readStringNT(); // ' there'\n```\n\n### buff.writeStringNT(value)\n### buff.writeStringNT(value[, offset])\n### buff.writeStringNT(value[, encoding])\n### buff.writeStringNT(value[, offset[, encoding]])\n- ```value``` *{string}* The string value to write.\n- ```offset``` *{number}* The offset to write this value to. **Default:** ```Auto managed offset```\n- ```encoding``` *{string}* An optional string encoding to use. **Default:** ```utf8```\n\nWrite a null terminated string value.\n\nExamples:\n```javascript\nbuff.writeStringNT('hello'); // Auto managed offset <Buffer 68 65 6c 6c 6f 00>\nbuff.writeStringNT('hello', 2); // <Buffer 00 00 68 65 6c 6c 6f 00>\nbuff.writeStringNT('hello', 'utf8') // Auto managed offset\nbuff.writeStringNT('hello', 2, 'utf8');\n```\n\n### buff.insertStringNT(value, offset[, encoding])\n- ```value``` *{string}* The string value to write.\n- ```offset``` *{number}* The offset to write this value to.\n- ```encoding``` *{string}* An optional string encoding to use. **Default:** ```utf8```\n\nInsert a null terminated string value.\n\nExamples:\n```javascript\nbuff.insertStringNT('hello', 2);\nbuff.insertStringNT('hello', 2, 'utf8');\n```\n\n## Buffers\n\n### buff.readBuffer([length])\n- ```length``` *{number}* The number of bytes to read into a Buffer. **Default:** ```Reads to the end of the Buffer```\n\nRead a Buffer of a specified size.\n\n### buff.writeBuffer(value[, offset])\n- ```value``` *{Buffer}* The buffer value to write.\n- ```offset``` *{number}* An optional offset to write the value to. **Default:** ```Auto managed offset```\n\n### buff.insertBuffer(value, offset)\n- ```value``` *{Buffer}* The buffer value to write.\n- ```offset``` *{number}* The offset to write the value to.\n\n\n### buff.readBufferNT()\n\nRead a null terminated Buffer.\n\n### buff.writeBufferNT(value[, offset])\n- ```value``` *{Buffer}* The buffer value to write.\n- ```offset``` *{number}* An optional offset to write the value to. **Default:** ```Auto managed offset```\n\nWrite a null terminated Buffer.\n\n\n### buff.insertBufferNT(value, offset)\n- ```value``` *{Buffer}* The buffer value to write.\n- ```offset``` *{number}* The offset to write the value to.\n\nInsert a null terminated Buffer.\n\n\n## Offsets\n\n### buff.readOffset\n### buff.readOffset(offset)\n- ```offset``` *{number}* The new read offset value to set.\n- Returns: ```The current read offset```\n\nGets or sets the current read offset.\n\nExamples:\n```javascript\nconst currentOffset = buff.readOffset; // 5\n\nbuff.readOffset = 10;\n\nconsole.log(buff.readOffset) // 10\n```\n\n### buff.writeOffset\n### buff.writeOffset(offset)\n- ```offset``` *{number}* The new write offset value to set.\n- Returns: ```The current write offset```\n\nGets or sets the current write offset.\n\nExamples:\n```javascript\nconst currentOffset = buff.writeOffset; // 5\n\nbuff.writeOffset = 10;\n\nconsole.log(buff.writeOffset) // 10\n```\n\n### buff.encoding\n### buff.encoding(encoding)\n- ```encoding``` *{string}* The new string encoding to set.\n- Returns: ```The current string encoding```\n\nGets or sets the current string encoding.\n\nExamples:\n```javascript\nconst currentEncoding = buff.encoding; // 'utf8'\n\nbuff.encoding = 'ascii';\n\nconsole.log(buff.encoding) // 'ascii'\n```\n\n## Other\n\n### buff.clear()\n\nClear and resets the SmartBuffer instance.\n\n### buff.remaining()\n- Returns ```Remaining data left to be read```\n\nGets the number of remaining bytes to be read.\n\n\n### buff.internalBuffer\n- Returns: *{Buffer}*\n\nGets the internally managed Buffer (Includes unmanaged data).\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromSize(16);\nbuff.writeString('hello');\nconsole.log(buff.InternalBuffer); // <Buffer 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00>\n```\n\n### buff.toBuffer()\n- Returns: *{Buffer}*\n\nGets a sliced Buffer instance of the internally managed Buffer. (Only includes managed data)\n\nExamples:\n```javascript\nconst buff = SmartBuffer.fromSize(16);\nbuff.writeString('hello');\nconsole.log(buff.toBuffer()); // <Buffer 68 65 6c 6c 6f>\n```\n\n### buff.toString([encoding])\n- ```encoding``` *{string}* The string encoding to use when converting to a string. **Default:** ```utf8```\n- Returns *{string}*\n\nGets a string representation of all data in the SmartBuffer.\n\n### buff.destroy()\n\nDestroys the SmartBuffer instance.\n\n\n\n## License\n\nThis work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).\n","author":{"name":"Josh Glazebrook"},"repository":{"type":"git","url":"git+https://github.com/JoshGlazebrook/smart-buffer.git"},"readmeFilename":"README.md","homepage":"https://github.com/JoshGlazebrook/smart-buffer/","bugs":{"url":"https://github.com/JoshGlazebrook/smart-buffer/issues"},"license":"MIT"}
+{
+ "name": "smart-buffer",
+ "description": "smart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.",
+ "dist-tags": {
+ "latest": "4.2.0"
+ },
+ "versions": {
+ "4.2.0": {
+ "name": "smart-buffer",
+ "version": "4.2.0",
+ "description": "smart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.",
+ "main": "build/smartbuffer.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JoshGlazebrook/smart-buffer.git"
+ },
+ "bugs": {
+ "url": "https://github.com/JoshGlazebrook/smart-buffer/issues"
+ },
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ },
+ "author": {
+ "name": "Josh Glazebrook"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@types/chai": "4.1.7",
+ "@types/mocha": "5.2.7",
+ "@types/node": "^12.0.0",
+ "chai": "4.2.0",
+ "coveralls": "3.0.5",
+ "istanbul": "^0.4.5",
+ "mocha": "6.2.0",
+ "mocha-lcov-reporter": "^1.3.0",
+ "nyc": "14.1.1",
+ "source-map-support": "0.5.12",
+ "ts-node": "8.3.0",
+ "tslint": "5.18.0",
+ "typescript": "^3.2.1"
+ },
+ "typings": "typings/smartbuffer.d.ts",
+ "dependencies": {},
+ "scripts": {
+ "prepublish": "npm install -g typescript && npm run build",
+ "test": "NODE_ENV=test mocha --recursive --require ts-node/register test/**/*.ts",
+ "coverage": "NODE_ENV=test nyc npm test",
+ "coveralls": "NODE_ENV=test nyc npm test && nyc report --reporter=text-lcov | coveralls",
+ "lint": "tslint --type-check --project tsconfig.json 'src/**/*.ts'",
+ "build": "tsc -p ./"
+ },
+ "nyc": {
+ "extension": [
+ ".ts",
+ ".tsx"
+ ],
+ "include": [
+ "src/*.ts",
+ "src/**/*.ts"
+ ],
+ "exclude": [
+ "**.*.d.ts",
+ "node_modules",
+ "typings"
+ ],
+ "require": [
+ "ts-node/register"
+ ],
+ "reporter": [
+ "json",
+ "html"
+ ],
+ "all": true
+ },
+ "gitHead": "2ce01c95312343325997b19e52daa166dc227930",
+ "_id": "smart-buffer@4.2.0",
+ "_nodeVersion": "12.15.0",
+ "_npmVersion": "6.13.4",
+ "dist": {
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "shasum": "6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae",
+ "tarball": "http://localhost:4260/smart-buffer/smart-buffer-4.2.0.tgz",
+ "fileCount": 14,
+ "unpackedSize": 138027
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Josh Glazebrook"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JoshGlazebrook/smart-buffer.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/JoshGlazebrook/smart-buffer/",
+ "bugs": {
+ "url": "https://github.com/JoshGlazebrook/smart-buffer/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/socks-proxy-agent/registry.json b/tests/registry/npm/socks-proxy-agent/registry.json
index 454ab4ae1..2bcae551b 100644
--- a/tests/registry/npm/socks-proxy-agent/registry.json
+++ b/tests/registry/npm/socks-proxy-agent/registry.json
@@ -1 +1,93 @@
-{"name":"socks-proxy-agent","description":"A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS","dist-tags":{"latest":"8.0.4"},"versions":{"8.0.4":{"name":"socks-proxy-agent","version":"8.0.4","description":"A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS","main":"./dist/index.js","types":"./dist/index.d.ts","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/socks-proxy-agent"},"dependencies":{"agent-base":"^7.1.1","debug":"^4.3.4","socks":"^2.8.3"},"devDependencies":{"@types/async-retry":"^1.4.5","@types/debug":"^4.1.7","@types/dns2":"^2.0.3","@types/jest":"^29.5.1","@types/node":"^14.18.45","async-listen":"^3.0.0","async-retry":"^1.3.3","cacheable-lookup":"^6.1.0","dns2":"^2.1.0","jest":"^29.5.0","socksv5":"github:TooTallNate/socksv5#fix/dstSock-close-event","ts-jest":"^29.1.0","typescript":"^5.0.4","proxy":"2.2.0","tsconfig":"0.0.0"},"engines":{"node":">= 14"},"license":"MIT","scripts":{"build":"tsc","test":"jest --env node --verbose --bail test/test.ts","test-e2e":"jest --env node --verbose --bail test/e2e.test.ts","lint":"eslint . --ext .ts","pack":"node ../../scripts/pack.mjs"},"_id":"socks-proxy-agent@8.0.4","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"_integrity":"sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==","_resolved":"/tmp/407e2a13e47683d55ba12268a88dc928/socks-proxy-agent-8.0.4.tgz","_from":"file:socks-proxy-agent-8.0.4.tgz","_nodeVersion":"20.15.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==","shasum":"9071dca17af95f483300316f4b063578fa0db08c","tarball":"http://localhost:4260/socks-proxy-agent/socks-proxy-agent-8.0.4.tgz","fileCount":8,"unpackedSize":24807,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVGE9sWVNsvXQxNfnxkVYDLtr6au/T9keiMS8qqpx5xAIgAdieGvxZXNLSv9g8QcnXPcB16VC91E6Vi1CIjwLnaQQ="}]},"directories":{},"_hasShrinkwrap":false}},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://n8.io/"},"repository":{"type":"git","url":"git+https://github.com/TooTallNate/proxy-agents.git","directory":"packages/socks-proxy-agent"},"license":"MIT","homepage":"https://github.com/TooTallNate/proxy-agents#readme","bugs":{"url":"https://github.com/TooTallNate/proxy-agents/issues"},"readme":"socks-proxy-agent\n================\n### A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS\n\nThis module provides an `http.Agent` implementation that connects to a\nspecified SOCKS proxy server, and can be used with the built-in `http`\nand `https` modules.\n\nIt can also be used in conjunction with the `ws` module to establish a WebSocket\nconnection over a SOCKS proxy. See the \"Examples\" section below.\n\nExamples\n--------\n\n```ts\nimport https from 'https';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\n\nconst agent = new SocksProxyAgent(\n\t'socks://your-name%40gmail.com:abcdef12345124@br41.nordvpn.com'\n);\n\nhttps.get('https://ipinfo.io', { agent }, (res) => {\n\tconsole.log(res.headers);\n\tres.pipe(process.stdout);\n});\n```\n\n#### `ws` WebSocket connection example\n\n```ts\nimport WebSocket from 'ws';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\n\nconst agent = new SocksProxyAgent(\n\t'socks://your-name%40gmail.com:abcdef12345124@br41.nordvpn.com'\n);\n\nvar socket = new WebSocket('ws://echo.websocket.events', { agent });\n\nsocket.on('open', function () {\n\tconsole.log('\"open\" event!');\n\tsocket.send('hello world');\n});\n\nsocket.on('message', function (data, flags) {\n\tconsole.log('\"message\" event! %j %j', data, flags);\n\tsocket.close();\n});\n```","readmeFilename":"README.md"}
+{
+ "name": "socks-proxy-agent",
+ "description": "A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS",
+ "dist-tags": {
+ "latest": "8.0.4"
+ },
+ "versions": {
+ "8.0.4": {
+ "name": "socks-proxy-agent",
+ "version": "8.0.4",
+ "description": "A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/socks-proxy-agent"
+ },
+ "dependencies": {
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "devDependencies": {
+ "@types/async-retry": "^1.4.5",
+ "@types/debug": "^4.1.7",
+ "@types/dns2": "^2.0.3",
+ "@types/jest": "^29.5.1",
+ "@types/node": "^14.18.45",
+ "async-listen": "^3.0.0",
+ "async-retry": "^1.3.3",
+ "cacheable-lookup": "^6.1.0",
+ "dns2": "^2.1.0",
+ "jest": "^29.5.0",
+ "socksv5": "github:TooTallNate/socksv5#fix/dstSock-close-event",
+ "ts-jest": "^29.1.0",
+ "typescript": "^5.0.4",
+ "proxy": "2.2.0",
+ "tsconfig": "0.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "license": "MIT",
+ "scripts": {
+ "build": "tsc",
+ "test": "jest --env node --verbose --bail test/test.ts",
+ "test-e2e": "jest --env node --verbose --bail test/e2e.test.ts",
+ "lint": "eslint . --ext .ts",
+ "pack": "node ../../scripts/pack.mjs"
+ },
+ "_id": "socks-proxy-agent@8.0.4",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "_integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
+ "_resolved": "/tmp/407e2a13e47683d55ba12268a88dc928/socks-proxy-agent-8.0.4.tgz",
+ "_from": "file:socks-proxy-agent-8.0.4.tgz",
+ "_nodeVersion": "20.15.0",
+ "_npmVersion": "10.7.0",
+ "dist": {
+ "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
+ "shasum": "9071dca17af95f483300316f4b063578fa0db08c",
+ "tarball": "http://localhost:4260/socks-proxy-agent/socks-proxy-agent-8.0.4.tgz",
+ "fileCount": 8,
+ "unpackedSize": 24807
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TooTallNate/proxy-agents.git",
+ "directory": "packages/socks-proxy-agent"
+ },
+ "license": "MIT",
+ "homepage": "https://github.com/TooTallNate/proxy-agents#readme",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/proxy-agents/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/socks/registry.json b/tests/registry/npm/socks/registry.json
index 94f1272b3..8129b80ea 100644
--- a/tests/registry/npm/socks/registry.json
+++ b/tests/registry/npm/socks/registry.json
@@ -1 +1,81 @@
-{"name":"socks","description":"Fully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.","dist-tags":{"latest":"2.8.3"},"versions":{"2.8.3":{"name":"socks","private":false,"version":"2.8.3","description":"Fully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.","main":"build/index.js","typings":"typings/index.d.ts","repository":{"type":"git","url":"git+https://github.com/JoshGlazebrook/socks.git"},"bugs":{"url":"https://github.com/JoshGlazebrook/socks/issues"},"engines":{"node":">= 10.0.0","npm":">= 3.0.0"},"author":{"name":"Josh Glazebrook"},"license":"MIT","devDependencies":{"@types/mocha":"^10.0.6","@types/node":"^20.11.17","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","eslint":"^8.20.0","mocha":"^10.0.0","prettier":"^3.2.5","ts-node":"^10.9.1","typescript":"^5.3.3"},"dependencies":{"ip-address":"^9.0.5","smart-buffer":"^4.2.0"},"scripts":{"prepublish":"npm install -g typescript && npm run build","test":"NODE_ENV=test mocha --recursive --require ts-node/register test/**/*.ts","prettier":"prettier --write ./src/**/*.ts --config .prettierrc.yaml","lint":"eslint 'src/**/*.ts'","build":"rm -rf build typings && prettier --write ./src/**/*.ts --config .prettierrc.yaml && tsc -p .","build-raw":"rm -rf build typings && tsc -p ."},"_id":"socks@2.8.3","gitHead":"a2a06d9967edfaa317e6d20d33963b95a3e654e3","_nodeVersion":"20.11.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==","shasum":"1ebd0f09c52ba95a09750afe3f3f9f724a800cb5","tarball":"http://localhost:4260/socks/socks-2.8.3.tgz","fileCount":32,"unpackedSize":156302,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCK1DTr6IDjVG3NrjjnBKEwJ3UIUhA0yGDE6+Troh5+ugIgV5jooHtwcnN5GVpk4HeGWlTt3VbJghKRRQe0ztJjc9k="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# socks [![Build Status](https://travis-ci.org/JoshGlazebrook/socks.svg?branch=master)](https://travis-ci.org/JoshGlazebrook/socks) [![Coverage Status](https://coveralls.io/repos/github/JoshGlazebrook/socks/badge.svg?branch=master)](https://coveralls.io/github/JoshGlazebrook/socks?branch=v2)\n\nFully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.\n\n> Looking for Node.js agent? Check [node-socks-proxy-agent](https://github.com/TooTallNate/node-socks-proxy-agent).\n\n### Features\n\n* Supports SOCKS v4, v4a, v5, and v5h protocols.\n* Supports the CONNECT, BIND, and ASSOCIATE commands.\n* Supports callbacks, promises, and events for proxy connection creation async flow control.\n* Supports proxy chaining (CONNECT only).\n* Supports user/password authentication.\n* Supports custom authentication.\n* Built in UDP frame creation & parse functions.\n* Created with TypeScript, type definitions are provided.\n\n### Requirements\n\n* Node.js v10.0+ (Please use [v1](https://github.com/JoshGlazebrook/socks/tree/82d83923ad960693d8b774cafe17443ded7ed584) for older versions of Node.js)\n\n### Looking for v1?\n* Docs for v1 are available [here](https://github.com/JoshGlazebrook/socks/tree/82d83923ad960693d8b774cafe17443ded7ed584)\n\n## Installation\n\n`yarn add socks`\n\nor\n\n`npm install --save socks`\n\n## Usage\n\n```typescript\n// TypeScript\nimport { SocksClient, SocksClientOptions, SocksClientChainOptions } from 'socks';\n\n// ES6 JavaScript\nimport { SocksClient } from 'socks';\n\n// Legacy JavaScript\nconst SocksClient = require('socks').SocksClient;\n```\n\n## Quick Start Example\n\nConnect to github.com (192.30.253.113) on port 80, using a SOCKS proxy.\n\n```javascript\nconst options = {\n proxy: {\n host: '159.203.75.200', // ipv4 or ipv6 or hostname\n port: 1080,\n type: 5 // Proxy version (4 or 5)\n },\n\n command: 'connect', // SOCKS command (createConnection factory function only supports the connect command)\n\n destination: {\n host: '192.30.253.113', // github.com (hostname lookups are supported with SOCKS v4a and 5)\n port: 80\n }\n};\n\n// Async/Await\ntry {\n const info = await SocksClient.createConnection(options);\n\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n} catch (err) {\n // Handle errors\n}\n\n// Promises\nSocksClient.createConnection(options)\n.then(info => {\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n})\n.catch(err => {\n // Handle errors\n});\n\n// Callbacks\nSocksClient.createConnection(options, (err, info) => {\n if (!err) {\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n } else {\n // Handle errors\n }\n});\n```\n\n## Chaining Proxies\n\n**Note:** Chaining is only supported when using the SOCKS connect command, and chaining can only be done through the special factory chaining function.\n\nThis example makes a proxy chain through two SOCKS proxies to ip-api.com. Once the connection to the destination is established it sends an HTTP request to get a JSON response that returns ip info for the requesting ip.\n\n```javascript\nconst options = {\n destination: {\n host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.\n port: 80\n },\n command: 'connect', // Only the connect command is supported when chaining proxies.\n proxies: [ // The chain order is the order in the proxies array, meaning the last proxy will establish a connection to the destination.\n {\n host: '159.203.75.235', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n },\n {\n host: '104.131.124.203', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n }\n ]\n}\n\n// Async/Await\ntry {\n const info = await SocksClient.createConnectionChain(options);\n\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy servers)\n\n console.log(info.socket.remoteAddress) // The remote address of the returned socket is the first proxy in the chain.\n // 159.203.75.235\n\n info.socket.write('GET /json HTTP/1.1\\nHost: ip-api.com\\n\\n');\n info.socket.on('data', (data) => {\n console.log(data.toString()); // ip-api.com sees that the last proxy in the chain (104.131.124.203) is connected to it.\n /*\n HTTP/1.1 200 OK\n Access-Control-Allow-Origin: *\n Content-Type: application/json; charset=utf-8\n Date: Sun, 24 Dec 2017 03:47:51 GMT\n Content-Length: 300\n\n {\n \"as\":\"AS14061 Digital Ocean, Inc.\",\n \"city\":\"Clifton\",\n \"country\":\"United States\",\n \"countryCode\":\"US\",\n \"isp\":\"Digital Ocean\",\n \"lat\":40.8326,\n \"lon\":-74.1307,\n \"org\":\"Digital Ocean\",\n \"query\":\"104.131.124.203\",\n \"region\":\"NJ\",\n \"regionName\":\"New Jersey\",\n \"status\":\"success\",\n \"timezone\":\"America/New_York\",\n \"zip\":\"07014\"\n }\n */\n });\n} catch (err) {\n // Handle errors\n}\n\n// Promises\nSocksClient.createConnectionChain(options)\n.then(info => {\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n\n console.log(info.socket.remoteAddress) // The remote address of the returned socket is the first proxy in the chain.\n // 159.203.75.235\n\n info.socket.write('GET /json HTTP/1.1\\nHost: ip-api.com\\n\\n');\n info.socket.on('data', (data) => {\n console.log(data.toString()); // ip-api.com sees that the last proxy in the chain (104.131.124.203) is connected to it.\n /*\n HTTP/1.1 200 OK\n Access-Control-Allow-Origin: *\n Content-Type: application/json; charset=utf-8\n Date: Sun, 24 Dec 2017 03:47:51 GMT\n Content-Length: 300\n\n {\n \"as\":\"AS14061 Digital Ocean, Inc.\",\n \"city\":\"Clifton\",\n \"country\":\"United States\",\n \"countryCode\":\"US\",\n \"isp\":\"Digital Ocean\",\n \"lat\":40.8326,\n \"lon\":-74.1307,\n \"org\":\"Digital Ocean\",\n \"query\":\"104.131.124.203\",\n \"region\":\"NJ\",\n \"regionName\":\"New Jersey\",\n \"status\":\"success\",\n \"timezone\":\"America/New_York\",\n \"zip\":\"07014\"\n }\n */\n });\n})\n.catch(err => {\n // Handle errors\n});\n\n// Callbacks\nSocksClient.createConnectionChain(options, (err, info) => {\n if (!err) {\n console.log(info.socket);\n // <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n\n console.log(info.socket.remoteAddress) // The remote address of the returned socket is the first proxy in the chain.\n // 159.203.75.235\n\n info.socket.write('GET /json HTTP/1.1\\nHost: ip-api.com\\n\\n');\n info.socket.on('data', (data) => {\n console.log(data.toString()); // ip-api.com sees that the last proxy in the chain (104.131.124.203) is connected to it.\n /*\n HTTP/1.1 200 OK\n Access-Control-Allow-Origin: *\n Content-Type: application/json; charset=utf-8\n Date: Sun, 24 Dec 2017 03:47:51 GMT\n Content-Length: 300\n\n {\n \"as\":\"AS14061 Digital Ocean, Inc.\",\n \"city\":\"Clifton\",\n \"country\":\"United States\",\n \"countryCode\":\"US\",\n \"isp\":\"Digital Ocean\",\n \"lat\":40.8326,\n \"lon\":-74.1307,\n \"org\":\"Digital Ocean\",\n \"query\":\"104.131.124.203\",\n \"region\":\"NJ\",\n \"regionName\":\"New Jersey\",\n \"status\":\"success\",\n \"timezone\":\"America/New_York\",\n \"zip\":\"07014\"\n }\n */\n });\n } else {\n // Handle errors\n }\n});\n```\n\n## Bind Example (TCP Relay)\n\nWhen the bind command is sent to a SOCKS v4/v5 proxy server, the proxy server starts listening on a new TCP port and the proxy relays then remote host information back to the client. When another remote client connects to the proxy server on this port the SOCKS proxy sends a notification that an incoming connection has been accepted to the initial client and a full duplex stream is now established to the initial client and the client that connected to that special port.\n\n```javascript\nconst options = {\n proxy: {\n host: '159.203.75.235', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n },\n\n command: 'bind',\n\n // When using BIND, the destination should be the remote client that is expected to connect to the SOCKS proxy. Using 0.0.0.0 makes the Proxy accept any incoming connection on that port.\n destination: {\n host: '0.0.0.0',\n port: 0\n }\n};\n\n// Creates a new SocksClient instance.\nconst client = new SocksClient(options);\n\n// When the SOCKS proxy has bound a new port and started listening, this event is fired.\nclient.on('bound', info => {\n console.log(info.remoteHost);\n /*\n {\n host: \"159.203.75.235\",\n port: 57362\n }\n */\n});\n\n// When a client connects to the newly bound port on the SOCKS proxy, this event is fired.\nclient.on('established', info => {\n // info.remoteHost is the remote address of the client that connected to the SOCKS proxy.\n console.log(info.remoteHost);\n /*\n host: 67.171.34.23,\n port: 49823\n */\n\n console.log(info.socket);\n // <Socket ...> (This is a raw net.Socket that is a connection between the initial client and the remote client that connected to the proxy)\n\n // Handle received data...\n info.socket.on('data', data => {\n console.log('recv', data);\n });\n});\n\n// An error occurred trying to establish this SOCKS connection.\nclient.on('error', err => {\n console.error(err);\n});\n\n// Start connection to proxy\nclient.connect();\n```\n\n## Associate Example (UDP Relay)\n\nWhen the associate command is sent to a SOCKS v5 proxy server, it sets up a UDP relay that allows the client to send UDP packets to a remote host through the proxy server, and also receive UDP packet responses back through the proxy server.\n\n```javascript\nconst options = {\n proxy: {\n host: '159.203.75.235', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n },\n\n command: 'associate',\n\n // When using associate, the destination should be the remote client that is expected to send UDP packets to the proxy server to be forwarded. This should be your local ip, or optionally the wildcard address (0.0.0.0) UDP Client <-> Proxy <-> UDP Client\n destination: {\n host: '0.0.0.0',\n port: 0\n }\n};\n\n// Create a local UDP socket for sending packets to the proxy.\nconst udpSocket = dgram.createSocket('udp4');\nudpSocket.bind();\n\n// Listen for incoming UDP packets from the proxy server.\nudpSocket.on('message', (message, rinfo) => {\n console.log(SocksClient.parseUDPFrame(message));\n /*\n { frameNumber: 0,\n remoteHost: { host: '165.227.108.231', port: 4444 }, // The remote host that replied with a UDP packet\n data: <Buffer 74 65 73 74 0a> // The data\n }\n */\n});\n\nlet client = new SocksClient(associateOptions);\n\n// When the UDP relay is established, this event is fired and includes the UDP relay port to send data to on the proxy server.\nclient.on('established', info => {\n console.log(info.remoteHost);\n /*\n {\n host: '159.203.75.235',\n port: 44711\n }\n */\n\n // Send 'hello' to 165.227.108.231:4444\n const packet = SocksClient.createUDPFrame({\n remoteHost: { host: '165.227.108.231', port: 4444 },\n data: Buffer.from(line)\n });\n udpSocket.send(packet, info.remoteHost.port, info.remoteHost.host);\n});\n\n// Start connection\nclient.connect();\n```\n\n**Note:** The associate TCP connection to the proxy must remain open for the UDP relay to work.\n\n## Additional Examples\n\n[Documentation](docs/index.md)\n\n\n## Migrating from v1\n\nLooking for a guide to migrate from v1? Look [here](docs/migratingFromV1.md)\n\n## Api Reference:\n\n**Note:** socks includes full TypeScript definitions. These can even be used without using TypeScript as most IDEs (such as VS Code) will use these type definition files for auto completion intellisense even in JavaScript files.\n\n* Class: SocksClient\n * [new SocksClient(options[, callback])](#new-socksclientoptions)\n * [Class Method: SocksClient.createConnection(options[, callback])](#class-method-socksclientcreateconnectionoptions-callback)\n * [Class Method: SocksClient.createConnectionChain(options[, callback])](#class-method-socksclientcreateconnectionchainoptions-callback)\n * [Class Method: SocksClient.createUDPFrame(options)](#class-method-socksclientcreateudpframedetails)\n * [Class Method: SocksClient.parseUDPFrame(data)](#class-method-socksclientparseudpframedata)\n * [Event: 'error'](#event-error)\n * [Event: 'bound'](#event-bound)\n * [Event: 'established'](#event-established)\n * [client.connect()](#clientconnect)\n * [client.socksClientOptions](#clientconnect)\n\n### SocksClient\n\nSocksClient establishes SOCKS proxy connections to remote destination hosts. These proxy connections are fully transparent to the server and once established act as full duplex streams. SOCKS v4, v4a, v5, and v5h are supported, as well as the connect, bind, and associate commands.\n\nSocksClient supports creating connections using callbacks, promises, and async/await flow control using two static factory functions createConnection and createConnectionChain. It also internally extends EventEmitter which results in allowing event handling based async flow control.\n\n**SOCKS Compatibility Table**\n\nNote: When using 4a please specify type: 4, and when using 5h please specify type 5.\n\n| Socks Version | TCP | UDP | IPv4 | IPv6 | Hostname |\n| --- | :---: | :---: | :---: | :---: | :---: |\n| SOCKS v4 | ✅ | ❌ | ✅ | ❌ | ❌ |\n| SOCKS v4a | ✅ | ❌ | ✅ | ❌ | ✅ |\n| SOCKS v5 (includes v5h) | ✅ | ✅ | ✅ | ✅ | ✅ |\n\n### new SocksClient(options)\n\n* ```options``` {SocksClientOptions} - An object describing the SOCKS proxy to use, the command to send and establish, and the destination host to connect to.\n\n### SocksClientOptions\n\n```typescript\n{\n proxy: {\n host: '159.203.75.200', // ipv4, ipv6, or hostname\n port: 1080,\n type: 5, // Proxy version (4 or 5). For v4a use 4, for v5h use 5.\n\n // Optional fields\n userId: 'some username', // Used for SOCKS4 userId auth, and SOCKS5 user/pass auth in conjunction with password.\n password: 'some password', // Used in conjunction with userId for user/pass auth for SOCKS5 proxies.\n custom_auth_method: 0x80, // If using a custom auth method, specify the type here. If this is set, ALL other custom_auth_*** options must be set as well.\n custom_auth_request_handler: async () =>. {\n // This will be called when it's time to send the custom auth handshake. You must return a Buffer containing the data to send as your authentication.\n return Buffer.from([0x01,0x02,0x03]);\n },\n // This is the expected size (bytes) of the custom auth response from the proxy server.\n custom_auth_response_size: 2,\n // This is called when the auth response is received. The received packet is passed in as a Buffer, and you must return a boolean indicating the response from the server said your custom auth was successful or failed.\n custom_auth_response_handler: async (data) => {\n return data[1] === 0x00;\n }\n },\n\n command: 'connect', // connect, bind, associate\n\n destination: {\n host: '192.30.253.113', // ipv4, ipv6, hostname. Hostnames work with v4a and v5.\n port: 80\n },\n\n // Optional fields\n timeout: 30000, // How long to wait to establish a proxy connection. (defaults to 30 seconds)\n\n set_tcp_nodelay: true // If true, will turn on the underlying sockets TCP_NODELAY option.\n}\n```\n\n### Class Method: SocksClient.createConnection(options[, callback])\n* ```options``` { SocksClientOptions } - An object describing the SOCKS proxy to use, the command to send and establish, and the destination host to connect to.\n* ```callback``` { Function } - Optional callback function that is called when the proxy connection is established, or an error occurs.\n* ```returns``` { Promise } - A Promise is returned that is resolved when the proxy connection is established, or rejected when an error occurs.\n\nCreates a new proxy connection through the given proxy to the given destination host. This factory function supports callbacks and promises for async flow control.\n\n**Note:** If a callback function is provided, the promise will always resolve regardless of an error occurring. Please be sure to exclusively use either promises or callbacks when using this factory function.\n\n```typescript\nconst options = {\n proxy: {\n host: '159.203.75.200', // ipv4, ipv6, or hostname\n port: 1080,\n type: 5 // Proxy version (4 or 5)\n },\n\n command: 'connect', // connect, bind, associate\n\n destination: {\n host: '192.30.253.113', // ipv4, ipv6, or hostname\n port: 80\n }\n}\n\n// Await/Async (uses a Promise)\ntry {\n const info = await SocksClient.createConnection(options);\n console.log(info);\n /*\n {\n socket: <Socket ...>, // Raw net.Socket\n }\n */\n / <Socket ...> (this is a raw net.Socket that is established to the destination host through the given proxy server)\n\n} catch (err) {\n // Handle error...\n}\n\n// Promise\nSocksClient.createConnection(options)\n.then(info => {\n console.log(info);\n /*\n {\n socket: <Socket ...>, // Raw net.Socket\n }\n */\n})\n.catch(err => {\n // Handle error...\n});\n\n// Callback\nSocksClient.createConnection(options, (err, info) => {\n if (!err) {\n console.log(info);\n /*\n {\n socket: <Socket ...>, // Raw net.Socket\n }\n */\n } else {\n // Handle error...\n }\n});\n```\n\n### Class Method: SocksClient.createConnectionChain(options[, callback])\n* ```options``` { SocksClientChainOptions } - An object describing a list of SOCKS proxies to use, the command to send and establish, and the destination host to connect to.\n* ```callback``` { Function } - Optional callback function that is called when the proxy connection chain is established, or an error occurs.\n* ```returns``` { Promise } - A Promise is returned that is resolved when the proxy connection chain is established, or rejected when an error occurs.\n\nCreates a new proxy connection chain through a list of at least two SOCKS proxies to the given destination host. This factory method supports callbacks and promises for async flow control.\n\n**Note:** If a callback function is provided, the promise will always resolve regardless of an error occurring. Please be sure to exclusively use either promises or callbacks when using this factory function.\n\n**Note:** At least two proxies must be provided for the chain to be established.\n\n```typescript\nconst options = {\n proxies: [ // The chain order is the order in the proxies array, meaning the last proxy will establish a connection to the destination.\n {\n host: '159.203.75.235', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n },\n {\n host: '104.131.124.203', // ipv4, ipv6, or hostname\n port: 1081,\n type: 5\n }\n ]\n\n command: 'connect', // Only connect is supported in chaining mode.\n\n destination: {\n host: '192.30.253.113', // ipv4, ipv6, hostname\n port: 80\n }\n}\n```\n\n### Class Method: SocksClient.createUDPFrame(details)\n* ```details``` { SocksUDPFrameDetails } - An object containing the remote host, frame number, and frame data to use when creating a SOCKS UDP frame packet.\n* ```returns``` { Buffer } - A Buffer containing all of the UDP frame data.\n\nCreates a SOCKS UDP frame relay packet that is sent and received via a SOCKS proxy when using the associate command for UDP packet forwarding.\n\n**SocksUDPFrameDetails**\n\n```typescript\n{\n frameNumber: 0, // The frame number (used for breaking up larger packets)\n\n remoteHost: { // The remote host to have the proxy send data to, or the remote host that send this data.\n host: '1.2.3.4',\n port: 1234\n },\n\n data: <Buffer 01 02 03 04...> // A Buffer instance of data to include in the packet (actual data sent to the remote host)\n}\ninterface SocksUDPFrameDetails {\n // The frame number of the packet.\n frameNumber?: number;\n\n // The remote host.\n remoteHost: SocksRemoteHost;\n\n // The packet data.\n data: Buffer;\n}\n```\n\n### Class Method: SocksClient.parseUDPFrame(data)\n* ```data``` { Buffer } - A Buffer instance containing SOCKS UDP frame data to parse.\n* ```returns``` { SocksUDPFrameDetails } - An object containing the remote host, frame number, and frame data of the SOCKS UDP frame.\n\n```typescript\nconst frame = SocksClient.parseUDPFrame(data);\nconsole.log(frame);\n/*\n{\n frameNumber: 0,\n remoteHost: {\n host: '1.2.3.4',\n port: 1234\n },\n data: <Buffer 01 02 03 04 ...>\n}\n*/\n```\n\nParses a Buffer instance and returns the parsed SocksUDPFrameDetails object.\n\n## Event: 'error'\n* ```err``` { SocksClientError } - An Error object containing an error message and the original SocksClientOptions.\n\nThis event is emitted if an error occurs when trying to establish the proxy connection.\n\n## Event: 'bound'\n* ```info``` { SocksClientBoundEvent } An object containing a Socket and SocksRemoteHost info.\n\nThis event is emitted when using the BIND command on a remote SOCKS proxy server. This event indicates the proxy server is now listening for incoming connections on a specified port.\n\n**SocksClientBoundEvent**\n```typescript\n{\n socket: net.Socket, // The underlying raw Socket\n remoteHost: {\n host: '1.2.3.4', // The remote host that is listening (usually the proxy itself)\n port: 4444 // The remote port the proxy is listening on for incoming connections (when using BIND).\n }\n}\n```\n\n## Event: 'established'\n* ```info``` { SocksClientEstablishedEvent } An object containing a Socket and SocksRemoteHost info.\n\nThis event is emitted when the following conditions are met:\n1. When using the CONNECT command, and a proxy connection has been established to the remote host.\n2. When using the BIND command, and an incoming connection has been accepted by the proxy and a TCP relay has been established.\n3. When using the ASSOCIATE command, and a UDP relay has been established.\n\nWhen using BIND, 'bound' is first emitted to indicate the SOCKS server is waiting for an incoming connection, and provides the remote port the SOCKS server is listening on.\n\nWhen using ASSOCIATE, 'established' is emitted with the remote UDP port the SOCKS server is accepting UDP frame packets on.\n\n**SocksClientEstablishedEvent**\n```typescript\n{\n socket: net.Socket, // The underlying raw Socket\n remoteHost: {\n host: '1.2.3.4', // The remote host that is listening (usually the proxy itself)\n port: 52738 // The remote port the proxy is listening on for incoming connections (when using BIND).\n }\n}\n```\n\n## client.connect()\n\nStarts connecting to the remote SOCKS proxy server to establish a proxy connection to the destination host.\n\n## client.socksClientOptions\n* ```returns``` { SocksClientOptions } The options that were passed to the SocksClient.\n\nGets the options that were passed to the SocksClient when it was created.\n\n\n**SocksClientError**\n```typescript\n{ // Subclassed from Error.\n message: 'An error has occurred',\n options: {\n // SocksClientOptions\n }\n}\n```\n\n# Further Reading:\n\nPlease read the SOCKS 5 specifications for more information on how to use BIND and Associate.\nhttp://www.ietf.org/rfc/rfc1928.txt\n\n# License\n\nThis work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).\n","author":{"name":"Josh Glazebrook"},"repository":{"type":"git","url":"git+https://github.com/JoshGlazebrook/socks.git"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/JoshGlazebrook/socks/","bugs":{"url":"https://github.com/JoshGlazebrook/socks/issues"}}
+{
+ "name": "socks",
+ "description": "Fully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.",
+ "dist-tags": {
+ "latest": "2.8.3"
+ },
+ "versions": {
+ "2.8.3": {
+ "name": "socks",
+ "private": false,
+ "version": "2.8.3",
+ "description": "Fully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.",
+ "main": "build/index.js",
+ "typings": "typings/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JoshGlazebrook/socks.git"
+ },
+ "bugs": {
+ "url": "https://github.com/JoshGlazebrook/socks/issues"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ },
+ "author": {
+ "name": "Josh Glazebrook"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@types/mocha": "^10.0.6",
+ "@types/node": "^20.11.17",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "eslint": "^8.20.0",
+ "mocha": "^10.0.0",
+ "prettier": "^3.2.5",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.3.3"
+ },
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "scripts": {
+ "prepublish": "npm install -g typescript && npm run build",
+ "test": "NODE_ENV=test mocha --recursive --require ts-node/register test/**/*.ts",
+ "prettier": "prettier --write ./src/**/*.ts --config .prettierrc.yaml",
+ "lint": "eslint 'src/**/*.ts'",
+ "build": "rm -rf build typings && prettier --write ./src/**/*.ts --config .prettierrc.yaml && tsc -p .",
+ "build-raw": "rm -rf build typings && tsc -p ."
+ },
+ "_id": "socks@2.8.3",
+ "gitHead": "a2a06d9967edfaa317e6d20d33963b95a3e654e3",
+ "_nodeVersion": "20.11.1",
+ "_npmVersion": "10.2.4",
+ "dist": {
+ "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
+ "shasum": "1ebd0f09c52ba95a09750afe3f3f9f724a800cb5",
+ "tarball": "http://localhost:4260/socks/socks-2.8.3.tgz",
+ "fileCount": 32,
+ "unpackedSize": 156302
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Josh Glazebrook"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JoshGlazebrook/socks.git"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/JoshGlazebrook/socks/",
+ "bugs": {
+ "url": "https://github.com/JoshGlazebrook/socks/issues"
+ }
+}
diff --git a/tests/registry/npm/source-map-js/registry.json b/tests/registry/npm/source-map-js/registry.json
index 8b4f2484b..5d479b002 100644
--- a/tests/registry/npm/source-map-js/registry.json
+++ b/tests/registry/npm/source-map-js/registry.json
@@ -1 +1,71 @@
-{"name":"source-map-js","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.2":{"name":"source-map-js","description":"Generates and consumes source maps","version":"1.0.2","author":{"name":"Valentin 7rulnik Semirulnik","email":"v7rulnik@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/7rulnik/source-map-js.git"},"main":"./source-map.js","engines":{"node":">=0.10.0"},"license":"BSD-3-Clause","scripts":{"test":"npm run build && node test/run-tests.js","build":"webpack --color","toc":"doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"},"devDependencies":{"clean-publish":"^3.1.0","doctoc":"^0.15.0","webpack":"^1.12.0"},"clean-publish":{"cleanDocs":true},"typings":"source-map.d.ts","gitHead":"04907d5b2dc88bef63e5399452fa6a696f90bf66","bugs":{"url":"https://github.com/7rulnik/source-map-js/issues"},"_id":"source-map-js@1.0.2","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==","shasum":"adbc361d9c62df380125e7f161f71c826f1e490c","tarball":"http://localhost:4260/source-map-js/source-map-js-1.0.2.tgz","fileCount":16,"unpackedSize":147831,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5umPCRA9TVsSAnZWagAAMqEP/0DngYla5huM0HizcOJ2\na7DMFSMKl9SD8IOSBhIiUmI1IfdYpBiZTjipCE0RaSub07mtvpdlerfssISd\nRpCdnwS+igzz9MSEJl2e5C1HRFojOLsK7pxw0YMs78GLOga9IkchM2wcFXz7\n8If5+e8S+jPtr2Cl8CbGSmPM+gRDbCOSZICPqSK8akRNdiEADxi1szPJBnId\nfrfpefcav4hmNLB3P33xsXUEi4yEmlPunoodCUpALx9isYRjDTTeVPc2G3UE\nuFmdLtKNR009Ol49jkY4msGoKTuTTwNpaRS762KaF0Of4P1z0Tv17wrIs2CG\n7aNfqk/Jg/Rh3Qxz09FfdpIwUR6G8JCW2DP1lD7mWYBh2zA5WfNlqQK81SvM\ndJOCOdJ3qjKOVO3L0hymzO/dgl0dPzr5cU+VCULynLKPcdeyPNyFGoI5R/vv\n8SvxNPk74F/N4PsGsmz+8ZowRYX5YO2bu7P78dFvfBKKmNHejeMeB6SAlxT4\nzsjg7CQDS8ywvOot/lkVqKamRPdqasraw3hZ/cVDsTq2UpV8U44Ikmi6cbTn\nAguQmlI+GXQy/nYJV9CGdNrVXzyjeE97da0kzb+ny1WSJhmZOML4FT4HaIcQ\niOUUTKrxnfSRg+x9+5SnHvTZfn1Cla7eBuxv+hHgFUh2DRLXoyF2TEuNK3E5\ndUXm\r\n=0pTz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3iJq3pz1lRdqxJMTNnnc2/7pNChwmigaptIlftPAlagIgZxoXceWfWlyrYGdJ4AqJgfGZXF+T0YXVxu+VS9cmizo="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Generates and consumes source maps","homepage":"https://github.com/7rulnik/source-map-js","repository":{"type":"git","url":"git+https://github.com/7rulnik/source-map-js.git"},"author":{"name":"Valentin 7rulnik Semirulnik","email":"v7rulnik@gmail.com"},"bugs":{"url":"https://github.com/7rulnik/source-map-js/issues"},"license":"BSD-3-Clause","readme":"# Source Map JS\n\n[![NPM](https://nodei.co/npm/source-map-js.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map-js)\n\nDifference between original [source-map](https://github.com/mozilla/source-map):\n\n> TL,DR: it's fork of original source-map@0.6, but with perfomance optimizations.\n\nThis journey starts from [source-map@0.7.0](https://github.com/mozilla/source-map/blob/master/CHANGELOG.md#070). Some part of it was rewritten to Rust and WASM and API became async.\n\nIt's still a major block for many libraries like PostCSS or Sass for example because they need to migrate the whole API to the async way. This is the reason why 0.6.1 has 2x more downloads than 0.7.3 while it's faster several times.\n\n![Downloads count](media/downloads.png)\n\nMore important that WASM version has some optimizations in JS code too. This is why [community asked to create branch for 0.6 version](https://github.com/mozilla/source-map/issues/324) and port these optimizations but, sadly, the answer was «no». A bit later I discovered [the issue](https://github.com/mozilla/source-map/issues/370) created by [Ben Rothman (@benthemonkey)](https://github.com/benthemonkey) with no response at all.\n\n[Roman Dvornov (@lahmatiy)](https://github.com/lahmatiy) wrote a [serveral posts](https://t.me/gorshochekvarit/76) (russian, only, sorry) about source-map library in his own Telegram channel. He mentioned the article [«Maybe you don't need Rust and WASM to speed up your JS»](https://mrale.ph/blog/2018/02/03/maybe-you-dont-need-rust-to-speed-up-your-js.html) written by [Vyacheslav Egorov (@mraleph)](https://github.com/mraleph). This article contains optimizations and hacks that lead to almost the same performance compare to WASM implementation.\n\nI decided to fork the original source-map and port these optimizations from the article and several others PR from the original source-map.\n\n---------\n\nThis is a library to generate and consume the source map format\n[described here][format].\n\n[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit\n\n## Use with Node\n\n $ npm install source-map-js\n\n<!-- ## Use on the Web\n\n <script src=\"https://raw.githubusercontent.com/mozilla/source-map/master/dist/source-map.min.js\" defer></script> -->\n\n--------------------------------------------------------------------------------\n\n<!-- `npm run toc` to regenerate the Table of Contents -->\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Examples](#examples)\n - [Consuming a source map](#consuming-a-source-map)\n - [Generating a source map](#generating-a-source-map)\n - [With SourceNode (high level API)](#with-sourcenode-high-level-api)\n - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)\n- [API](#api)\n - [SourceMapConsumer](#sourcemapconsumer)\n - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)\n - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)\n - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)\n - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)\n - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)\n - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)\n - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)\n - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)\n - [SourceMapGenerator](#sourcemapgenerator)\n - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)\n - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)\n - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)\n - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)\n - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)\n - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)\n - [SourceNode](#sourcenode)\n - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)\n - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)\n - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)\n - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)\n - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)\n - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)\n - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)\n - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)\n - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)\n - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)\n - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Examples\n\n### Consuming a source map\n\n```js\nvar rawSourceMap = {\n version: 3,\n file: 'min.js',\n names: ['bar', 'baz', 'n'],\n sources: ['one.js', 'two.js'],\n sourceRoot: 'http://example.com/www/js/',\n mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'\n};\n\nvar smc = new SourceMapConsumer(rawSourceMap);\n\nconsole.log(smc.sources);\n// [ 'http://example.com/www/js/one.js',\n// 'http://example.com/www/js/two.js' ]\n\nconsole.log(smc.originalPositionFor({\n line: 2,\n column: 28\n}));\n// { source: 'http://example.com/www/js/two.js',\n// line: 2,\n// column: 10,\n// name: 'n' }\n\nconsole.log(smc.generatedPositionFor({\n source: 'http://example.com/www/js/two.js',\n line: 2,\n column: 10\n}));\n// { line: 2, column: 28 }\n\nsmc.eachMapping(function (m) {\n // ...\n});\n```\n\n### Generating a source map\n\nIn depth guide:\n[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)\n\n#### With SourceNode (high level API)\n\n```js\nfunction compile(ast) {\n switch (ast.type) {\n case 'BinaryExpression':\n return new SourceNode(\n ast.location.line,\n ast.location.column,\n ast.location.source,\n [compile(ast.left), \" + \", compile(ast.right)]\n );\n case 'Literal':\n return new SourceNode(\n ast.location.line,\n ast.location.column,\n ast.location.source,\n String(ast.value)\n );\n // ...\n default:\n throw new Error(\"Bad AST\");\n }\n}\n\nvar ast = parse(\"40 + 2\", \"add.js\");\nconsole.log(compile(ast).toStringWithSourceMap({\n file: 'add.js'\n}));\n// { code: '40 + 2',\n// map: [object SourceMapGenerator] }\n```\n\n#### With SourceMapGenerator (low level API)\n\n```js\nvar map = new SourceMapGenerator({\n file: \"source-mapped.js\"\n});\n\nmap.addMapping({\n generated: {\n line: 10,\n column: 35\n },\n source: \"foo.js\",\n original: {\n line: 33,\n column: 2\n },\n name: \"christopher\"\n});\n\nconsole.log(map.toString());\n// '{\"version\":3,\"file\":\"source-mapped.js\",\"sources\":[\"foo.js\"],\"names\":[\"christopher\"],\"mappings\":\";;;;;;;;;mCAgCEA\"}'\n```\n\n## API\n\nGet a reference to the module:\n\n```js\n// Node.js\nvar sourceMap = require('source-map');\n\n// Browser builds\nvar sourceMap = window.sourceMap;\n\n// Inside Firefox\nconst sourceMap = require(\"devtools/toolkit/sourcemap/source-map.js\");\n```\n\n### SourceMapConsumer\n\nA SourceMapConsumer instance represents a parsed source map which we can query\nfor information about the original file positions by giving it a file position\nin the generated source.\n\n#### new SourceMapConsumer(rawSourceMap)\n\nThe only parameter is the raw source map (either as a string which can be\n`JSON.parse`'d, or an object). According to the spec, source maps have the\nfollowing attributes:\n\n* `version`: Which version of the source map spec this map is following.\n\n* `sources`: An array of URLs to the original source files.\n\n* `names`: An array of identifiers which can be referenced by individual\n mappings.\n\n* `sourceRoot`: Optional. The URL root from which all sources are relative.\n\n* `sourcesContent`: Optional. An array of contents of the original source files.\n\n* `mappings`: A string of base64 VLQs which contain the actual mappings.\n\n* `file`: Optional. The generated filename this source map is associated with.\n\n```js\nvar consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);\n```\n\n#### SourceMapConsumer.prototype.computeColumnSpans()\n\nCompute the last column for each generated mapping. The last column is\ninclusive.\n\n```js\n// Before:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1 },\n// { line: 2,\n// column: 10 },\n// { line: 2,\n// column: 20 } ]\n\nconsumer.computeColumnSpans();\n\n// After:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1,\n// lastColumn: 9 },\n// { line: 2,\n// column: 10,\n// lastColumn: 19 },\n// { line: 2,\n// column: 20,\n// lastColumn: Infinity } ]\n\n```\n\n#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)\n\nReturns the original source, line, and column information for the generated\nsource's line and column positions provided. The only argument is an object with\nthe following properties:\n\n* `line`: The line number in the generated source. Line numbers in\n this library are 1-based (note that the underlying source map\n specification uses 0-based line numbers -- this library handles the\n translation).\n\n* `column`: The column number in the generated source. Column numbers\n in this library are 0-based.\n\n* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or\n `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest\n element that is smaller than or greater than the one we are searching for,\n respectively, if the exact element cannot be found. Defaults to\n `SourceMapConsumer.GREATEST_LOWER_BOUND`.\n\nand an object is returned with the following properties:\n\n* `source`: The original source file, or null if this information is not\n available.\n\n* `line`: The line number in the original source, or null if this information is\n not available. The line number is 1-based.\n\n* `column`: The column number in the original source, or null if this\n information is not available. The column number is 0-based.\n\n* `name`: The original identifier, or null if this information is not available.\n\n```js\nconsumer.originalPositionFor({ line: 2, column: 10 })\n// { source: 'foo.coffee',\n// line: 2,\n// column: 2,\n// name: null }\n\nconsumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })\n// { source: null,\n// line: null,\n// column: null,\n// name: null }\n```\n\n#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)\n\nReturns the generated line and column information for the original source,\nline, and column positions provided. The only argument is an object with\nthe following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source. The line number is\n 1-based.\n\n* `column`: The column number in the original source. The column\n number is 0-based.\n\nand an object is returned with the following properties:\n\n* `line`: The line number in the generated source, or null. The line\n number is 1-based.\n\n* `column`: The column number in the generated source, or null. The\n column number is 0-based.\n\n```js\nconsumer.generatedPositionFor({ source: \"example.js\", line: 2, column: 10 })\n// { line: 1,\n// column: 56 }\n```\n\n#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)\n\nReturns all generated line and column information for the original source, line,\nand column provided. If no column is provided, returns all mappings\ncorresponding to a either the line we are searching for or the next closest line\nthat has any mappings. Otherwise, returns all mappings corresponding to the\ngiven line and either the column we are searching for or the next closest column\nthat has any offsets.\n\nThe only argument is an object with the following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source. The line number is\n 1-based.\n\n* `column`: Optional. The column number in the original source. The\n column number is 0-based.\n\nand an array of objects is returned, each with the following properties:\n\n* `line`: The line number in the generated source, or null. The line\n number is 1-based.\n\n* `column`: The column number in the generated source, or null. The\n column number is 0-based.\n\n```js\nconsumer.allGeneratedpositionsfor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1 },\n// { line: 2,\n// column: 10 },\n// { line: 2,\n// column: 20 } ]\n```\n\n#### SourceMapConsumer.prototype.hasContentsOfAllSources()\n\nReturn true if we have the embedded source content for every source listed in\nthe source map, false otherwise.\n\nIn other words, if this method returns `true`, then\n`consumer.sourceContentFor(s)` will succeed for every source `s` in\n`consumer.sources`.\n\n```js\n// ...\nif (consumer.hasContentsOfAllSources()) {\n consumerReadyCallback(consumer);\n} else {\n fetchSources(consumer, consumerReadyCallback);\n}\n// ...\n```\n\n#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])\n\nReturns the original source content for the source provided. The only\nargument is the URL of the original source file.\n\nIf the source content for the given source is not found, then an error is\nthrown. Optionally, pass `true` as the second param to have `null` returned\ninstead.\n\n```js\nconsumer.sources\n// [ \"my-cool-lib.clj\" ]\n\nconsumer.sourceContentFor(\"my-cool-lib.clj\")\n// \"...\"\n\nconsumer.sourceContentFor(\"this is not in the source map\");\n// Error: \"this is not in the source map\" is not in the source map\n\nconsumer.sourceContentFor(\"this is not in the source map\", true);\n// null\n```\n\n#### SourceMapConsumer.prototype.eachMapping(callback, context, order)\n\nIterate over each mapping between an original source/line/column and a\ngenerated line/column in this source map.\n\n* `callback`: The function that is called with each mapping. Mappings have the\n form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,\n name }`\n\n* `context`: Optional. If specified, this object will be the value of `this`\n every time that `callback` is called.\n\n* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or\n `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over\n the mappings sorted by the generated file's line/column order or the\n original's source/line/column order, respectively. Defaults to\n `SourceMapConsumer.GENERATED_ORDER`.\n\n```js\nconsumer.eachMapping(function (m) { console.log(m); })\n// ...\n// { source: 'illmatic.js',\n// generatedLine: 1,\n// generatedColumn: 0,\n// originalLine: 1,\n// originalColumn: 0,\n// name: null }\n// { source: 'illmatic.js',\n// generatedLine: 2,\n// generatedColumn: 0,\n// originalLine: 2,\n// originalColumn: 0,\n// name: null }\n// ...\n```\n### SourceMapGenerator\n\nAn instance of the SourceMapGenerator represents a source map which is being\nbuilt incrementally.\n\n#### new SourceMapGenerator([startOfSourceMap])\n\nYou may pass an object with the following properties:\n\n* `file`: The filename of the generated source that this source map is\n associated with.\n\n* `sourceRoot`: A root for all relative URLs in this source map.\n\n* `skipValidation`: Optional. When `true`, disables validation of mappings as\n they are added. This can improve performance but should be used with\n discretion, as a last resort. Even then, one should avoid using this flag when\n running tests, if possible.\n\n```js\nvar generator = new sourceMap.SourceMapGenerator({\n file: \"my-generated-javascript-file.js\",\n sourceRoot: \"http://example.com/app/js/\"\n});\n```\n\n#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)\n\nCreates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.\n\n* `sourceMapConsumer` The SourceMap.\n\n```js\nvar generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);\n```\n\n#### SourceMapGenerator.prototype.addMapping(mapping)\n\nAdd a single mapping from original source line and column to the generated\nsource's line and column for this source map being created. The mapping object\nshould have the following properties:\n\n* `generated`: An object with the generated line and column positions.\n\n* `original`: An object with the original line and column positions.\n\n* `source`: The original source file (relative to the sourceRoot).\n\n* `name`: An optional original token name for this mapping.\n\n```js\ngenerator.addMapping({\n source: \"module-one.scm\",\n original: { line: 128, column: 0 },\n generated: { line: 3, column: 456 }\n})\n```\n\n#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for an original source file.\n\n* `sourceFile` the URL of the original source file.\n\n* `sourceContent` the content of the source file.\n\n```js\ngenerator.setSourceContent(\"module-one.scm\",\n fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])\n\nApplies a SourceMap for a source file to the SourceMap.\nEach mapping to the supplied source file is rewritten using the\nsupplied SourceMap. Note: The resolution for the resulting mappings\nis the minimum of this map and the supplied map.\n\n* `sourceMapConsumer`: The SourceMap to be applied.\n\n* `sourceFile`: Optional. The filename of the source file.\n If omitted, sourceMapConsumer.file will be used, if it exists.\n Otherwise an error will be thrown.\n\n* `sourceMapPath`: Optional. The dirname of the path to the SourceMap\n to be applied. If relative, it is relative to the SourceMap.\n\n This parameter is needed when the two SourceMaps aren't in the same\n directory, and the SourceMap to be applied contains relative source\n paths. If so, those relative source paths need to be rewritten\n relative to the SourceMap.\n\n If omitted, it is assumed that both SourceMaps are in the same directory,\n thus not needing any rewriting. (Supplying `'.'` has the same effect.)\n\n#### SourceMapGenerator.prototype.toString()\n\nRenders the source map being generated to a string.\n\n```js\ngenerator.toString()\n// '{\"version\":3,\"sources\":[\"module-one.scm\"],\"names\":[],\"mappings\":\"...snip...\",\"file\":\"my-generated-javascript-file.js\",\"sourceRoot\":\"http://example.com/app/js/\"}'\n```\n\n### SourceNode\n\nSourceNodes provide a way to abstract over interpolating and/or concatenating\nsnippets of generated JavaScript source code, while maintaining the line and\ncolumn information associated between those snippets and the original source\ncode. This is useful as the final intermediate representation a compiler might\nuse before outputting the generated JS and source map.\n\n#### new SourceNode([line, column, source[, chunk[, name]]])\n\n* `line`: The original line number associated with this source node, or null if\n it isn't associated with an original line. The line number is 1-based.\n\n* `column`: The original column number associated with this source node, or null\n if it isn't associated with an original column. The column number\n is 0-based.\n\n* `source`: The original source's filename; null if no filename is provided.\n\n* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see\n below.\n\n* `name`: Optional. The original identifier.\n\n```js\nvar node = new SourceNode(1, 2, \"a.cpp\", [\n new SourceNode(3, 4, \"b.cpp\", \"extern int status;\\n\"),\n new SourceNode(5, 6, \"c.cpp\", \"std::string* make_string(size_t n);\\n\"),\n new SourceNode(7, 8, \"d.cpp\", \"int main(int argc, char** argv) {}\\n\"),\n]);\n```\n\n#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])\n\nCreates a SourceNode from generated code and a SourceMapConsumer.\n\n* `code`: The generated code\n\n* `sourceMapConsumer` The SourceMap for the generated code\n\n* `relativePath` The optional path that relative sources in `sourceMapConsumer`\n should be relative to.\n\n```js\nvar consumer = new SourceMapConsumer(fs.readFileSync(\"path/to/my-file.js.map\", \"utf8\"));\nvar node = SourceNode.fromStringWithSourceMap(fs.readFileSync(\"path/to/my-file.js\"),\n consumer);\n```\n\n#### SourceNode.prototype.add(chunk)\n\nAdd a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.add(\" + \");\nnode.add(otherNode);\nnode.add([leftHandOperandNode, \" + \", rightHandOperandNode]);\n```\n\n#### SourceNode.prototype.prepend(chunk)\n\nPrepend a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.prepend(\"/** Build Id: f783haef86324gf **/\\n\\n\");\n```\n\n#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for a source file. This will be added to the\n`SourceMap` in the `sourcesContent` field.\n\n* `sourceFile`: The filename of the source file\n\n* `sourceContent`: The content of the source file\n\n```js\nnode.setSourceContent(\"module-one.scm\",\n fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceNode.prototype.walk(fn)\n\nWalk over the tree of JS snippets in this node and its children. The walking\nfunction is called once for each snippet of JS and is passed that snippet and\nthe its original associated source's line/column location.\n\n* `fn`: The traversal function.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.walk(function (code, loc) { console.log(\"WALK:\", code, loc); })\n// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }\n// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }\n```\n\n#### SourceNode.prototype.walkSourceContents(fn)\n\nWalk over the tree of SourceNodes. The walking function is called for each\nsource file content and is passed the filename and source content.\n\n* `fn`: The traversal function.\n\n```js\nvar a = new SourceNode(1, 2, \"a.js\", \"generated from a\");\na.setSourceContent(\"a.js\", \"original a\");\nvar b = new SourceNode(1, 2, \"b.js\", \"generated from b\");\nb.setSourceContent(\"b.js\", \"original b\");\nvar c = new SourceNode(1, 2, \"c.js\", \"generated from c\");\nc.setSourceContent(\"c.js\", \"original c\");\n\nvar node = new SourceNode(null, null, null, [a, b, c]);\nnode.walkSourceContents(function (source, contents) { console.log(\"WALK:\", source, \":\", contents); })\n// WALK: a.js : original a\n// WALK: b.js : original b\n// WALK: c.js : original c\n```\n\n#### SourceNode.prototype.join(sep)\n\nLike `Array.prototype.join` except for SourceNodes. Inserts the separator\nbetween each of this source node's children.\n\n* `sep`: The separator.\n\n```js\nvar lhs = new SourceNode(1, 2, \"a.rs\", \"my_copy\");\nvar operand = new SourceNode(3, 4, \"a.rs\", \"=\");\nvar rhs = new SourceNode(5, 6, \"a.rs\", \"orig.clone()\");\n\nvar node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);\nvar joinedNode = node.join(\" \");\n```\n\n#### SourceNode.prototype.replaceRight(pattern, replacement)\n\nCall `String.prototype.replace` on the very right-most source snippet. Useful\nfor trimming white space from the end of a source node, etc.\n\n* `pattern`: The pattern to replace.\n\n* `replacement`: The thing to replace the pattern with.\n\n```js\n// Trim trailing white space.\nnode.replaceRight(/\\s*$/, \"\");\n```\n\n#### SourceNode.prototype.toString()\n\nReturn the string representation of this source node. Walks over the tree and\nconcatenates all the various snippets together to one string.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.toString()\n// 'unodostresquatro'\n```\n\n#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])\n\nReturns the string representation of this tree of source nodes, plus a\nSourceMapGenerator which contains all the mappings between the generated and\noriginal sources.\n\nThe arguments are the same as those to `new SourceMapGenerator`.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.toStringWithSourceMap({ file: \"my-output-file.js\" })\n// { code: 'unodostresquatro',\n// map: [object SourceMapGenerator] }\n```\n","readmeFilename":"README.md"}
+{
+ "name": "source-map-js",
+ "dist-tags": {
+ "latest": "1.0.2"
+ },
+ "versions": {
+ "1.0.2": {
+ "name": "source-map-js",
+ "description": "Generates and consumes source maps",
+ "version": "1.0.2",
+ "author": {
+ "name": "Valentin 7rulnik Semirulnik",
+ "email": "v7rulnik@gmail.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/7rulnik/source-map-js.git"
+ },
+ "main": "./source-map.js",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "license": "BSD-3-Clause",
+ "scripts": {
+ "test": "npm run build && node test/run-tests.js",
+ "build": "webpack --color",
+ "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
+ },
+ "devDependencies": {
+ "clean-publish": "^3.1.0",
+ "doctoc": "^0.15.0",
+ "webpack": "^1.12.0"
+ },
+ "clean-publish": {
+ "cleanDocs": true
+ },
+ "typings": "source-map.d.ts",
+ "gitHead": "04907d5b2dc88bef63e5399452fa6a696f90bf66",
+ "bugs": {
+ "url": "https://github.com/7rulnik/source-map-js/issues"
+ },
+ "_id": "source-map-js@1.0.2",
+ "_nodeVersion": "14.17.0",
+ "_npmVersion": "6.14.13",
+ "dist": {
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "shasum": "adbc361d9c62df380125e7f161f71c826f1e490c",
+ "tarball": "http://localhost:4260/source-map-js/source-map-js-1.0.2.tgz",
+ "fileCount": 16,
+ "unpackedSize": 147831
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Generates and consumes source maps",
+ "homepage": "https://github.com/7rulnik/source-map-js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/7rulnik/source-map-js.git"
+ },
+ "author": {
+ "name": "Valentin 7rulnik Semirulnik",
+ "email": "v7rulnik@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/7rulnik/source-map-js/issues"
+ },
+ "license": "BSD-3-Clause",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/source-map/registry.json b/tests/registry/npm/source-map/registry.json
index e739a54c2..e812d3532 100644
--- a/tests/registry/npm/source-map/registry.json
+++ b/tests/registry/npm/source-map/registry.json
@@ -1 +1,73 @@
-{"name":"source-map","description":"Generates and consumes source maps","dist-tags":{"latest":"0.6.1"},"versions":{"0.6.1":{"name":"source-map","description":"Generates and consumes source maps","version":"0.6.1","author":{"name":"Nick Fitzgerald","email":"nfitzgerald@mozilla.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/mozilla/source-map.git"},"main":"./source-map.js","files":["source-map.js","source-map.d.ts","lib/","dist/source-map.debug.js","dist/source-map.js","dist/source-map.min.js","dist/source-map.min.js.map"],"engines":{"node":">=0.10.0"},"license":"BSD-3-Clause","scripts":{"test":"npm run build && node test/run-tests.js","build":"webpack --color","toc":"doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"},"devDependencies":{"doctoc":"^0.15.0","webpack":"^1.12.0"},"typings":"source-map","gitHead":"ac518d2f21818146f3310557bd51c13d8cff2ba8","bugs":{"url":"https://github.com/mozilla/source-map/issues"},"_id":"source-map@0.6.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","dist":{"integrity":"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==","shasum":"74722af32e9614e9c287a8d0bbde48b5e2f1a263","tarball":"http://localhost:4260/source-map/source-map-0.6.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPx7x89gwCo+c9mch3nQQV4x592HZQjNy/wpijqND5dwIgdntgvrjeVvc+G3I58Ystp1p/nRlBvwCttzsVkDpLzVo="}]},"directories":{}}},"author":{"name":"Nick Fitzgerald","email":"nfitzgerald@mozilla.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/mozilla/source-map.git"},"readme":"# Source Map\n\n[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)\n\n[![Coverage Status](https://coveralls.io/repos/github/mozilla/source-map/badge.svg)](https://coveralls.io/github/mozilla/source-map)\n\n[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map)\n\nThis is a library to generate and consume the source map format\n[described here][format].\n\n[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit\n\n## Use with Node\n\n $ npm install source-map\n\n## Use on the Web\n\n <script src=\"https://unpkg.com/source-map@0.7.3/dist/source-map.js\"></script>\n <script>\n sourceMap.SourceMapConsumer.initialize({\n \"lib/mappings.wasm\": \"https://unpkg.com/source-map@0.7.3/lib/mappings.wasm\"\n });\n </script>\n\n--------------------------------------------------------------------------------\n\n<!-- `npm run toc` to regenerate the Table of Contents -->\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Examples](#examples)\n - [Consuming a source map](#consuming-a-source-map)\n - [Generating a source map](#generating-a-source-map)\n - [With SourceNode (high level API)](#with-sourcenode-high-level-api)\n - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)\n- [API](#api)\n - [SourceMapConsumer](#sourcemapconsumer)\n - [SourceMapConsumer.initialize(options)](#sourcemapconsumerinitializeoptions)\n - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)\n - [SourceMapConsumer.with](#sourcemapconsumerwith)\n - [SourceMapConsumer.prototype.destroy()](#sourcemapconsumerprototypedestroy)\n - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)\n - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)\n - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)\n - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)\n - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)\n - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)\n - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)\n - [SourceMapGenerator](#sourcemapgenerator)\n - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)\n - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)\n - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)\n - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)\n - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)\n - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)\n - [SourceNode](#sourcenode)\n - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)\n - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)\n - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)\n - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)\n - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)\n - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)\n - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)\n - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)\n - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)\n - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)\n - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Examples\n\n### Consuming a source map\n\n```js\nconst rawSourceMap = {\n version: 3,\n file: 'min.js',\n names: ['bar', 'baz', 'n'],\n sources: ['one.js', 'two.js'],\n sourceRoot: 'http://example.com/www/js/',\n mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'\n};\n\nconst whatever = await SourceMapConsumer.with(rawSourceMap, null, consumer => {\n\n console.log(consumer.sources);\n // [ 'http://example.com/www/js/one.js',\n // 'http://example.com/www/js/two.js' ]\n\n console.log(consumer.originalPositionFor({\n line: 2,\n column: 28\n }));\n // { source: 'http://example.com/www/js/two.js',\n // line: 2,\n // column: 10,\n // name: 'n' }\n\n console.log(consumer.generatedPositionFor({\n source: 'http://example.com/www/js/two.js',\n line: 2,\n column: 10\n }));\n // { line: 2, column: 28 }\n\n consumer.eachMapping(function (m) {\n // ...\n });\n\n return computeWhatever();\n});\n```\n\n### Generating a source map\n\nIn depth guide:\n[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)\n\n#### With SourceNode (high level API)\n\n```js\nfunction compile(ast) {\n switch (ast.type) {\n case 'BinaryExpression':\n return new SourceNode(\n ast.location.line,\n ast.location.column,\n ast.location.source,\n [compile(ast.left), \" + \", compile(ast.right)]\n );\n case 'Literal':\n return new SourceNode(\n ast.location.line,\n ast.location.column,\n ast.location.source,\n String(ast.value)\n );\n // ...\n default:\n throw new Error(\"Bad AST\");\n }\n}\n\nvar ast = parse(\"40 + 2\", \"add.js\");\nconsole.log(compile(ast).toStringWithSourceMap({\n file: 'add.js'\n}));\n// { code: '40 + 2',\n// map: [object SourceMapGenerator] }\n```\n\n#### With SourceMapGenerator (low level API)\n\n```js\nvar map = new SourceMapGenerator({\n file: \"source-mapped.js\"\n});\n\nmap.addMapping({\n generated: {\n line: 10,\n column: 35\n },\n source: \"foo.js\",\n original: {\n line: 33,\n column: 2\n },\n name: \"christopher\"\n});\n\nconsole.log(map.toString());\n// '{\"version\":3,\"file\":\"source-mapped.js\",\"sources\":[\"foo.js\"],\"names\":[\"christopher\"],\"mappings\":\";;;;;;;;;mCAgCEA\"}'\n```\n\n## API\n\nGet a reference to the module:\n\n```js\n// Node.js\nvar sourceMap = require('source-map');\n\n// Browser builds\nvar sourceMap = window.sourceMap;\n\n// Inside Firefox\nconst sourceMap = require(\"devtools/toolkit/sourcemap/source-map.js\");\n```\n\n### SourceMapConsumer\n\nA `SourceMapConsumer` instance represents a parsed source map which we can query\nfor information about the original file positions by giving it a file position\nin the generated source.\n\n#### SourceMapConsumer.initialize(options)\n\nWhen using `SourceMapConsumer` outside of node.js, for example on the Web, it\nneeds to know from what URL to load `lib/mappings.wasm`. You must inform it by\ncalling `initialize` before constructing any `SourceMapConsumer`s.\n\nThe options object has the following properties:\n\n* `\"lib/mappings.wasm\"`: A `String` containing the URL of the\n `lib/mappings.wasm` file, or an `ArrayBuffer` with the contents of `lib/mappings.wasm`.\n\n```js\nsourceMap.SourceMapConsumer.initialize({\n \"lib/mappings.wasm\": \"https://example.com/source-map/lib/mappings.wasm\"\n});\n```\n\n#### new SourceMapConsumer(rawSourceMap)\n\nThe only parameter is the raw source map (either as a string which can be\n`JSON.parse`'d, or an object). According to the spec, source maps have the\nfollowing attributes:\n\n* `version`: Which version of the source map spec this map is following.\n\n* `sources`: An array of URLs to the original source files.\n\n* `names`: An array of identifiers which can be referenced by individual\n mappings.\n\n* `sourceRoot`: Optional. The URL root from which all sources are relative.\n\n* `sourcesContent`: Optional. An array of contents of the original source files.\n\n* `mappings`: A string of base64 VLQs which contain the actual mappings.\n\n* `file`: Optional. The generated filename this source map is associated with.\n\nThe promise of the constructed souce map consumer is returned.\n\nWhen the `SourceMapConsumer` will no longer be used anymore, you must call its\n`destroy` method.\n\n```js\nconst consumer = await new sourceMap.SourceMapConsumer(rawSourceMapJsonData);\ndoStuffWith(consumer);\nconsumer.destroy();\n```\n\nAlternatively, you can use `SourceMapConsumer.with` to avoid needing to remember\nto call `destroy`.\n\n#### SourceMapConsumer.with\n\nConstruct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`\n(see the `SourceMapConsumer` constructor for details. Then, invoke the `async\nfunction f(SourceMapConsumer) -> T` with the newly constructed consumer, wait\nfor `f` to complete, call `destroy` on the consumer, and return `f`'s return\nvalue.\n\nYou must not use the consumer after `f` completes!\n\nBy using `with`, you do not have to remember to manually call `destroy` on\nthe consumer, since it will be called automatically once `f` completes.\n\n```js\nconst xSquared = await SourceMapConsumer.with(\n myRawSourceMap,\n null,\n async function (consumer) {\n // Use `consumer` inside here and don't worry about remembering\n // to call `destroy`.\n\n const x = await whatever(consumer);\n return x * x;\n }\n);\n\n// You may not use that `consumer` anymore out here; it has\n// been destroyed. But you can use `xSquared`.\nconsole.log(xSquared);\n```\n\n#### SourceMapConsumer.prototype.destroy()\n\nFree this source map consumer's associated wasm data that is manually-managed.\n\n```js\nconsumer.destroy();\n```\n\nAlternatively, you can use `SourceMapConsumer.with` to avoid needing to remember\nto call `destroy`.\n\n#### SourceMapConsumer.prototype.computeColumnSpans()\n\nCompute the last column for each generated mapping. The last column is\ninclusive.\n\n```js\n// Before:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1 },\n// { line: 2,\n// column: 10 },\n// { line: 2,\n// column: 20 } ]\n\nconsumer.computeColumnSpans();\n\n// After:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1,\n// lastColumn: 9 },\n// { line: 2,\n// column: 10,\n// lastColumn: 19 },\n// { line: 2,\n// column: 20,\n// lastColumn: Infinity } ]\n```\n\n#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)\n\nReturns the original source, line, and column information for the generated\nsource's line and column positions provided. The only argument is an object with\nthe following properties:\n\n* `line`: The line number in the generated source. Line numbers in\n this library are 1-based (note that the underlying source map\n specification uses 0-based line numbers -- this library handles the\n translation).\n\n* `column`: The column number in the generated source. Column numbers\n in this library are 0-based.\n\n* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or\n `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest\n element that is smaller than or greater than the one we are searching for,\n respectively, if the exact element cannot be found. Defaults to\n `SourceMapConsumer.GREATEST_LOWER_BOUND`.\n\nand an object is returned with the following properties:\n\n* `source`: The original source file, or null if this information is not\n available.\n\n* `line`: The line number in the original source, or null if this information is\n not available. The line number is 1-based.\n\n* `column`: The column number in the original source, or null if this\n information is not available. The column number is 0-based.\n\n* `name`: The original identifier, or null if this information is not available.\n\n```js\nconsumer.originalPositionFor({ line: 2, column: 10 })\n// { source: 'foo.coffee',\n// line: 2,\n// column: 2,\n// name: null }\n\nconsumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })\n// { source: null,\n// line: null,\n// column: null,\n// name: null }\n```\n\n#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)\n\nReturns the generated line and column information for the original source,\nline, and column positions provided. The only argument is an object with\nthe following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source. The line number is\n 1-based.\n\n* `column`: The column number in the original source. The column\n number is 0-based.\n\nand an object is returned with the following properties:\n\n* `line`: The line number in the generated source, or null. The line\n number is 1-based.\n\n* `column`: The column number in the generated source, or null. The\n column number is 0-based.\n\n```js\nconsumer.generatedPositionFor({ source: \"example.js\", line: 2, column: 10 })\n// { line: 1,\n// column: 56 }\n```\n\n#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)\n\nReturns all generated line and column information for the original source, line,\nand column provided. If no column is provided, returns all mappings\ncorresponding to a either the line we are searching for or the next closest line\nthat has any mappings. Otherwise, returns all mappings corresponding to the\ngiven line and either the column we are searching for or the next closest column\nthat has any offsets.\n\nThe only argument is an object with the following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source. The line number is\n 1-based.\n\n* `column`: Optional. The column number in the original source. The\n column number is 0-based.\n\nand an array of objects is returned, each with the following properties:\n\n* `line`: The line number in the generated source, or null. The line\n number is 1-based.\n\n* `column`: The column number in the generated source, or null. The\n column number is 0-based.\n\n```js\nconsumer.allGeneratedpositionsfor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n// column: 1 },\n// { line: 2,\n// column: 10 },\n// { line: 2,\n// column: 20 } ]\n```\n\n#### SourceMapConsumer.prototype.hasContentsOfAllSources()\n\nReturn true if we have the embedded source content for every source listed in\nthe source map, false otherwise.\n\nIn other words, if this method returns `true`, then\n`consumer.sourceContentFor(s)` will succeed for every source `s` in\n`consumer.sources`.\n\n```js\n// ...\nif (consumer.hasContentsOfAllSources()) {\n consumerReadyCallback(consumer);\n} else {\n fetchSources(consumer, consumerReadyCallback);\n}\n// ...\n```\n\n#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])\n\nReturns the original source content for the source provided. The only\nargument is the URL of the original source file.\n\nIf the source content for the given source is not found, then an error is\nthrown. Optionally, pass `true` as the second param to have `null` returned\ninstead.\n\n```js\nconsumer.sources\n// [ \"my-cool-lib.clj\" ]\n\nconsumer.sourceContentFor(\"my-cool-lib.clj\")\n// \"...\"\n\nconsumer.sourceContentFor(\"this is not in the source map\");\n// Error: \"this is not in the source map\" is not in the source map\n\nconsumer.sourceContentFor(\"this is not in the source map\", true);\n// null\n```\n\n#### SourceMapConsumer.prototype.eachMapping(callback, context, order)\n\nIterate over each mapping between an original source/line/column and a\ngenerated line/column in this source map.\n\n* `callback`: The function that is called with each mapping. Mappings have the\n form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,\n name }`\n\n* `context`: Optional. If specified, this object will be the value of `this`\n every time that `callback` is called.\n\n* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or\n `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over\n the mappings sorted by the generated file's line/column order or the\n original's source/line/column order, respectively. Defaults to\n `SourceMapConsumer.GENERATED_ORDER`.\n\n```js\nconsumer.eachMapping(function (m) { console.log(m); })\n// ...\n// { source: 'illmatic.js',\n// generatedLine: 1,\n// generatedColumn: 0,\n// originalLine: 1,\n// originalColumn: 0,\n// name: null }\n// { source: 'illmatic.js',\n// generatedLine: 2,\n// generatedColumn: 0,\n// originalLine: 2,\n// originalColumn: 0,\n// name: null }\n// ...\n```\n### SourceMapGenerator\n\nAn instance of the SourceMapGenerator represents a source map which is being\nbuilt incrementally.\n\n#### new SourceMapGenerator([startOfSourceMap])\n\nYou may pass an object with the following properties:\n\n* `file`: The filename of the generated source that this source map is\n associated with.\n\n* `sourceRoot`: A root for all relative URLs in this source map.\n\n* `skipValidation`: Optional. When `true`, disables validation of mappings as\n they are added. This can improve performance but should be used with\n discretion, as a last resort. Even then, one should avoid using this flag when\n running tests, if possible.\n\n```js\nvar generator = new sourceMap.SourceMapGenerator({\n file: \"my-generated-javascript-file.js\",\n sourceRoot: \"http://example.com/app/js/\"\n});\n```\n\n#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)\n\nCreates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.\n\n* `sourceMapConsumer` The SourceMap.\n\n```js\nvar generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);\n```\n\n#### SourceMapGenerator.prototype.addMapping(mapping)\n\nAdd a single mapping from original source line and column to the generated\nsource's line and column for this source map being created. The mapping object\nshould have the following properties:\n\n* `generated`: An object with the generated line and column positions.\n\n* `original`: An object with the original line and column positions.\n\n* `source`: The original source file (relative to the sourceRoot).\n\n* `name`: An optional original token name for this mapping.\n\n```js\ngenerator.addMapping({\n source: \"module-one.scm\",\n original: { line: 128, column: 0 },\n generated: { line: 3, column: 456 }\n})\n```\n\n#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for an original source file.\n\n* `sourceFile` the URL of the original source file.\n\n* `sourceContent` the content of the source file.\n\n```js\ngenerator.setSourceContent(\"module-one.scm\",\n fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])\n\nApplies a SourceMap for a source file to the SourceMap.\nEach mapping to the supplied source file is rewritten using the\nsupplied SourceMap. Note: The resolution for the resulting mappings\nis the minimum of this map and the supplied map.\n\n* `sourceMapConsumer`: The SourceMap to be applied.\n\n* `sourceFile`: Optional. The filename of the source file.\n If omitted, sourceMapConsumer.file will be used, if it exists.\n Otherwise an error will be thrown.\n\n* `sourceMapPath`: Optional. The dirname of the path to the SourceMap\n to be applied. If relative, it is relative to the SourceMap.\n\n This parameter is needed when the two SourceMaps aren't in the same\n directory, and the SourceMap to be applied contains relative source\n paths. If so, those relative source paths need to be rewritten\n relative to the SourceMap.\n\n If omitted, it is assumed that both SourceMaps are in the same directory,\n thus not needing any rewriting. (Supplying `'.'` has the same effect.)\n\n#### SourceMapGenerator.prototype.toString()\n\nRenders the source map being generated to a string.\n\n```js\ngenerator.toString()\n// '{\"version\":3,\"sources\":[\"module-one.scm\"],\"names\":[],\"mappings\":\"...snip...\",\"file\":\"my-generated-javascript-file.js\",\"sourceRoot\":\"http://example.com/app/js/\"}'\n```\n\n### SourceNode\n\nSourceNodes provide a way to abstract over interpolating and/or concatenating\nsnippets of generated JavaScript source code, while maintaining the line and\ncolumn information associated between those snippets and the original source\ncode. This is useful as the final intermediate representation a compiler might\nuse before outputting the generated JS and source map.\n\n#### new SourceNode([line, column, source[, chunk[, name]]])\n\n* `line`: The original line number associated with this source node, or null if\n it isn't associated with an original line. The line number is 1-based.\n\n* `column`: The original column number associated with this source node, or null\n if it isn't associated with an original column. The column number\n is 0-based.\n\n* `source`: The original source's filename; null if no filename is provided.\n\n* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see\n below.\n\n* `name`: Optional. The original identifier.\n\n```js\nvar node = new SourceNode(1, 2, \"a.cpp\", [\n new SourceNode(3, 4, \"b.cpp\", \"extern int status;\\n\"),\n new SourceNode(5, 6, \"c.cpp\", \"std::string* make_string(size_t n);\\n\"),\n new SourceNode(7, 8, \"d.cpp\", \"int main(int argc, char** argv) {}\\n\"),\n]);\n```\n\n#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])\n\nCreates a SourceNode from generated code and a SourceMapConsumer.\n\n* `code`: The generated code\n\n* `sourceMapConsumer` The SourceMap for the generated code\n\n* `relativePath` The optional path that relative sources in `sourceMapConsumer`\n should be relative to.\n\n```js\nconst consumer = await new SourceMapConsumer(fs.readFileSync(\"path/to/my-file.js.map\", \"utf8\"));\nconst node = SourceNode.fromStringWithSourceMap(fs.readFileSync(\"path/to/my-file.js\"), consumer);\n```\n\n#### SourceNode.prototype.add(chunk)\n\nAdd a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.add(\" + \");\nnode.add(otherNode);\nnode.add([leftHandOperandNode, \" + \", rightHandOperandNode]);\n```\n\n#### SourceNode.prototype.prepend(chunk)\n\nPrepend a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.prepend(\"/** Build Id: f783haef86324gf **/\\n\\n\");\n```\n\n#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for a source file. This will be added to the\n`SourceMap` in the `sourcesContent` field.\n\n* `sourceFile`: The filename of the source file\n\n* `sourceContent`: The content of the source file\n\n```js\nnode.setSourceContent(\"module-one.scm\",\n fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceNode.prototype.walk(fn)\n\nWalk over the tree of JS snippets in this node and its children. The walking\nfunction is called once for each snippet of JS and is passed that snippet and\nthe its original associated source's line/column location.\n\n* `fn`: The traversal function.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.walk(function (code, loc) { console.log(\"WALK:\", code, loc); })\n// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }\n// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }\n```\n\n#### SourceNode.prototype.walkSourceContents(fn)\n\nWalk over the tree of SourceNodes. The walking function is called for each\nsource file content and is passed the filename and source content.\n\n* `fn`: The traversal function.\n\n```js\nvar a = new SourceNode(1, 2, \"a.js\", \"generated from a\");\na.setSourceContent(\"a.js\", \"original a\");\nvar b = new SourceNode(1, 2, \"b.js\", \"generated from b\");\nb.setSourceContent(\"b.js\", \"original b\");\nvar c = new SourceNode(1, 2, \"c.js\", \"generated from c\");\nc.setSourceContent(\"c.js\", \"original c\");\n\nvar node = new SourceNode(null, null, null, [a, b, c]);\nnode.walkSourceContents(function (source, contents) { console.log(\"WALK:\", source, \":\", contents); })\n// WALK: a.js : original a\n// WALK: b.js : original b\n// WALK: c.js : original c\n```\n\n#### SourceNode.prototype.join(sep)\n\nLike `Array.prototype.join` except for SourceNodes. Inserts the separator\nbetween each of this source node's children.\n\n* `sep`: The separator.\n\n```js\nvar lhs = new SourceNode(1, 2, \"a.rs\", \"my_copy\");\nvar operand = new SourceNode(3, 4, \"a.rs\", \"=\");\nvar rhs = new SourceNode(5, 6, \"a.rs\", \"orig.clone()\");\n\nvar node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);\nvar joinedNode = node.join(\" \");\n```\n\n#### SourceNode.prototype.replaceRight(pattern, replacement)\n\nCall `String.prototype.replace` on the very right-most source snippet. Useful\nfor trimming white space from the end of a source node, etc.\n\n* `pattern`: The pattern to replace.\n\n* `replacement`: The thing to replace the pattern with.\n\n```js\n// Trim trailing white space.\nnode.replaceRight(/\\s*$/, \"\");\n```\n\n#### SourceNode.prototype.toString()\n\nReturn the string representation of this source node. Walks over the tree and\nconcatenates all the various snippets together to one string.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.toString()\n// 'unodostresquatro'\n```\n\n#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])\n\nReturns the string representation of this tree of source nodes, plus a\nSourceMapGenerator which contains all the mappings between the generated and\noriginal sources.\n\nThe arguments are the same as those to `new SourceMapGenerator`.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n new SourceNode(3, 4, \"b.js\", \"uno\"),\n \"dos\",\n [\n \"tres\",\n new SourceNode(5, 6, \"c.js\", \"quatro\")\n ]\n]);\n\nnode.toStringWithSourceMap({ file: \"my-output-file.js\" })\n// { code: 'unodostresquatro',\n// map: [object SourceMapGenerator] }\n```\n","readmeFilename":"README.md","homepage":"https://github.com/mozilla/source-map","bugs":{"url":"https://github.com/mozilla/source-map/issues"},"license":"BSD-3-Clause"}
+{
+ "name": "source-map",
+ "description": "Generates and consumes source maps",
+ "dist-tags": {
+ "latest": "0.6.1"
+ },
+ "versions": {
+ "0.6.1": {
+ "name": "source-map",
+ "description": "Generates and consumes source maps",
+ "version": "0.6.1",
+ "author": {
+ "name": "Nick Fitzgerald",
+ "email": "nfitzgerald@mozilla.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mozilla/source-map.git"
+ },
+ "main": "./source-map.js",
+ "files": [
+ "source-map.js",
+ "source-map.d.ts",
+ "lib/",
+ "dist/source-map.debug.js",
+ "dist/source-map.js",
+ "dist/source-map.min.js",
+ "dist/source-map.min.js.map"
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "license": "BSD-3-Clause",
+ "scripts": {
+ "test": "npm run build && node test/run-tests.js",
+ "build": "webpack --color",
+ "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
+ },
+ "devDependencies": {
+ "doctoc": "^0.15.0",
+ "webpack": "^1.12.0"
+ },
+ "typings": "source-map",
+ "gitHead": "ac518d2f21818146f3310557bd51c13d8cff2ba8",
+ "bugs": {
+ "url": "https://github.com/mozilla/source-map/issues"
+ },
+ "_id": "source-map@0.6.1",
+ "_npmVersion": "5.3.0",
+ "_nodeVersion": "8.4.0",
+ "dist": {
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "shasum": "74722af32e9614e9c287a8d0bbde48b5e2f1a263",
+ "tarball": "http://localhost:4260/source-map/source-map-0.6.1.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Nick Fitzgerald",
+ "email": "nfitzgerald@mozilla.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mozilla/source-map.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/mozilla/source-map",
+ "bugs": {
+ "url": "https://github.com/mozilla/source-map/issues"
+ },
+ "license": "BSD-3-Clause"
+}
diff --git a/tests/registry/npm/sourcemap-codec/registry.json b/tests/registry/npm/sourcemap-codec/registry.json
index 86c5d4e0a..755480e3d 100644
--- a/tests/registry/npm/sourcemap-codec/registry.json
+++ b/tests/registry/npm/sourcemap-codec/registry.json
@@ -1 +1,79 @@
-{"name":"sourcemap-codec","description":"Encode/decode sourcemap mappings","dist-tags":{"latest":"1.4.8"},"versions":{"1.4.8":{"name":"sourcemap-codec","version":"1.4.8","description":"Encode/decode sourcemap mappings","main":"dist/sourcemap-codec.umd.js","module":"dist/sourcemap-codec.es.js","types":"dist/types/sourcemap-codec.d.ts","scripts":{"test":"mocha","build":"rm -rf dist && rollup -c && tsc","pretest":"npm run build","prepublish":"npm test","lint":"eslint src","pretest-coverage":"npm run build","test-coverage":"rm -rf coverage/* && istanbul cover --report json node_modules/.bin/_mocha -- -u exports -R spec test/test.js","posttest-coverage":"remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped.json -b dist && remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped.lcov -t lcovonly -b dist && remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped -t html -b dist","ci":"npm run test-coverage && codecov < coverage/coverage-remapped.lcov"},"repository":{"type":"git","url":"git+https://github.com/Rich-Harris/sourcemap-codec.git"},"author":{"name":"Rich Harris"},"license":"MIT","bugs":{"url":"https://github.com/Rich-Harris/sourcemap-codec/issues"},"dependencies":{},"devDependencies":{"codecov.io":"^0.1.6","console-group":"^0.3.3","eslint":"^6.0.1","eslint-plugin-import":"^2.18.0","istanbul":"^0.4.5","mocha":"^6.1.4","remap-istanbul":"^0.13.0","rollup":"^1.16.4","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-typescript":"^1.0.1","typescript":"^3.5.2"},"gitHead":"b549c1ee22f79bdf777d7bfe6471fe4293cd6391","_id":"sourcemap-codec@1.4.8","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==","shasum":"ea804bd94857402e6992d05a38ef1ae35a9ab4c4","tarball":"http://localhost:4260/sourcemap-codec/sourcemap-codec-1.4.8.tgz","fileCount":9,"unpackedSize":31802,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeILE7CRA9TVsSAnZWagAAO5IP/ir1Y0zaBX8RUmDU3tmc\nyBctHIgYMg5sg3Le9OtPgvpgYvKvAaKzQ8KfR0iEBWz+8AvJyPDRHpvRUk3r\nYufljidkG5mu4C6Hvv1nJDu76TspGkq34x7K0kZxf/iamsY1lKA2qu6h9bnw\n0JoQDvT0m4iXh0dOfrdJGMqcWlH6nkqOuZ4QJkaile3j04H2eGet2f4VyqV5\nJbp400SBW62ZUMe4t6z0CzdJ3K+rMMji2rayQEmUXIpSrizs0u6ct+CeFlc5\njbw7f4VdowOcguHuYG1uxbaNOeyGz6J70Cq8BsIrAVIx92T+RFiNsenr1NU9\nicQ/C9DpM83rpHaWw2zdjoqVrjBbrLEcriS/kdvr4fweIfmoCKGcwZYPV7J/\nexuaWHI9dbcyOXh8ty4NL0ZU9djXplnT6PJzKS7gO00rk66MJ+rhMFNS+01k\nv0K5IRrEhePqJjde/2veWoDkIS4U9gYavgjiTbX3W9ZGkrajrUSijGpg09RR\ne/Ol3lvurNRAF+J79ZtPXZ4iXp87JBvnGRTICfXZH8Np7vBh2DzBlnoq3e74\nzKyc7kpVY7V52RfyYrKK1oT52UMHjp6ojbKOTxAmDaES4gw3Md6Y4pjud8Hj\ntPYqTZIz31NnMruItfc1K6VHZaP8vhZeZ7QGQJTuYUMw7Y6FQXazQy84yhUE\n87zp\r\n=HgDw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsOkd0bndP6/9iZ5q+pwDgckx3BKgb3p+0fgjFiO2JrgIgeYv1UAPWqIC5ZynHugZffLb/i3gM35qaFRiw6RpSjnE="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# sourcemap-codec\n\nEncode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit).\n\n\n## Why?\n\nSourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap.\n\nThis package makes the process slightly easier.\n\n\n## Installation\n\n```bash\nnpm install sourcemap-codec\n```\n\n\n## Usage\n\n```js\nimport { encode, decode } from 'sourcemap-codec';\n\nvar decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );\n\nassert.deepEqual( decoded, [\n\t// the first line (of the generated code) has no mappings,\n\t// as shown by the starting semi-colon (which separates lines)\n\t[],\n\n\t// the second line contains four (comma-separated) segments\n\t[\n\t\t// segments are encoded as you'd expect:\n\t\t// [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ]\n\n\t\t// i.e. the first segment begins at column 2, and maps back to the second column\n\t\t// of the second line (both zero-based) of the 0th source, and uses the 0th\n\t\t// name in the `map.names` array\n\t\t[ 2, 0, 2, 2, 0 ],\n\n\t\t// the remaining segments are 4-length rather than 5-length,\n\t\t// because they don't map a name\n\t\t[ 4, 0, 2, 4 ],\n\t\t[ 6, 0, 2, 5 ],\n\t\t[ 7, 0, 2, 7 ]\n\t],\n\n\t// the final line contains two segments\n\t[\n\t\t[ 2, 1, 10, 19 ],\n\t\t[ 12, 1, 11, 20 ]\n\t]\n]);\n\nvar encoded = encode( decoded );\nassert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );\n```\n\n\n# License\n\nMIT\n","homepage":"https://github.com/Rich-Harris/sourcemap-codec","repository":{"type":"git","url":"git+https://github.com/Rich-Harris/sourcemap-codec.git"},"author":{"name":"Rich Harris"},"bugs":{"url":"https://github.com/Rich-Harris/sourcemap-codec/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "sourcemap-codec",
+ "description": "Encode/decode sourcemap mappings",
+ "dist-tags": {
+ "latest": "1.4.8"
+ },
+ "versions": {
+ "1.4.8": {
+ "name": "sourcemap-codec",
+ "version": "1.4.8",
+ "description": "Encode/decode sourcemap mappings",
+ "main": "dist/sourcemap-codec.umd.js",
+ "module": "dist/sourcemap-codec.es.js",
+ "types": "dist/types/sourcemap-codec.d.ts",
+ "scripts": {
+ "test": "mocha",
+ "build": "rm -rf dist && rollup -c && tsc",
+ "pretest": "npm run build",
+ "prepublish": "npm test",
+ "lint": "eslint src",
+ "pretest-coverage": "npm run build",
+ "test-coverage": "rm -rf coverage/* && istanbul cover --report json node_modules/.bin/_mocha -- -u exports -R spec test/test.js",
+ "posttest-coverage": "remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped.json -b dist && remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped.lcov -t lcovonly -b dist && remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped -t html -b dist",
+ "ci": "npm run test-coverage && codecov < coverage/coverage-remapped.lcov"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Rich-Harris/sourcemap-codec.git"
+ },
+ "author": {
+ "name": "Rich Harris"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Rich-Harris/sourcemap-codec/issues"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "codecov.io": "^0.1.6",
+ "console-group": "^0.3.3",
+ "eslint": "^6.0.1",
+ "eslint-plugin-import": "^2.18.0",
+ "istanbul": "^0.4.5",
+ "mocha": "^6.1.4",
+ "remap-istanbul": "^0.13.0",
+ "rollup": "^1.16.4",
+ "rollup-plugin-node-resolve": "^5.2.0",
+ "rollup-plugin-typescript": "^1.0.1",
+ "typescript": "^3.5.2"
+ },
+ "gitHead": "b549c1ee22f79bdf777d7bfe6471fe4293cd6391",
+ "_id": "sourcemap-codec@1.4.8",
+ "_nodeVersion": "12.13.0",
+ "_npmVersion": "6.12.0",
+ "dist": {
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "shasum": "ea804bd94857402e6992d05a38ef1ae35a9ab4c4",
+ "tarball": "http://localhost:4260/sourcemap-codec/sourcemap-codec-1.4.8.tgz",
+ "fileCount": 9,
+ "unpackedSize": 31802
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/Rich-Harris/sourcemap-codec",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Rich-Harris/sourcemap-codec.git"
+ },
+ "author": {
+ "name": "Rich Harris"
+ },
+ "bugs": {
+ "url": "https://github.com/Rich-Harris/sourcemap-codec/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/sprintf-js/registry.json b/tests/registry/npm/sprintf-js/registry.json
index ce0ac0444..a83bba438 100644
--- a/tests/registry/npm/sprintf-js/registry.json
+++ b/tests/registry/npm/sprintf-js/registry.json
@@ -1 +1,76 @@
-{"name":"sprintf-js","description":"JavaScript sprintf implementation","dist-tags":{"latest":"1.1.3"},"versions":{"1.1.3":{"name":"sprintf-js","version":"1.1.3","description":"JavaScript sprintf implementation","author":{"name":"Alexandru Mărășteanu","email":"hello@alexei.ro"},"main":"src/sprintf.js","scripts":{"test":"mocha test/*.js","pretest":"npm run lint","lint":"eslint .","lint:fix":"eslint --fix ."},"repository":{"type":"git","url":"git+https://github.com/alexei/sprintf.js.git"},"license":"BSD-3-Clause","devDependencies":{"benchmark":"^2.1.4","eslint":"^5.10.0","gulp":"^3.9.1","gulp-benchmark":"^1.1.1","gulp-eslint":"^5.0.0","gulp-header":"^2.0.5","gulp-mocha":"^6.0.0","gulp-rename":"^1.4.0","gulp-sourcemaps":"^2.6.4","gulp-uglify":"^3.0.1","mocha":"^5.2.0"},"overrides":{"graceful-fs":"^4.2.11"},"gitHead":"3a0d8c26d291b5bd9f1974877ecc50739921d6f5","bugs":{"url":"https://github.com/alexei/sprintf.js/issues"},"_id":"sprintf-js@1.1.3","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==","shasum":"4914b903a2f8b685d17fdf78a70e917e872e444a","tarball":"http://localhost:4260/sprintf-js/sprintf-js-1.1.3.tgz","fileCount":11,"unpackedSize":39879,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFqEdBzxc5TO4qHn2Vaj+rUbeXXAIrldXZrm+Oh3ctpGAiA9wmSjDRjIGR5h/m5RnndPawduJOh1VPtIhc1D08pEew=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# sprintf-js\n\n[![Build Status][travisci-image]][travisci-url] [![NPM Version][npm-image]][npm-url] [![Dependency Status][dependencies-image]][dependencies-url] [![devDependency Status][dev-dependencies-image]][dev-dependencies-url]\n\n[travisci-image]: https://travis-ci.org/alexei/sprintf.js.svg?branch=master\n[travisci-url]: https://travis-ci.org/alexei/sprintf.js\n\n[npm-image]: https://badge.fury.io/js/sprintf-js.svg\n[npm-url]: https://badge.fury.io/js/sprintf-js\n\n[dependencies-image]: https://david-dm.org/alexei/sprintf.js.svg\n[dependencies-url]: https://david-dm.org/alexei/sprintf.js\n\n[dev-dependencies-image]: https://david-dm.org/alexei/sprintf.js/dev-status.svg\n[dev-dependencies-url]: https://david-dm.org/alexei/sprintf.js#info=devDependencies\n\n**sprintf-js** is a complete open source JavaScript `sprintf` implementation for the **browser** and **Node.js**.\n\n**Note: as of v1.1.1 you might need some polyfills for older environments. See [Support](#support) section below.**\n\n## Usage\n\n var sprintf = require('sprintf-js').sprintf,\n vsprintf = require('sprintf-js').vsprintf\n\n sprintf('%2$s %3$s a %1$s', 'cracker', 'Polly', 'wants')\n vsprintf('The first 4 letters of the english alphabet are: %s, %s, %s and %s', ['a', 'b', 'c', 'd'])\n\n## Installation\n\n### NPM\n\n npm install sprintf-js\n\n### Bower\n\n bower install sprintf\n\n## API\n\n### `sprintf`\n\nReturns a formatted string:\n\n string sprintf(string format, mixed arg1?, mixed arg2?, ...)\n\n### `vsprintf`\n\nSame as `sprintf` except it takes an array of arguments, rather than a variable number of arguments:\n\n string vsprintf(string format, array arguments?)\n\n## Format specification\n\nThe placeholders in the format string are marked by `%` and are followed by one or more of these elements, in this order:\n\n* An optional number followed by a `$` sign that selects which argument index to use for the value. If not specified, arguments will be placed in the same order as the placeholders in the input string.\n* An optional `+` sign that forces to precede the result with a plus or minus sign on numeric values. By default, only the `-` sign is used on negative numbers.\n* An optional padding specifier that says what character to use for padding (if specified). Possible values are `0` or any other character preceded by a `'` (single quote). The default is to pad with *spaces*.\n* An optional `-` sign, that causes `sprintf` to left-align the result of this placeholder. The default is to right-align the result.\n* An optional number, that says how many characters the result should have. If the value to be returned is shorter than this number, the result will be padded. When used with the `j` (JSON) type specifier, the padding length specifies the tab size used for indentation.\n* An optional precision modifier, consisting of a `.` (dot) followed by a number, that says how many digits should be displayed for floating point numbers. When used with the `g` type specifier, it specifies the number of significant digits. When used on a string, it causes the result to be truncated.\n* A type specifier that can be any of:\n * `%` — yields a literal `%` character\n * `b` — yields an integer as a binary number\n * `c` — yields an integer as the character with that ASCII value\n * `d` or `i` — yields an integer as a signed decimal number\n * `e` — yields a float using scientific notation\n * `u` — yields an integer as an unsigned decimal number\n * `f` — yields a float as is; see notes on precision above\n * `g` — yields a float as is; see notes on precision above\n * `o` — yields an integer as an octal number\n * `s` — yields a string as is\n * `t` — yields `true` or `false`\n * `T` — yields the type of the argument<sup><a href=\"#fn-1\" name=\"fn-ref-1\">1</a></sup>\n * `v` — yields the primitive value of the specified argument\n * `x` — yields an integer as a hexadecimal number (lower-case)\n * `X` — yields an integer as a hexadecimal number (upper-case)\n * `j` — yields a JavaScript object or array as a JSON encoded string\n\n## Features\n\n### Argument swapping\n\nYou can also swap the arguments. That is, the order of the placeholders doesn't have to match the order of the arguments. You can do that by simply indicating in the format string which arguments the placeholders refer to:\n\n sprintf('%2$s %3$s a %1$s', 'cracker', 'Polly', 'wants')\n\nAnd, of course, you can repeat the placeholders without having to increase the number of arguments.\n\n### Named arguments\n\nFormat strings may contain replacement fields rather than positional placeholders. Instead of referring to a certain argument, you can now refer to a certain key within an object. Replacement fields are surrounded by rounded parentheses - `(` and `)` - and begin with a keyword that refers to a key:\n\n var user = {\n name: 'Dolly',\n }\n sprintf('Hello %(name)s', user) // Hello Dolly\n\nKeywords in replacement fields can be optionally followed by any number of keywords or indexes:\n\n var users = [\n {name: 'Dolly'},\n {name: 'Molly'},\n {name: 'Polly'},\n ]\n sprintf('Hello %(users[0].name)s, %(users[1].name)s and %(users[2].name)s', {users: users}) // Hello Dolly, Molly and Polly\n\nNote: mixing positional and named placeholders is not (yet) supported\n\n### Computed values\n\nYou can pass in a function as a dynamic value and it will be invoked (with no arguments) in order to compute the value on the fly.\n\n sprintf('Current date and time: %s', function() { return new Date().toString() })\n\n### AngularJS\n\nYou can use `sprintf` and `vsprintf` (also aliased as `fmt` and `vfmt` respectively) in your AngularJS projects. See `demo/`.\n\n## Support\n\n### Node.js\n\n`sprintf-js` runs in all active Node versions (4.x+).\n\n### Browser\n\n`sprintf-js` should work in all modern browsers. As of v1.1.1, you might need polyfills for the following:\n\n - `String.prototype.repeat()` (any IE)\n - `Array.isArray()` (IE < 9)\n - `Object.create()` (IE < 9)\n\nYMMV\n\n## License\n\n**sprintf-js** is licensed under the terms of the BSD 3-Clause License.\n\n## Notes\n\n<small><sup><a href=\"#fn-ref-1\" name=\"fn-1\">1</a></sup> `sprintf` doesn't use the `typeof` operator. As such, the value `null` is a `null`, an array is an `array` (not an `object`), a date value is a `date` etc.</small>\n","author":{"name":"Alexandru Mărășteanu","email":"hello@alexei.ro"},"repository":{"type":"git","url":"git+https://github.com/alexei/sprintf.js.git"},"homepage":"https://github.com/alexei/sprintf.js#readme","bugs":{"url":"https://github.com/alexei/sprintf.js/issues"},"license":"BSD-3-Clause","readmeFilename":"README.md"}
+{
+ "name": "sprintf-js",
+ "description": "JavaScript sprintf implementation",
+ "dist-tags": {
+ "latest": "1.1.3"
+ },
+ "versions": {
+ "1.1.3": {
+ "name": "sprintf-js",
+ "version": "1.1.3",
+ "description": "JavaScript sprintf implementation",
+ "author": {
+ "name": "Alexandru Mărășteanu",
+ "email": "hello@alexei.ro"
+ },
+ "main": "src/sprintf.js",
+ "scripts": {
+ "test": "mocha test/*.js",
+ "pretest": "npm run lint",
+ "lint": "eslint .",
+ "lint:fix": "eslint --fix ."
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/alexei/sprintf.js.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "benchmark": "^2.1.4",
+ "eslint": "^5.10.0",
+ "gulp": "^3.9.1",
+ "gulp-benchmark": "^1.1.1",
+ "gulp-eslint": "^5.0.0",
+ "gulp-header": "^2.0.5",
+ "gulp-mocha": "^6.0.0",
+ "gulp-rename": "^1.4.0",
+ "gulp-sourcemaps": "^2.6.4",
+ "gulp-uglify": "^3.0.1",
+ "mocha": "^5.2.0"
+ },
+ "overrides": {
+ "graceful-fs": "^4.2.11"
+ },
+ "gitHead": "3a0d8c26d291b5bd9f1974877ecc50739921d6f5",
+ "bugs": {
+ "url": "https://github.com/alexei/sprintf.js/issues"
+ },
+ "_id": "sprintf-js@1.1.3",
+ "_nodeVersion": "18.16.0",
+ "_npmVersion": "9.5.1",
+ "dist": {
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "shasum": "4914b903a2f8b685d17fdf78a70e917e872e444a",
+ "tarball": "http://localhost:4260/sprintf-js/sprintf-js-1.1.3.tgz",
+ "fileCount": 11,
+ "unpackedSize": 39879
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Alexandru Mărășteanu",
+ "email": "hello@alexei.ro"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/alexei/sprintf.js.git"
+ },
+ "homepage": "https://github.com/alexei/sprintf.js#readme",
+ "bugs": {
+ "url": "https://github.com/alexei/sprintf.js/issues"
+ },
+ "license": "BSD-3-Clause",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/ssh2/registry.json b/tests/registry/npm/ssh2/registry.json
index 0dfbfce0c..554b67d19 100644
--- a/tests/registry/npm/ssh2/registry.json
+++ b/tests/registry/npm/ssh2/registry.json
@@ -1 +1,84 @@
-{"name":"ssh2","description":"SSH2 client and server modules written in pure JavaScript for node.js","dist-tags":{"latest":"1.11.0"},"versions":{"1.11.0":{"name":"ssh2","version":"1.11.0","author":{"name":"Brian White","email":"mscdex@mscdex.net"},"description":"SSH2 client and server modules written in pure JavaScript for node.js","main":"./lib/index.js","engines":{"node":">=10.16.0"},"dependencies":{"asn1":"^0.2.4","bcrypt-pbkdf":"^1.0.2","cpu-features":"~0.0.4","nan":"^2.16.0"},"devDependencies":{"@mscdex/eslint-config":"^1.1.0","eslint":"^7.0.0"},"optionalDependencies":{"cpu-features":"~0.0.4","nan":"^2.16.0"},"scripts":{"install":"node install.js","rebuild":"node install.js","test":"node test/test.js","lint":"eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js examples lib test","lint:fix":"npm run lint -- --fix"},"licenses":[{"type":"MIT","url":"http://github.com/mscdex/ssh2/raw/master/LICENSE"}],"repository":{"type":"git","url":"git+ssh://git@github.com/mscdex/ssh2.git"},"_resolved":"","_integrity":"","_from":"https://github.com/mscdex/ssh2/tarball/v1.11.0","bugs":{"url":"https://github.com/mscdex/ssh2/issues"},"_id":"ssh2@1.11.0","_nodeVersion":"10.22.1","_npmVersion":"6.14.6","dist":{"integrity":"sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==","shasum":"ce60186216971e12f6deb553dcf82322498fe2e4","tarball":"http://localhost:4260/ssh2/ssh2-1.11.0.tgz","fileCount":159,"unpackedSize":1071730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF4xMF2El19Bs0L2ZuH8xFLnAnpo2sbd9UThHPmOGIsoAiBN6qaStAf9FIoBkpdFpzBo54xSpo+S2CBeJfKaqMrskw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJipNBaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnkBAAmYu3GLZaDnQpRUn0om5QTbNgTCulnodk7WXymxcglvMxDh9w\r\nyCV0hizUEOcoQ3ODm8rUihm+R1PyNQy2ud0nrSdZW7fjAiyaKDaRbicSD18r\r\nC5QDNRVIApAEYHT8Nh9WlPcWr/TcQITjqtp7CYI5DEw+Co7vVV8Q4f3DAL6X\r\niEtiQ0+QoxeeLu+kMKn08LLsYAKyeeRNj/AzV+VkiPn5eNOO9HUtDKaYtbH8\r\nFuUDUg2Y+eQnwZfNa62pYPfnJpTjeoQY38YQ7QzjG2w9S+GgCdWM6OUnyLzt\r\nuzt3sycY48739pMn7/J3TRyLhnMrxEB6QNlaL5FNPgFAaRiJWr7r9ePYCQ+E\r\n5QVm5EJX0YVpo1bZUFFWz/DXHYOsYXDFh8mrUHw7C2JPxrxPozS/vAPb4aaK\r\n9j+ST1QNZOBuG6L18PXqqJhx3MZzEI159IwYwx7VhyMz81TkkO8/96sRrRdt\r\nPACHnh+bRgS0mjCYYnedcZtXTj/TMFupa/tyTTp5FK2WSDLPkS7YyrUaiZM5\r\nWw7e4jAqf3G/tZXWHHCpl6om1Kt5NwhUz36eEhLYOG9wGf9PYcLBCA8LtYMM\r\nt618PT3k2tiuVT4dW5ceX8TcJ18IrrWenJ3dlatjHFuDObTMDJ2ueUjfv+rr\r\n3JhFmVNvBvENZ20k5tDIF/JluxsXAXesnc0=\r\n=U5q5\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# Description\n\nSSH2 client and server modules written in pure JavaScript for [node.js](http://nodejs.org/).\n\nDevelopment/testing is done against OpenSSH (8.7 currently).\n\nChanges (breaking or otherwise) in v1.0.0 can be found [here](https://github.com/mscdex/ssh2/issues/935).\n\n# Table of Contents\n\n* [Requirements](#requirements)\n* [Installation](#installation)\n* [Client Examples](#client-examples)\n * [Execute 'uptime' on a server](#execute-uptime-on-a-server)\n * [Start an interactive shell session](#start-an-interactive-shell-session)\n * [Send a raw HTTP request to port 80 on the server](#send-a-raw-http-request-to-port-80-on-the-server)\n * [Forward local connections to port 8000 on the server to us](#forward-local-connections-to-port-8000-on-the-server-to-us)\n * [Get a directory listing via SFTP](#get-a-directory-listing-via-sftp)\n * [Connection hopping](#connection-hopping)\n * [Forward remote X11 connections](#forward-remote-x11-connections)\n * [Dynamic (1:1) port forwarding using a SOCKSv5 proxy (using `socksv5`)](#dynamic-11-port-forwarding-using-a-socksv5-proxy-using-socksv5)\n * [Make HTTP(S) connections easily using a custom http(s).Agent](#make-https-connections-easily-using-a-custom-httpsagent)\n * [Invoke an arbitrary subsystem (e.g. netconf)](#invoke-an-arbitrary-subsystem)\n* [Server Examples](#server-examples)\n * [Password and public key authentication and non-interactive (exec) command execution](#password-and-public-key-authentication-and-non-interactive-exec-command-execution)\n * [SFTP-only server](#sftp-only-server)\n* [API](#api)\n * [Client](#client)\n * [Client events](#client-events)\n * [Client methods](#client-methods)\n * [Server](#server)\n * [Server events](#server-events)\n * [Server methods](#server-methods)\n * [Connection events](#connection-events)\n * [Connection methods](#connection-methods)\n * [Session events](#session-events)\n * [Channel](#channel)\n * [Pseudo-TTY settings](#pseudo-tty-settings)\n * [Terminal modes](#terminal-modes)\n * [HTTPAgent](#httpagent)\n * [HTTPAgent methods](#httpagent-methods)\n * [HTTPSAgent](#httpsagent)\n * [HTTPSAgent methods](#httpsagent-methods)\n * [Utilities](#utilities)\n\n## Requirements\n\n* [node.js](http://nodejs.org/) -- v10.16.0 or newer\n * node v12.0.0 or newer for Ed25519 key support\n* (Optional) [`cpu-features`](https://github.com/mscdex/cpu-features) is set as an optional package dependency (you do not need to install it explicitly/separately from `ssh2`) that will be automatically built and used if possible. See the project's documentation for its own requirements.\n * This addon is currently used to help generate an optimal default cipher list\n\n## Installation\n\n npm install ssh2\n\n## Client Examples\n\n### Execute 'uptime' on a server\n\n```js\nconst { readFileSync } = require('fs');\n\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.exec('uptime', (err, stream) => {\n if (err) throw err;\n stream.on('close', (code, signal) => {\n console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);\n conn.end();\n }).on('data', (data) => {\n console.log('STDOUT: ' + data);\n }).stderr.on('data', (data) => {\n console.log('STDERR: ' + data);\n });\n });\n}).connect({\n host: '192.168.100.100',\n port: 22,\n username: 'frylock',\n privateKey: readFileSync('/path/to/my/key')\n});\n\n// example output:\n// Client :: ready\n// STDOUT: 17:41:15 up 22 days, 18:09, 1 user, load average: 0.00, 0.01, 0.05\n//\n// Stream :: exit :: code: 0, signal: undefined\n// Stream :: close\n```\n\n### Start an interactive shell session\n\n```js\nconst { readFileSync } = require('fs');\n\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.shell((err, stream) => {\n if (err) throw err;\n stream.on('close', () => {\n console.log('Stream :: close');\n conn.end();\n }).on('data', (data) => {\n console.log('OUTPUT: ' + data);\n });\n stream.end('ls -l\\nexit\\n');\n });\n}).connect({\n host: '192.168.100.100',\n port: 22,\n username: 'frylock',\n privateKey: readFileSync('/path/to/my/key')\n});\n\n// example output:\n// Client :: ready\n// STDOUT: Last login: Sun Jun 15 09:37:21 2014 from 192.168.100.100\n//\n// STDOUT: ls -l\n// exit\n//\n// STDOUT: frylock@athf:~$ ls -l\n//\n// STDOUT: total 8\n//\n// STDOUT: drwxr-xr-x 2 frylock frylock 4096 Nov 18 2012 mydir\n//\n// STDOUT: -rw-r--r-- 1 frylock frylock 25 Apr 11 2013 test.txt\n//\n// STDOUT: frylock@athf:~$ exit\n//\n// STDOUT: logout\n//\n// Stream :: close\n```\n\n### Send a raw HTTP request to port 80 on the server\n\n```js\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.forwardOut('192.168.100.102', 8000, '127.0.0.1', 80, (err, stream) => {\n if (err) throw err;\n stream.on('close', () => {\n console.log('TCP :: CLOSED');\n conn.end();\n }).on('data', (data) => {\n console.log('TCP :: DATA: ' + data);\n }).end([\n 'HEAD / HTTP/1.1',\n 'User-Agent: curl/7.27.0',\n 'Host: 127.0.0.1',\n 'Accept: */*',\n 'Connection: close',\n '',\n ''\n ].join('\\r\\n'));\n });\n}).connect({\n host: '192.168.100.100',\n port: 22,\n username: 'frylock',\n password: 'nodejsrules'\n});\n\n// example output:\n// Client :: ready\n// TCP :: DATA: HTTP/1.1 200 OK\n// Date: Thu, 15 Nov 2012 13:52:58 GMT\n// Server: Apache/2.2.22 (Ubuntu)\n// X-Powered-By: PHP/5.4.6-1ubuntu1\n// Last-Modified: Thu, 01 Jan 1970 00:00:00 GMT\n// Content-Encoding: gzip\n// Vary: Accept-Encoding\n// Connection: close\n// Content-Type: text/html; charset=UTF-8\n//\n//\n// TCP :: CLOSED\n```\n\n### Forward local connections to port 8000 on the server to us\n\n```js\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.forwardIn('127.0.0.1', 8000, (err) => {\n if (err) throw err;\n console.log('Listening for connections on server on port 8000!');\n });\n}).on('tcp connection', (info, accept, reject) => {\n console.log('TCP :: INCOMING CONNECTION:');\n console.dir(info);\n accept().on('close', () => {\n console.log('TCP :: CLOSED');\n }).on('data', (data) => {\n console.log('TCP :: DATA: ' + data);\n }).end([\n 'HTTP/1.1 404 Not Found',\n 'Date: Thu, 15 Nov 2012 02:07:58 GMT',\n 'Server: ForwardedConnection',\n 'Content-Length: 0',\n 'Connection: close',\n '',\n ''\n ].join('\\r\\n'));\n}).connect({\n host: '192.168.100.100',\n port: 22,\n username: 'frylock',\n password: 'nodejsrules'\n});\n\n// example output:\n// Client :: ready\n// Listening for connections on server on port 8000!\n// (.... then from another terminal on the server: `curl -I http://127.0.0.1:8000`)\n// TCP :: INCOMING CONNECTION: { destIP: '127.0.0.1',\n// destPort: 8000,\n// srcIP: '127.0.0.1',\n// srcPort: 41969 }\n// TCP DATA: HEAD / HTTP/1.1\n// User-Agent: curl/7.27.0\n// Host: 127.0.0.1:8000\n// Accept: */*\n//\n//\n// TCP :: CLOSED\n```\n\n### Get a directory listing via SFTP\n\n```js\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.sftp((err, sftp) => {\n if (err) throw err;\n sftp.readdir('foo', (err, list) => {\n if (err) throw err;\n console.dir(list);\n conn.end();\n });\n });\n}).connect({\n host: '192.168.100.100',\n port: 22,\n username: 'frylock',\n password: 'nodejsrules'\n});\n\n// example output:\n// Client :: ready\n// [ { filename: 'test.txt',\n// longname: '-rw-r--r-- 1 frylock frylock 12 Nov 18 11:05 test.txt',\n// attrs:\n// { size: 12,\n// uid: 1000,\n// gid: 1000,\n// mode: 33188,\n// atime: 1353254750,\n// mtime: 1353254744 } },\n// { filename: 'mydir',\n// longname: 'drwxr-xr-x 2 frylock frylock 4096 Nov 18 15:03 mydir',\n// attrs:\n// { size: 1048576,\n// uid: 1000,\n// gid: 1000,\n// mode: 16877,\n// atime: 1353269007,\n// mtime: 1353269007 } } ]\n```\n\n### Connection hopping\n\n```js\nconst { Client } = require('ssh2');\n\nconst conn1 = new Client();\nconst conn2 = new Client();\n\n// Checks uptime on 10.1.1.40 via 192.168.1.1\n\nconn1.on('ready', () => {\n console.log('FIRST :: connection ready');\n // Alternatively, you could use something like netcat or socat with exec()\n // instead of forwardOut(), depending on what the server allows\n conn1.forwardOut('127.0.0.1', 12345, '10.1.1.40', 22, (err, stream) => {\n if (err) {\n console.log('FIRST :: forwardOut error: ' + err);\n return conn1.end();\n }\n conn2.connect({\n sock: stream,\n username: 'user2',\n password: 'password2',\n });\n });\n}).connect({\n host: '192.168.1.1',\n username: 'user1',\n password: 'password1',\n});\n\nconn2.on('ready', () => {\n // This connection is the one to 10.1.1.40\n\n console.log('SECOND :: connection ready');\n conn2.exec('uptime', (err, stream) => {\n if (err) {\n console.log('SECOND :: exec error: ' + err);\n return conn1.end();\n }\n stream.on('close', () => {\n conn1.end(); // close parent (and this) connection\n }).on('data', (data) => {\n console.log(data.toString());\n });\n });\n});\n```\n\n### Forward remote X11 connections\n\n```js\nconst { Socket } = require('net');\n\nconst { Client } = require('ssh2');\n\nconst conn = new Client();\n\nconn.on('x11', (info, accept, reject) => {\n const xserversock = new net.Socket();\n xserversock.on('connect', () => {\n const xclientsock = accept();\n xclientsock.pipe(xserversock).pipe(xclientsock);\n });\n // connects to localhost:0.0\n xserversock.connect(6000, 'localhost');\n});\n\nconn.on('ready', () => {\n conn.exec('xeyes', { x11: true }, (err, stream) => {\n if (err) throw err;\n let code = 0;\n stream.on('close', () => {\n if (code !== 0)\n console.log('Do you have X11 forwarding enabled on your SSH server?');\n conn.end();\n }).on('exit', (exitcode) => {\n code = exitcode;\n });\n });\n}).connect({\n host: '192.168.1.1',\n username: 'foo',\n password: 'bar'\n});\n```\n\n### Dynamic (1:1) port forwarding using a SOCKSv5 proxy (using [socksv5](https://github.com/mscdex/socksv5))\n\n```js\nconst socks = require('socksv5');\nconst { Client } = require('ssh2');\n\nconst sshConfig = {\n host: '192.168.100.1',\n port: 22,\n username: 'nodejs',\n password: 'rules'\n};\n\nsocks.createServer((info, accept, deny) => {\n // NOTE: you could just use one ssh2 client connection for all forwards, but\n // you could run into server-imposed limits if you have too many forwards open\n // at any given time\n const conn = new Client();\n conn.on('ready', () => {\n conn.forwardOut(info.srcAddr,\n info.srcPort,\n info.dstAddr,\n info.dstPort,\n (err, stream) => {\n if (err) {\n conn.end();\n return deny();\n }\n\n const clientSocket = accept(true);\n if (clientSocket) {\n stream.pipe(clientSocket).pipe(stream).on('close', () => {\n conn.end();\n });\n } else {\n conn.end();\n }\n });\n }).on('error', (err) => {\n deny();\n }).connect(sshConfig);\n}).listen(1080, 'localhost', () => {\n console.log('SOCKSv5 proxy server started on port 1080');\n}).useAuth(socks.auth.None());\n\n// test with cURL:\n// curl -i --socks5 localhost:1080 google.com\n```\n\n### Make HTTP(S) connections easily using a custom http(s).Agent\n\n```js\nconst http = require('http');\n\nconst { Client, HTTPAgent, HTTPSAgent } = require('ssh2');\n\nconst sshConfig = {\n host: '192.168.100.1',\n port: 22,\n username: 'nodejs',\n password: 'rules'\n};\n\n// Use `HTTPSAgent` instead for an HTTPS request\nconst agent = new HTTPAgent(sshConfig);\nhttp.get({\n host: '192.168.200.1',\n agent,\n headers: { Connection: 'close' }\n}, (res) => {\n console.log(res.statusCode);\n console.dir(res.headers);\n res.resume();\n});\n```\n\n\n### Invoke an arbitrary subsystem\n\n```js\nconst { Client } = require('ssh2');\n\nconst xmlhello = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <capabilities>\n <capability>urn:ietf:params:netconf:base:1.0</capability>\n </capabilities>\n </hello>]]>]]>`;\n\nconst conn = new Client();\n\nconn.on('ready', () => {\n console.log('Client :: ready');\n conn.subsys('netconf', (err, stream) => {\n if (err) throw err;\n stream.on('data', (data) => {\n console.log(data);\n }).write(xmlhello);\n });\n}).connect({\n host: '1.2.3.4',\n port: 22,\n username: 'blargh',\n password: 'honk'\n});\n```\n\n## Server Examples\n\n### Password and public key authentication and non-interactive (exec) command execution\n\n```js\nconst { timingSafeEqual } = require('crypto');\nconst { readFileSync } = require('fs');\nconst { inspect } = require('util');\n\nconst { utils: { parseKey }, Server } = require('ssh2');\n\nconst allowedUser = Buffer.from('foo');\nconst allowedPassword = Buffer.from('bar');\nconst allowedPubKey = parseKey(readFileSync('foo.pub'));\n\nfunction checkValue(input, allowed) {\n const autoReject = (input.length !== allowed.length);\n if (autoReject) {\n // Prevent leaking length information by always making a comparison with the\n // same input when lengths don't match what we expect ...\n allowed = input;\n }\n const isMatch = timingSafeEqual(input, allowed);\n return (!autoReject && isMatch);\n}\n\nnew Server({\n hostKeys: [readFileSync('host.key')]\n}, (client) => {\n console.log('Client connected!');\n\n client.on('authentication', (ctx) => {\n let allowed = true;\n if (!checkValue(Buffer.from(ctx.username), allowedUser))\n allowed = false;\n\n switch (ctx.method) {\n case 'password':\n if (!checkValue(Buffer.from(ctx.password), allowedPassword))\n return ctx.reject();\n break;\n case 'publickey':\n if (ctx.key.algo !== allowedPubKey.type\n || !checkValue(ctx.key.data, allowedPubKey.getPublicSSH())\n || (ctx.signature && allowedPubKey.verify(ctx.blob, ctx.signature) !== true)) {\n return ctx.reject();\n }\n break;\n default:\n return ctx.reject();\n }\n\n if (allowed)\n ctx.accept();\n else\n ctx.reject();\n }).on('ready', () => {\n console.log('Client authenticated!');\n\n client.on('session', (accept, reject) => {\n const session = accept();\n session.once('exec', (accept, reject, info) => {\n console.log('Client wants to execute: ' + inspect(info.command));\n const stream = accept();\n stream.stderr.write('Oh no, the dreaded errors!\\n');\n stream.write('Just kidding about the errors!\\n');\n stream.exit(0);\n stream.end();\n });\n });\n }).on('close', () => {\n console.log('Client disconnected');\n });\n}).listen(0, '127.0.0.1', function() {\n console.log('Listening on port ' + this.address().port);\n});\n```\n\n### SFTP-only server\n\n```js\nconst { timingSafeEqual } = require('crypto');\nconst { readFileSync } = require('fs');\nconst { inspect } = require('util');\n\nconst {\n Server,\n sftp: {\n OPEN_MODE,\n STATUS_CODE,\n },\n} = require('ssh2');\n\nconst allowedUser = Buffer.from('foo');\nconst allowedPassword = Buffer.from('bar');\n\nfunction checkValue(input, allowed) {\n const autoReject = (input.length !== allowed.length);\n if (autoReject) {\n // Prevent leaking length information by always making a comparison with the\n // same input when lengths don't match what we expect ...\n allowed = input;\n }\n const isMatch = timingSafeEqual(input, allowed);\n return (!autoReject && isMatch);\n}\n\n// This simple SFTP server implements file uploading where the contents get\n// ignored ...\n\nnew ssh2.Server({\n hostKeys: [readFileSync('host.key')]\n}, (client) => {\n console.log('Client connected!');\n\n client.on('authentication', (ctx) => {\n let allowed = true;\n if (!checkValue(Buffer.from(ctx.username), allowedUser))\n allowed = false;\n\n switch (ctx.method) {\n case 'password':\n if (!checkValue(Buffer.from(ctx.password), allowedPassword))\n return ctx.reject();\n break;\n default:\n return ctx.reject();\n }\n\n if (allowed)\n ctx.accept();\n else\n ctx.reject();\n }).on('ready', () => {\n console.log('Client authenticated!');\n\n client.on('session', (accept, reject) => {\n const session = accept();\n session.on('sftp', (accept, reject) => {\n console.log('Client SFTP session');\n const openFiles = new Map();\n let handleCount = 0;\n const sftp = accept();\n sftp.on('OPEN', (reqid, filename, flags, attrs) => {\n // Only allow opening /tmp/foo.txt for writing\n if (filename !== '/tmp/foo.txt' || !(flags & OPEN_MODE.WRITE))\n return sftp.status(reqid, STATUS_CODE.FAILURE);\n\n // Create a fake handle to return to the client, this could easily\n // be a real file descriptor number for example if actually opening\n // a file on disk\n const handle = Buffer.alloc(4);\n openFiles.set(handleCount, true);\n handle.writeUInt32BE(handleCount++, 0);\n\n console.log('Opening file for write')\n sftp.handle(reqid, handle);\n }).on('WRITE', (reqid, handle, offset, data) => {\n if (handle.length !== 4\n || !openFiles.has(handle.readUInt32BE(0))) {\n return sftp.status(reqid, STATUS_CODE.FAILURE);\n }\n\n // Fake the write operation\n sftp.status(reqid, STATUS_CODE.OK);\n\n console.log('Write to file at offset ${offset}: ${inspect(data)}');\n }).on('CLOSE', (reqid, handle) => {\n let fnum;\n if (handle.length !== 4\n || !openFiles.has(fnum = handle.readUInt32BE(0))) {\n return sftp.status(reqid, STATUS_CODE.FAILURE);\n }\n\n console.log('Closing file');\n openFiles.delete(fnum);\n\n sftp.status(reqid, STATUS_CODE.OK);\n });\n });\n });\n }).on('close', () => {\n console.log('Client disconnected');\n });\n}).listen(0, '127.0.0.1', function() {\n console.log('Listening on port ' + this.address().port);\n});\n```\n\nYou can find more examples in the `examples` directory of this repository.\n\n## API\n\n`require('ssh2').Client` is the **_Client_** constructor.\n\n`require('ssh2').Server` is the **_Server_** constructor.\n\n`require('ssh2').utils` is an object containing some useful [utilities](#utilities).\n\n`require('ssh2').HTTPAgent` is an [`http.Agent`](https://nodejs.org/docs/latest/api/http.html#http_class_http_agent) constructor.\n\n`require('ssh2').HTTPSAgent` is an [`https.Agent`](https://nodejs.org/docs/latest/api/https.html#https_class_https_agent) constructor. Its API is the same as `HTTPAgent` except it's for HTTPS connections.\n\n### Agent-related\n\n`require('ssh2').AgentProtocol` is a Duplex stream [class](#agentprotocol) that aids in communicating over the OpenSSH agent protocol.\n\n`require('ssh2').BaseAgent` is a base [class](#baseagent) for creating custom authentication agents.\n\n`require('ssh2').createAgent` is a helper [function](#createagent) that creates a new agent instance using the same logic as the `agent` configuration option: if the platform is Windows and it's the value \"pageant\", it creates a `PageantAgent`, otherwise if it's not a path to a Windows pipe it creates a `CygwinAgent`. In all other cases, it creates an `OpenSSHAgent`.\n\n`require('ssh2').CygwinAgent` is an agent [class](#cygwinagent) implementation that communicates with agents in a Cygwin environment.\n\n`require('ssh2').OpenSSHAgent` is an agent [class](#opensshagent) implementation that communicates with OpenSSH agents over a UNIX socket.\n\n`require('ssh2').PageantAgent` is an agent [class](#pageantagent) implementation that communicates with Pageant agent processes.\n\n### Client\n\n#### Client events\n\n* **banner**(< _string_ >message, < _string_ >language) - A notice was sent by the server upon connection.\n\n* **change password**(< _string_ >prompt, < _function_ >done) - If using password-based user authentication, the server has requested that the user's password be changed. Call `done` with the new password.\n\n* **close**() - The socket was closed.\n\n* **end**() - The socket was disconnected.\n\n* **error**(< _Error_ >err) - An error occurred. A 'level' property indicates 'client-socket' for socket-level errors and 'client-ssh' for SSH disconnection messages. In the case of 'client-ssh' messages, there may be a 'description' property that provides more detail.\n\n* **handshake**(< _object_ >negotiated) - Emitted when a handshake has completed (either initial or rekey). `negotiated` contains the negotiated details of the handshake and is of the form:\n\n```js\n // In this particular case `mac` is empty because there is no separate MAC\n // because it's integrated into AES in GCM mode\n { kex: 'ecdh-sha2-nistp256',\n srvHostKey: 'rsa-sha2-512',\n cs: { // Client to server algorithms\n cipher: 'aes128-gcm',\n mac: '',\n compress: 'none',\n lang: ''\n },\n sc: { // Server to client algorithms\n cipher: 'aes128-gcm',\n mac: '',\n compress: 'none',\n lang: ''\n }\n }\n```\n\n* **hostkeys**(< _array_ >keys) - Emitted when the server announces its available host keys. `keys` is the list of parsed (using [`parseKey()`](#utilities)) host public keys.\n\n* **keyboard-interactive**(< _string_ >name, < _string_ >instructions, < _string_ >instructionsLang, < _array_ >prompts, < _function_ >finish) - The server is asking for replies to the given `prompts` for keyboard-interactive user authentication. `name` is generally what you'd use as a window title (for GUI apps). `prompts` is an array of `{ prompt: 'Password: ', echo: false }` style objects (here `echo` indicates whether user input should be displayed on the screen). The answers for all prompts must be provided as an array of strings and passed to `finish` when you are ready to continue. Note: It's possible for the server to come back and ask more questions.\n\n* **ready**() - Authentication was successful.\n\n* **rekey**() - Emitted when a rekeying operation has completed (either client or server-initiated).\n\n* **tcp connection**(< _object_ >details, < _function_ >accept, < _function_ >reject) - An incoming forwarded TCP connection is being requested. Calling `accept` accepts the connection and returns a `Channel` object. Calling `reject` rejects the connection and no further action is needed. `details` contains:\n\n * **destIP** - _string_ - The remote IP the connection was received on (given in earlier call to `forwardIn()`).\n\n * **destPort** - _integer_ - The remote port the connection was received on (given in earlier call to `forwardIn()`).\n\n * **srcIP** - _string_ - The originating IP of the connection.\n\n * **srcPort** - _integer_ - The originating port of the connection.\n\n* **unix connection**(< _object_ >details, < _function_ >accept, < _function_ >reject) - An incoming forwarded UNIX socket connection is being requested. Calling `accept` accepts the connection and returns a `Channel` object. Calling `reject` rejects the connection and no further action is needed. `details` contains:\n\n * **socketPath** - _string_ - The originating UNIX socket path of the connection.\n\n* **x11**(< _object_ >details, < _function_ >accept, < _function_ >reject) - An incoming X11 connection is being requested. Calling `accept` accepts the connection and returns a `Channel` object. Calling `reject` rejects the connection and no further action is needed. `details` contains:\n\n * **srcIP** - _string_ - The originating IP of the connection.\n\n * **srcPort** - _integer_ - The originating port of the connection.\n\n#### Client methods\n\n* **(constructor)**() - Creates and returns a new Client instance.\n\n* **connect**(< _object_ >config) - _(void)_ - Attempts a connection to a server using the information given in `config`:\n\n * **agent** - _string_ - Path to ssh-agent's UNIX socket for ssh-agent-based user authentication. **Windows users: set to 'pageant' for authenticating with Pageant or (actual) path to a cygwin \"UNIX socket.\"** **Default:** (none)\n\n * **agentForward** - _boolean_ - Set to `true` to use OpenSSH agent forwarding (`auth-agent@openssh.com`) for the life of the connection. `agent` must also be set to use this feature. **Default:** `false`\n\n * **algorithms** - _object_ - This option allows you to explicitly override the default transport layer algorithms used for the connection. The value for each category must either be an array of valid algorithm names to set an exact list (with the most preferable first) or an object containing `append`, `prepend`, and/or `remove` properties that each contain an _array_ of algorithm names or RegExps to match to adjust default lists for each category. Valid keys:\n\n * **cipher** - _mixed_ - Ciphers.\n * Default list (in order from most to least preferable):\n * `chacha20-poly1305@openssh.com` (priority of chacha20-poly1305 may vary depending upon CPU and/or optional binding availability)\n * `aes128-gcm`\n * `aes128-gcm@openssh.com`\n * `aes256-gcm`\n * `aes256-gcm@openssh.com`\n * `aes128-ctr`\n * `aes192-ctr`\n * `aes256-ctr`\n * Other supported names:\n * `3des-cbc`\n * `aes256-cbc`\n * `aes192-cbc`\n * `aes128-cbc`\n * `arcfour256`\n * `arcfour128`\n * `arcfour`\n * `blowfish-cbc`\n * `cast128-cbc`\n\n * **compress** - _mixed_ - Compression algorithms.\n * Default list (in order from most to least preferable):\n * `none`\n * `zlib@openssh.com`\n * `zlib`\n * Other supported names:\n\n * **hmac** - _mixed_ - (H)MAC algorithms.\n * Default list (in order from most to least preferable):\n * `hmac-sha2-256-etm@openssh.com`\n * `hmac-sha2-512-etm@openssh.com`\n * `hmac-sha1-etm@openssh.com`\n * `hmac-sha2-256`\n * `hmac-sha2-512`\n * `hmac-sha1`\n * Other supported names:\n * `hmac-md5`\n * `hmac-sha2-256-96`\n * `hmac-sha2-512-96`\n * `hmac-ripemd160`\n * `hmac-sha1-96`\n * `hmac-md5-96`\n\n * **kex** - _mixed_ - Key exchange algorithms.\n * Default list (in order from most to least preferable):\n * `curve25519-sha256` (node v14.0.0+)\n * `curve25519-sha256@libssh.org` (node v14.0.0+)\n * `ecdh-sha2-nistp256`\n * `ecdh-sha2-nistp384`\n * `ecdh-sha2-nistp521`\n * `diffie-hellman-group-exchange-sha256`\n * `diffie-hellman-group14-sha256`\n * `diffie-hellman-group15-sha512`\n * `diffie-hellman-group16-sha512`\n * `diffie-hellman-group17-sha512`\n * `diffie-hellman-group18-sha512`\n * Other supported names:\n * `diffie-hellman-group-exchange-sha1`\n * `diffie-hellman-group14-sha1`\n * `diffie-hellman-group1-sha1`\n\n * **serverHostKey** - _mixed_ - Server host key formats.\n * Default list (in order from most to least preferable):\n * `ssh-ed25519` (node v12.0.0+)\n * `ecdsa-sha2-nistp256`\n * `ecdsa-sha2-nistp384`\n * `ecdsa-sha2-nistp521`\n * `rsa-sha2-512`\n * `rsa-sha2-256`\n * `ssh-rsa`\n * Other supported names:\n * `ssh-dss`\n\n * **authHandler** - _mixed_ - Either an array of objects as described below or a function with parameters `(methodsLeft, partialSuccess, callback)` where `methodsLeft` and `partialSuccess` are `null` on the first authentication attempt, otherwise are an array and boolean respectively. Return or call `callback()` with either the name of the authentication method or an object containing the method name along with method-specific details to try next (return/pass `false` to signal no more methods to try). Valid method names are: `'none', 'password', 'publickey', 'agent', 'keyboard-interactive', 'hostbased'`. **Default:** function that follows a set method order: None -> Password -> Private Key -> Agent (-> keyboard-interactive if `tryKeyboard` is `true`) -> Hostbased\n\n * When returning or calling `callback()` with an object, it can take one of the following forms:\n\n ```js\n {\n type: 'none',\n username: 'foo',\n }\n ```\n\n ```js\n {\n type: 'password'\n username: 'foo',\n password: 'bar',\n }\n ```\n\n ```js\n {\n type: 'publickey'\n username: 'foo',\n // Can be a string, Buffer, or parsed key containing a private key\n key: ...,\n // `passphrase` only required for encrypted keys\n passphrase: ...,\n }\n ```\n\n ```js\n {\n type: 'hostbased'\n username: 'foo',\n localHostname: 'baz',\n localUsername: 'quux',\n // Can be a string, Buffer, or parsed key containing a private key\n key: ...,\n // `passphrase` only required for encrypted keys\n passphrase: ...,\n }\n ```\n\n ```js\n {\n type: 'agent'\n username: 'foo',\n // Can be a string that is interpreted exactly like the `agent`\n // connection config option or can be a custom agent\n // object/instance that extends and implements `BaseAgent`\n agent: ...,\n }\n ```\n\n ```js\n {\n type: 'keyboard-interactive'\n username: 'foo',\n // This works exactly the same way as a 'keyboard-interactive'\n // Client event handler\n prompt: (name, instructions, instructionsLang, prompts, finish) => {\n // ...\n },\n }\n ```\n\n * **debug** - _function_ - Set this to a function that receives a single string argument to get detailed (local) debug information. **Default:** (none)\n\n * **forceIPv4** - _boolean_ - Only connect via resolved IPv4 address for `host`. **Default:** `false`\n\n * **forceIPv6** - _boolean_ - Only connect via resolved IPv6 address for `host`. **Default:** `false`\n\n * **host** - _string_ - Hostname or IP address of the server. **Default:** `'localhost'`\n\n * **hostHash** - _string_ - Any valid hash algorithm supported by node. The host's key is hashed using this algorithm and passed to the **hostVerifier** function as a hex string. **Default:** (none)\n\n * **hostVerifier** - _function_ - Function with parameters `(hashedKey[, callback])` where `hashedKey` is a string hex hash of the host's key for verification purposes. Return `true` to continue with the handshake or `false` to reject and disconnect, or call `callback()` with `true` or `false` if you need to perform asynchronous verification. **Default:** (auto-accept if `hostVerifier` is not set)\n\n * **keepaliveCountMax** - _integer_ - How many consecutive, unanswered SSH-level keepalive packets that can be sent to the server before disconnection (similar to OpenSSH's ServerAliveCountMax config option). **Default:** `3`\n\n * **keepaliveInterval** - _integer_ - How often (in milliseconds) to send SSH-level keepalive packets to the server (in a similar way as OpenSSH's ServerAliveInterval config option). Set to 0 to disable. **Default:** `0`\n\n * **localAddress** - _string_ - IP address of the network interface to use to connect to the server. **Default:** (none -- determined by OS)\n\n * **localHostname** - _string_ - Along with **localUsername** and **privateKey**, set this to a non-empty string for hostbased user authentication. **Default:** (none)\n\n * **localPort** - _string_ - The local port number to connect from. **Default:** (none -- determined by OS)\n\n * **localUsername** - _string_ - Along with **localHostname** and **privateKey**, set this to a non-empty string for hostbased user authentication. **Default:** (none)\n\n * **passphrase** - _string_ - For an encrypted `privateKey`, this is the passphrase used to decrypt it. **Default:** (none)\n\n * **password** - _string_ - Password for password-based user authentication. **Default:** (none)\n\n * **port** - _integer_ - Port number of the server. **Default:** `22`\n\n * **privateKey** - _mixed_ - _Buffer_ or _string_ that contains a private key for either key-based or hostbased user authentication (OpenSSH format). **Default:** (none)\n\n * **readyTimeout** - _integer_ - How long (in milliseconds) to wait for the SSH handshake to complete. **Default:** `20000`\n\n * **sock** - _ReadableStream_ - A _ReadableStream_ to use for communicating with the server instead of creating and using a new TCP connection (useful for connection hopping).\n\n * **strictVendor** - _boolean_ - Performs a strict server vendor check before sending vendor-specific requests, etc. (e.g. check for OpenSSH server when using `openssh_noMoreSessions()`) **Default:** `true`\n\n * **tryKeyboard** - _boolean_ - Try keyboard-interactive user authentication if primary user authentication method fails. If you set this to `true`, you need to handle the `keyboard-interactive` event. **Default:** `false`\n\n * **username** - _string_ - Username for authentication. **Default:** (none)\n\n* **end**() - _(void)_ - Disconnects the socket.\n\n* **exec**(< _string_ >command[, < _object_ >options], < _function_ >callback) - _(void)_ - Executes `command` on the server. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream. Valid `options` properties are:\n\n * **env** - _object_ - An environment to use for the execution of the command.\n\n * **pty** - _mixed_ - Set to `true` to allocate a pseudo-tty with defaults, or an object containing specific pseudo-tty settings (see 'Pseudo-TTY settings'). Setting up a pseudo-tty can be useful when working with remote processes that expect input from an actual terminal (e.g. sudo's password prompt).\n\n * **x11** - _mixed_ - Set to `true` to use defaults below, set to a number to specify a specific screen number, or an object with the following valid properties:\n\n * **cookie** - _mixed_ - The authentication cookie. Can be a hex _string_ or a _Buffer_ containing the raw cookie value (which will be converted to a hex string). **Default:** (random 16 byte value)\n\n * **protocol** - _string_ - The authentication protocol name. **Default:** `'MIT-MAGIC-COOKIE-1'`\n\n * **screen** - _number_ - Screen number to use **Default:** `0`\n\n * **single** - _boolean_ - Allow just a single connection? **Default:** `false`\n\n* **forwardIn**(< _string_ >remoteAddr, < _integer_ >remotePort, < _function_ >callback) - _(void)_ - Bind to `remoteAddr` on `remotePort` on the server and forward incoming TCP connections. `callback` has 2 parameters: < _Error_ >err, < _integer_ >port (`port` is the assigned port number if `remotePort` was 0). Here are some special values for `remoteAddr` and their associated binding behaviors:\n\n * '' - Connections are to be accepted on all protocol families supported by the server.\n\n * '0.0.0.0' - Listen on all IPv4 addresses.\n\n * '::' - Listen on all IPv6 addresses.\n\n * 'localhost' - Listen on all protocol families supported by the server on loopback addresses only.\n\n * '127.0.0.1' and '::1' - Listen on the loopback interfaces for IPv4 and IPv6, respectively.\n\n* **forwardOut**(< _string_ >srcIP, < _integer_ >srcPort, < _string_ >dstIP, < _integer_ >dstPort, < _function_ >callback) - _(void)_ - Open a connection with `srcIP` and `srcPort` as the originating address and port and `dstIP` and `dstPort` as the remote destination address and port. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **openssh_forwardInStreamLocal**(< _string_ >socketPath, < _function_ >callback) - _(void)_ - OpenSSH extension that binds to a UNIX domain socket at `socketPath` on the server and forwards incoming connections. `callback` has 1 parameter: < _Error_ >err.\n\n* **openssh_forwardOutStreamLocal**(< _string_ >socketPath, < _function_ >callback) - _(void)_ - OpenSSH extension that opens a connection to a UNIX domain socket at `socketPath` on the server. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **openssh_noMoreSessions**(< _function_ >callback) - _(void)_ - OpenSSH extension that sends a request to reject any new sessions (e.g. exec, shell, sftp, subsys) for this connection. `callback` has 1 parameter: < _Error_ >err.\n\n* **openssh_unforwardInStreamLocal**(< _string_ >socketPath, < _function_ >callback) - _(void)_ - OpenSSH extension that unbinds from a UNIX domain socket at `socketPath` on the server and stops forwarding incoming connections. `callback` has 1 parameter: < _Error_ >err.\n\n* **rekey**([< _function_ >callback]) - _(void)_ - Initiates a rekey with the server. If `callback` is supplied, it is added as a one-time handler for the `rekey` event.\n\n* **sftp**(< _function_ >callback) - _(void)_ - Starts an SFTP session. `callback` has 2 parameters: < _Error_ >err, < _SFTP_ >sftp. For methods available on `sftp`, see the [`SFTP` client documentation](https://github.com/mscdex/ssh2/blob/master/SFTP.md).\n\n* **shell**([[< _mixed_ >window,] < _object_ >options]< _function_ >callback) - _(void)_ - Starts an interactive shell session on the server, with an optional `window` object containing pseudo-tty settings (see 'Pseudo-TTY settings'). If `window === false`, then no pseudo-tty is allocated. `options` supports the `x11` and `env` options as described in `exec()`. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **subsys**(< _string_ >subsystem, < _function_ >callback) - _(void)_ - Invokes `subsystem` on the server. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **unforwardIn**(< _string_ >remoteAddr, < _integer_ >remotePort, < _function_ >callback) - _(void)_ - Unbind from `remoteAddr` on `remotePort` on the server and stop forwarding incoming TCP connections. Until `callback` is called, more connections may still come in. `callback` has 1 parameter: < _Error_ >err.\n\n### Server\n\n#### Server events\n\n* **connection**(< _Connection_ >client, < _object_ >info) - A new client has connected. `info` contains the following properties:\n\n * **family** - _string_ - The `remoteFamily` of the connection.\n\n * **header** - _object_ - Information about the client's header:\n\n * **identRaw** - _string_ - The raw client identification string.\n\n * **versions** - _object_ - Various version information:\n\n * **protocol** - _string_ - The SSH protocol version (always `1.99` or `2.0`).\n\n * **software** - _string_ - The software name and version of the client.\n\n * **comments** - _string_ - Any text that comes after the software name/version.\n\n Example: the identification string `SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2` would be parsed as:\n\n```js\n { identRaw: 'SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2',\n version: {\n protocol: '2.0',\n software: 'OpenSSH_6.6.1p1'\n },\n comments: 'Ubuntu-2ubuntu2' }\n```\n\n * **ip** - _string_ - The `remoteAddress` of the connection.\n\n * **port** - _integer_ - The `remotePort` of the connection.\n\n#### Server methods\n\n* **(constructor)**(< _object_ >config[, < _function_ >connectionListener]) - Creates and returns a new Server instance. Server instances also have the same methods/properties/events as [`net.Server`](http://nodejs.org/docs/latest/api/net.html#net_class_net_server). `connectionListener` if supplied, is added as a `connection` listener. Valid `config` properties:\n\n * **algorithms** - _object_ - This option allows you to explicitly override the default transport layer algorithms used for incoming client connections. Each value must be an array of valid algorithms for that category. The order of the algorithms in the arrays are important, with the most favorable being first. For a list of valid and default algorithm names, please review the documentation for the version of `ssh2` used by this module. Valid keys:\n\n * **cipher** - _array_ - Ciphers.\n\n * **compress** - _array_ - Compression algorithms.\n\n * **hmac** - _array_ - (H)MAC algorithms.\n\n * **kex** - _array_ - Key exchange algorithms.\n\n * **serverHostKey** - _array_ - Server host key formats.\n\n * **banner** - _string_ - A message that is sent to clients once, right before authentication begins. **Default:** (none)\n\n * **debug** - _function_ - Set this to a function that receives a single string argument to get detailed (local) debug information. **Default:** (none)\n\n * **greeting** - _string_ - A message that is sent to clients immediately upon connection, before handshaking begins. **Note:** Most clients usually ignore this. **Default:** (none)\n\n * **highWaterMark** - _integer_ - This is the `highWaterMark` to use for the parser stream. **Default:** `32 * 1024`\n\n * **hostKeys** - _array_ - An array of either Buffers/strings that contain host private keys or objects in the format of `{ key: <Buffer/string>, passphrase: <string> }` for encrypted private keys. (**Required**) **Default:** (none)\n\n * **ident** - _string_ - A custom server software name/version identifier. **Default:** `'ssh2js' + moduleVersion + 'srv'`\n\n* **injectSocket**(< _DuplexStream_ >socket) - Injects a bidirectional stream as though it were a TCP socket connection. Additionally, `socket` should include `net.Socket`-like properties to ensure the best compatibility (e.g. `socket.remoteAddress`, `socket.remotePort`, `socket.remoteFamily`).\n\n#### Connection events\n\n* **authentication**(< _AuthContext_ >ctx) - The client has requested authentication. `ctx.username` contains the client username, `ctx.method` contains the requested authentication method, and `ctx.accept()` and `ctx.reject([< Array >authMethodsLeft[, < Boolean >isPartialSuccess]])` are used to accept or reject the authentication request respectively. `abort` is emitted if the client aborts the authentication request. Other properties/methods available on `ctx` depends on the `ctx.method` of authentication the client has requested:\n\n * `hostbased`:\n\n * **blob** - _Buffer_ - This contains the data to be verified that is passed to (along with the signature) `key.verify()` where `key` is a public key parsed with [`parseKey()`](#utilities).\n\n * **key** - _object_ - Contains information about the public key sent by the client:\n\n * **algo** - _string_ - The name of the key algorithm (e.g. `ssh-rsa`).\n\n * **data** - _Buffer_ - The actual key data.\n\n * **localHostname** - _string_ - The local hostname provided by the client.\n\n * **localUsername** - _string_ - The local username provided by the client.\n\n * **signature** - _Buffer_ - This contains a signature to be verified that is passed to (along with the blob) `key.verify()` where `key` is a public key parsed with [`parseKey()`](#utilities).\n\n * `keyboard-interactive`:\n\n * **prompt**(< _array_ >prompts[, < _string_ >title[, < _string_ >instructions]], < _function_ >callback) - _(void)_ - Send prompts to the client. `prompts` is an array of `{ prompt: 'Prompt text', echo: true }` objects (`prompt` being the prompt text and `echo` indicating whether the client's response to the prompt should be echoed to their display). `callback` is called with `(responses)`, where `responses` is an array of string responses matching up to the `prompts`.\n\n * **submethods** - _array_ - A list of preferred authentication \"sub-methods\" sent by the client. This may be used to determine what (if any) prompts to send to the client.\n\n * `password`:\n\n * **password** - _string_ - This is the password sent by the client.\n\n * **requestChange**(< _string_ >prompt, < _function_ >callback) - _(void)_ - Sends a password change request to the client. `callback` is called with `(newPassword)`, where `newPassword` is the new password supplied by the client. You may accept, reject, or prompt for another password change after `callback` is called.\n\n * `publickey`:\n\n * **blob** - _mixed_ - If the value is `undefined`, the client is only checking the validity of the `key`. If the value is a _Buffer_, then this contains the data to be verified that is passed to (along with the signature) `key.verify()` where `key` is a public key parsed with [`parseKey()`](#utilities).\n\n * **key** - _object_ - Contains information about the public key sent by the client:\n\n * **algo** - _string_ - The name of the key algorithm (e.g. `ssh-rsa`).\n\n * **data** - _Buffer_ - The actual key data.\n\n * **signature** - _mixed_ - If the value is `undefined`, the client is only checking the validity of the `key`. If the value is a _Buffer_, then this contains a signature to be verified that is passed to (along with the blob) `key.verify()` where `key` is a public key parsed with [`parseKey()`](#utilities).\n\n* **close**() - The client socket was closed.\n\n* **end**() - The client socket disconnected.\n\n* **error**(< _Error_ >err) - An error occurred.\n\n* **handshake**(< _object_ >negotiated) - Emitted when a handshake has completed (either initial or rekey). `negotiated` contains the negotiated details of the handshake and is of the form:\n\n```js\n // In this particular case `mac` is empty because there is no separate MAC\n // because it's integrated into AES in GCM mode\n { kex: 'ecdh-sha2-nistp256',\n srvHostKey: 'rsa-sha2-512',\n cs: { // Client to server algorithms\n cipher: 'aes128-gcm',\n mac: '',\n compress: 'none',\n lang: ''\n },\n sc: { // Server to client algorithms\n cipher: 'aes128-gcm',\n mac: '',\n compress: 'none',\n lang: ''\n }\n }\n```\n\n* **openssh.streamlocal**(< _function_ >accept, < _function_ >reject, < _object_ >info) - Emitted when the client has requested a connection to a UNIX domain socket. `accept()` returns a new _Channel_ instance representing the connection. `info` contains:\n\n * **socketPath** - _string_ - Destination socket path of outgoing connection.\n\n* **ready**() - Emitted when the client has been successfully authenticated.\n\n* **rekey**() - Emitted when a rekeying operation has completed (either client or server-initiated).\n\n* **request**(< _mixed_ >accept, < _mixed_ >reject, < _string_ >name, < _object_ >info) - Emitted when the client has sent a global request for `name` (e.g. `tcpip-forward` or `cancel-tcpip-forward`). `accept` and `reject` are functions if the client requested a response. If `bindPort === 0`, you should pass the chosen port to `accept()` so that the client will know what port was bound. `info` contains additional details about the request:\n\n * `cancel-tcpip-forward` and `tcpip-forward`:\n\n * **bindAddr** - _string_ - The IP address to start/stop binding to.\n\n * **bindPort** - _integer_ - The port to start/stop binding to.\n\n * `cancel-streamlocal-forward@openssh.com` and `streamlocal-forward@openssh.com`:\n\n * **socketPath** - _string_ - The socket path to start/stop binding to.\n\n* **session**(< _function_ >accept, < _function_ >reject) - Emitted when the client has requested a new session. Sessions are used to start interactive shells, execute commands, request X11 forwarding, etc. `accept()` returns a new _Session_ instance.\n\n* **tcpip**(< _function_ >accept, < _function_ >reject, < _object_ >info) - Emitted when the client has requested an outbound (TCP) connection. `accept()` returns a new _Channel_ instance representing the connection. `info` contains:\n\n * **destIP** - _string_ - Destination IP address of outgoing connection.\n\n * **destPort** - _string_ - Destination port of outgoing connection.\n\n * **srcIP** - _string_ - Source IP address of outgoing connection.\n\n * **srcPort** - _string_ - Source port of outgoing connection.\n\n#### Connection methods\n\n* **end**() - _(void)_ - Closes the client connection.\n\n* **forwardOut**(< _string_ >boundAddr, < _integer_ >boundPort, < _string_ >remoteAddr, < _integer_ >remotePort, < _function_ >callback) - _(void)_ - Alert the client of an incoming TCP connection on `boundAddr` on port `boundPort` from `remoteAddr` on port `remotePort`. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **openssh_forwardOutStreamLocal**(< _string_ >socketPath, < _function_ >callback) - _(void)_ - Alert the client of an incoming UNIX domain socket connection on `socketPath`. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n* **rekey**([< _function_ >callback]) - _(void)_ - Initiates a rekey with the client. If `callback` is supplied, it is added as a one-time handler for the `rekey` event.\n\n* **x11**(< _string_ >originAddr, < _integer_ >originPort, < _function_ >callback) - _(void)_ - Alert the client of an incoming X11 client connection from `originAddr` on port `originPort`. `callback` has 2 parameters: < _Error_ >err, < _Channel_ >stream.\n\n#### Session events\n\n* **auth-agent**(< _mixed_ >accept, < _mixed_ >reject) - The client has requested incoming ssh-agent requests be forwarded to them. `accept` and `reject` are functions if the client requested a response.\n\n* **close**() - The session was closed.\n\n* **env**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client requested an environment variable to be set for this session. `accept` and `reject` are functions if the client requested a response. `info` has these properties:\n\n * **key** - _string_ - The environment variable's name.\n\n * **value** - _string_ - The environment variable's value.\n\n* **exec**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client has requested execution of a command string. `accept` and `reject` are functions if the client requested a response. `accept()` returns a _Channel_ for the command execution. `info` has these properties:\n\n * **command** - _string_ - The command line to be executed.\n\n* **pty**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client requested allocation of a pseudo-TTY for this session. `accept` and `reject` are functions if the client requested a response. `info` has these properties:\n\n * **cols** - _integer_ - The number of columns for the pseudo-TTY.\n\n * **height** - _integer_ - The height of the pseudo-TTY in pixels.\n\n * **modes** - _object_ - Contains the requested terminal modes of the pseudo-TTY keyed on the mode name with the value being the mode argument. (See the table at the end for valid names).\n\n * **rows** - _integer_ - The number of rows for the pseudo-TTY.\n\n * **width** - _integer_ - The width of the pseudo-TTY in pixels.\n\n* **sftp**(< _mixed_ >accept, < _mixed_ >reject) - The client has requested the SFTP subsystem. `accept` and `reject` are functions if the client requested a response. `accept()` returns an _SFTP_ instance in server mode (see the [`SFTP` documentation](https://github.com/mscdex/ssh2/blob/master/SFTP.md) for details). `info` has these properties:\n\n* **shell**(< _mixed_ >accept, < _mixed_ >reject) - The client has requested an interactive shell. `accept` and `reject` are functions if the client requested a response. `accept()` returns a _Channel_ for the interactive shell.\n\n* **signal**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client has sent a signal. `accept` and `reject` are functions if the client requested a response. `info` has these properties:\n\n * **name** - _string_ - The signal name (e.g. `SIGUSR1`).\n\n* **subsystem**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client has requested an arbitrary subsystem. `accept` and `reject` are functions if the client requested a response. `accept()` returns a _Channel_ for the subsystem. `info` has these properties:\n\n * **name** - _string_ - The name of the subsystem.\n\n* **window-change**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client reported a change in window dimensions during this session. `accept` and `reject` are functions if the client requested a response. `info` has these properties:\n\n * **cols** - _integer_ - The new number of columns for the client window.\n\n * **height** - _integer_ - The new height of the client window in pixels.\n\n * **rows** - _integer_ - The new number of rows for the client window.\n\n * **width** - _integer_ - The new width of the client window in pixels.\n\n* **x11**(< _mixed_ >accept, < _mixed_ >reject, < _object_ >info) - The client requested X11 forwarding. `accept` and `reject` are functions if the client requested a response. `info` has these properties:\n\n * **cookie** - _string_ - The X11 authentication cookie encoded in hexadecimal.\n\n * **protocol** - _string_ - The name of the X11 authentication method used (e.g. `MIT-MAGIC-COOKIE-1`).\n\n * **screen** - _integer_ - The screen number to forward X11 connections for.\n\n * **single** - _boolean_ - `true` if only a single connection should be forwarded.\n\n### Channel\n\nThis is a normal **streams2** Duplex Stream (used both by clients and servers), with the following changes:\n\n* A boolean property `allowHalfOpen` exists and behaves similarly to the property of the same name for `net.Socket`. When the stream's end() is called, if `allowHalfOpen` is `true`, only EOF will be sent (the server can still send data if they have not already sent EOF). The default value for this property is `true`.\n\n* A `close` event is emitted once the channel is completely closed on both the client and server.\n\n* Client-specific:\n\n * For exec():\n\n * An `exit` event *may* (the SSH2 spec says it is optional) be emitted when the process finishes. If the process finished normally, the process's return value is passed to the `exit` callback. If the process was interrupted by a signal, the following are passed to the `exit` callback: null, < _string_ >signalName, < _boolean_ >didCoreDump, < _string_ >description.\n\n * If there was an `exit` event, the `close` event will be passed the same arguments for convenience.\n\n * A `stderr` property contains a Readable stream that represents output from stderr.\n\n * For exec() and shell():\n\n * The readable side represents stdout and the writable side represents stdin.\n\n * **setWindow**(< _integer_ >rows, < _integer_ >cols, < _integer_ >height, < _integer_ >width) - _(void)_ - Lets the server know that the local terminal window has been resized. The meaning of these arguments are described in the 'Pseudo-TTY settings' section.\n\n * **signal**(< _string_ >signalName) - _(void)_ - Sends a POSIX signal to the current process on the server. Valid signal names are: 'ABRT', 'ALRM', 'FPE', 'HUP', 'ILL', 'INT', 'KILL', 'PIPE', 'QUIT', 'SEGV', 'TERM', 'USR1', and 'USR2'. Some server implementations may ignore this request if they do not support signals. Note: If you are trying to send SIGINT and you find `signal()` doesn't work, try writing `'\\x03'` to the Channel stream instead.\n\n\n* Server-specific:\n\n * For exec-enabled channel instances there is an additional method available that may be called right before you close the channel. It has two different signatures:\n\n * **exit**(< _integer_ >exitCode) - _(void)_ - Sends an exit status code to the client.\n\n * **exit**(< _string_ >signalName[, < _boolean_ >coreDumped[, < _string_ >errorMsg]]) - _(void)_ - Sends an exit status code to the client.\n\n * For exec and shell-enabled channel instances, `channel.stderr` is a writable stream.\n\n### Pseudo-TTY settings\n\n* **cols** - < _integer_ > - Number of columns. **Default:** `80`\n\n* **height** - < _integer_ > - Height in pixels. **Default:** `480`\n\n* **modes** - < _object_ > - An object containing [Terminal Modes](#terminal-modes) as keys, with each value set to each mode argument. **Default:** `null`\n\n* **rows** - < _integer_ > - Number of rows. **Default:** `24`\n\n* **term** - < _string_ > - The value to use for $TERM. **Default:** `'vt100'`\n\n* **width** - < _integer_ > - Width in pixels. **Default:** `640`\n\n`rows` and `cols` override `width` and `height` when `rows` and `cols` are non-zero.\n\nPixel dimensions refer to the drawable area of the window.\n\nZero dimension parameters are ignored.\n\n### Terminal modes\n\nName | Description\n-------------- | ------------\nCS7 | 7 bit mode.\nCS8 | 8 bit mode.\nECHOCTL | Echo control characters as ^(Char).\nECHO | Enable echoing.\nECHOE | Visually erase chars.\nECHOKE | Visual erase for line kill.\nECHOK | Kill character discards current line.\nECHONL | Echo NL even if ECHO is off.\nICANON | Canonicalize input lines.\nICRNL | Map CR to NL on input.\nIEXTEN | Enable extensions.\nIGNCR | Ignore CR on input.\nIGNPAR | The ignore parity flag. The parameter SHOULD be 0 if this flag is FALSE, and 1 if it is TRUE.\nIMAXBEL | Ring bell on input queue full.\nINLCR | Map NL into CR on input.\nINPCK | Enable checking of parity errors.\nISIG | Enable signals INTR, QUIT, [D]SUSP.\nISTRIP | Strip 8th bit off characters.\nIUCLC | Translate uppercase characters to lowercase.\nIXANY | Any char will restart after stop.\nIXOFF | Enable input flow control.\nIXON | Enable output flow control.\nNOFLSH | Don't flush after interrupt.\nOCRNL | Translate carriage return to newline (output).\nOLCUC | Convert lowercase to uppercase.\nONLCR | Map NL to CR-NL.\nONLRET | Newline performs a carriage return (output).\nONOCR | Translate newline to carriage return-newline (output).\nOPOST | Enable output processing.\nPARENB | Parity enable.\nPARMRK | Mark parity and framing errors.\nPARODD | Odd parity, else even.\nPENDIN | Retype pending input.\nTOSTOP | Stop background jobs from output.\nTTY_OP_ISPEED | Specifies the input baud rate in bits per second.\nTTY_OP_OSPEED | Specifies the output baud rate in bits per second.\nVDISCARD | Toggles the flushing of terminal output.\nVDSUSP | Another suspend character.\nVEOF | End-of-file character (sends EOF from the terminal).\nVEOL2 | Additional end-of-line character.\nVEOL | End-of-line character in addition to carriage return and/or linefeed.\nVERASE | Erase the character to left of the cursor.\nVFLUSH | Character to flush output.\nVINTR | Interrupt character; 255 if none. Similarly for the other characters. Not all of these characters are supported on all systems.\nVKILL | Kill the current input line.\nVLNEXT | Enter the next character typed literally, even if it is a special character\nVQUIT | The quit character (sends SIGQUIT signal on POSIX systems).\nVREPRINT | Reprints the current input line.\nVSTART | Continues paused output (normally control-Q).\nVSTATUS | Prints system status line (load, command, pid, etc).\nVSTOP | Pauses output (normally control-S).\nVSUSP | Suspends the current program.\nVSWTCH | Switch to a different shell layer.\nVWERASE | Erases a word left of cursor.\nXCASE | Enable input and output of uppercase characters by preceding their lowercase equivalents with \"\\\".\n\n### HTTPAgent\n\n#### HTTPAgent methods\n\n* **(constructor)**(< _object_ >sshConfig[, < _object_ >agentConfig]) - Creates and returns a new `http.Agent` instance used to tunnel an HTTP connection over SSH. `sshConfig` is what is passed to `client.connect()` and `agentOptions` is passed to the `http.Agent` constructor.\n\n### HTTPSAgent\n\n#### HTTPSAgent methods\n\n* **(constructor)**(< _object_ >sshConfig[, < _object_ >agentConfig]) - Creates and returns a new `https.Agent` instance used to tunnel an HTTP connection over SSH. `sshConfig` is what is passed to `client.connect()` and `agentOptions` is passed to the `https.Agent` constructor.\n\n### Utilities\n\n* **parseKey**(< _mixed_ >keyData[, < _string_ >passphrase]) - _mixed_ - Parses a private/public key in OpenSSH, RFC4716, or PPK format. For encrypted private keys, the key will be decrypted with the given `passphrase`. `keyData` can be a _Buffer_ or _string_ value containing the key contents. The returned value will be an array of objects (currently in the case of modern OpenSSH keys) or an object with these properties and methods:\n\n * **comment** - _string_ - The comment for the key\n\n * **equals**(< _mixed_ >otherKey) - _boolean_ - This returns `true` if `otherKey` (a parsed or parseable key) is the same as this key. This method does not compare the keys' comments\n\n * **getPrivatePEM**() - _string_ - This returns the PEM version of a private key\n\n * **getPublicPEM**() - _string_ - This returns the PEM version of a public key (for either public key or derived from a private key)\n\n * **getPublicSSH**() - _string_ - This returns the SSH version of a public key (for either public key or derived from a private key)\n\n * **isPrivateKey**() - _boolean_ - This returns `true` if the key is a private key or not\n\n * **sign**(< _mixed_ >data) - _mixed_ - This signs the given `data` using this key and returns a _Buffer_ containing the signature on success. On failure, an _Error_ will be returned. `data` can be anything accepted by node's [`sign.update()`](https://nodejs.org/docs/latest/api/crypto.html#crypto_sign_update_data_inputencoding).\n\n * **type** - _string_ - The full key type (e.g. `'ssh-rsa'`)\n\n * **verify**(< _mixed_ >data, < _Buffer_ >signature) - _mixed_ - This verifies a `signature` of the given `data` using this key and returns `true` if the signature could be verified. On failure, either `false` will be returned or an _Error_ will be returned upon a more critical failure. `data` can be anything accepted by node's [`verify.update()`](https://nodejs.org/docs/latest/api/crypto.html#crypto_verify_update_data_inputencoding).\n\n* **sftp.OPEN_MODE** - [`OPEN_MODE`](https://github.com/mscdex/ssh2/blob/master/SFTP.md#useful-standalone-data-structures)\n\n* **sftp.STATUS_CODE** - [`STATUS_CODE`](https://github.com/mscdex/ssh2/blob/master/SFTP.md#useful-standalone-data-structures)\n\n* **sftp.flagsToString** - [`flagsToString()`](https://github.com/mscdex/ssh2/blob/master/SFTP.md#useful-standalone-methods)\n\n* **sftp.stringToFlags** - [`stringToFlags()`](https://github.com/mscdex/ssh2/blob/master/SFTP.md#useful-standalone-methods)\n\n### AgentProtocol\n\n#### AgentProtocol events\n\n* **identities**(< _opaque_ >request) - **(Server mode only)** The client has requested a list of public keys stored in the agent. Use `failureReply()` or `getIdentitiesReply()` to reply appropriately.\n\n* **sign**(< _opaque_ >request, < _mixed_ >pubKey, < _Buffer_ >data, < _object_ >options) - **(Server mode only)** The client has requested `data` to be signed using the key identified by `pubKey`. Use `failureReply()` or `signReply()` to reply appropriately. `options` may contain any of:\n\n * **hash** - _string_ - The explicitly desired hash to use when computing the signature. Currently if set, this may be either `'sha256'` or `'sha512'` for RSA keys.\n\n#### AgentProtocol methods\n\n* **(constructor)**(< _boolean_ >isClient) - Creates and returns a new AgentProtocol instance. `isClient` determines whether the instance operates in client or server mode.\n\n* **failureReply**(< _opaque_ >request) - _(void)_ - **(Server mode only)** Replies to the given `request` with a failure response.\n\n* **getIdentities**(< _function_ >callback) - _(void)_ - **(Client mode only)** Requests a list of public keys from the agent. `callback` is passed `(err, keys)` where `keys` is a possible array of public keys for authentication.\n\n* **getIdentitiesReply**(< _opaque_ >request, < _array_ >keys) - _(void)_ - **(Server mode only)** Responds to a identities list `request` with the given array of keys in `keys`.\n\n* **sign**(< _mixed_ >pubKey, < _Buffer_ >data, < _object_ >options, < _function_ >callback) - _(void)_ - **(Client mode only)** Requests that the agent sign `data` using the key identified by `pubKey`. `pubKey` can be any parsed (using `utils.parseKey()`) or parseable key value. `callback` is passed `(err, signature)` where `signature` is a possible _Buffer_ containing the signature for the `data`. `options` may contain any of:\n\n * **hash** - _string_ - The explicitly desired hash to use when computing the signature. Currently if set, this may be either `'sha256'` or `'sha512'` for RSA keys.\n\n* **signReply**(< _opaque_ >request, < _Buffer_ >signature) - _(void)_ - **(Server mode only)** Responds to a sign `request` with the given signature in `signature`.\n\n### BaseAgent\n\nIn order to create a custom agent, your cl","author":{"name":"Brian White","email":"mscdex@mscdex.net"},"repository":{"type":"git","url":"git+ssh://git@github.com/mscdex/ssh2.git"},"readmeFilename":"README.md","homepage":"https://github.com/mscdex/ssh2#readme","bugs":{"url":"https://github.com/mscdex/ssh2/issues"}}
+{
+ "name": "ssh2",
+ "description": "SSH2 client and server modules written in pure JavaScript for node.js",
+ "dist-tags": {
+ "latest": "1.11.0"
+ },
+ "versions": {
+ "1.11.0": {
+ "name": "ssh2",
+ "version": "1.11.0",
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "description": "SSH2 client and server modules written in pure JavaScript for node.js",
+ "main": "./lib/index.js",
+ "engines": {
+ "node": ">=10.16.0"
+ },
+ "dependencies": {
+ "asn1": "^0.2.4",
+ "bcrypt-pbkdf": "^1.0.2",
+ "cpu-features": "~0.0.4",
+ "nan": "^2.16.0"
+ },
+ "devDependencies": {
+ "@mscdex/eslint-config": "^1.1.0",
+ "eslint": "^7.0.0"
+ },
+ "optionalDependencies": {
+ "cpu-features": "~0.0.4",
+ "nan": "^2.16.0"
+ },
+ "scripts": {
+ "install": "node install.js",
+ "rebuild": "node install.js",
+ "test": "node test/test.js",
+ "lint": "eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js examples lib test",
+ "lint:fix": "npm run lint -- --fix"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://github.com/mscdex/ssh2/raw/master/LICENSE"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mscdex/ssh2.git"
+ },
+ "_resolved": "",
+ "_integrity": "",
+ "_from": "https://github.com/mscdex/ssh2/tarball/v1.11.0",
+ "bugs": {
+ "url": "https://github.com/mscdex/ssh2/issues"
+ },
+ "_id": "ssh2@1.11.0",
+ "_nodeVersion": "10.22.1",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
+ "shasum": "ce60186216971e12f6deb553dcf82322498fe2e4",
+ "tarball": "http://localhost:4260/ssh2/ssh2-1.11.0.tgz",
+ "fileCount": 159,
+ "unpackedSize": 1071730
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Brian White",
+ "email": "mscdex@mscdex.net"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mscdex/ssh2.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/mscdex/ssh2#readme",
+ "bugs": {
+ "url": "https://github.com/mscdex/ssh2/issues"
+ }
+}
diff --git a/tests/registry/npm/ssri/registry.json b/tests/registry/npm/ssri/registry.json
index ebf156847..7dddf078b 100644
--- a/tests/registry/npm/ssri/registry.json
+++ b/tests/registry/npm/ssri/registry.json
@@ -1 +1,93 @@
-{"name":"ssri","description":"Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.","dist-tags":{"latest":"10.0.6"},"versions":{"10.0.6":{"name":"ssri","version":"10.0.6","author":{"name":"GitHub Inc."},"license":"ISC","_id":"ssri@10.0.6","bugs":{"url":"https://github.com/npm/ssri/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"],"check-coverage":true},"dist":{"shasum":"a8aade2de60ba2bce8688e3fa349bad05c7dc1e5","tarball":"http://localhost:4260/ssri/ssri-10.0.6.tgz","fileCount":4,"integrity":"sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==","signatures":[{"sig":"MEUCIH0RAcuWHmyOrnF59mNHnOghRQc5pfXEyeKTuz0ADHaMAiEAzSMgV3xTvd0Hl4gQjpKKMr/niKEkH7Boonxk1iL335g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/ssri@10.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38738},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"422a99ed3c5f17abcdc5fea50add6c05dd2e1703","scripts":{"lint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","coverage":"tap","postlint":"template-oss-check","posttest":"npm run lint","prerelease":"npm t","postrelease":"npm publish","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/ssri.git","type":"git"},"_npmVersion":"10.7.0","description":"Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.","directories":{},"templateOSS":{"publish":"true","version":"4.22.0","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"22.1.0","dependencies":{"minipass":"^7.0.3"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.1","@npmcli/template-oss":"4.22.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/ssri.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/ssri#readme","bugs":{"url":"https://github.com/npm/ssri/issues"},"readme":"# ssri [![npm version](https://img.shields.io/npm/v/ssri.svg)](https://npm.im/ssri) [![license](https://img.shields.io/npm/l/ssri.svg)](https://npm.im/ssri) [![Travis](https://img.shields.io/travis/npm/ssri.svg)](https://travis-ci.org/npm/ssri) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/npm/ssri?svg=true)](https://ci.appveyor.com/project/npm/ssri) [![Coverage Status](https://coveralls.io/repos/github/npm/ssri/badge.svg?branch=latest)](https://coveralls.io/github/npm/ssri?branch=latest)\n\n[`ssri`](https://github.com/npm/ssri), short for Standard Subresource\nIntegrity, is a Node.js utility for parsing, manipulating, serializing,\ngenerating, and verifying [Subresource\nIntegrity](https://w3c.github.io/webappsec/specs/subresourceintegrity/) hashes.\n\n## Install\n\n`$ npm install --save ssri`\n\n## Table of Contents\n\n* [Example](#example)\n* [Features](#features)\n* [Contributing](#contributing)\n* [API](#api)\n * Parsing & Serializing\n * [`parse`](#parse)\n * [`stringify`](#stringify)\n * [`Integrity#concat`](#integrity-concat)\n * [`Integrity#merge`](#integrity-merge)\n * [`Integrity#toString`](#integrity-to-string)\n * [`Integrity#toJSON`](#integrity-to-json)\n * [`Integrity#match`](#integrity-match)\n * [`Integrity#pickAlgorithm`](#integrity-pick-algorithm)\n * [`Integrity#hexDigest`](#integrity-hex-digest)\n * Integrity Generation\n * [`fromHex`](#from-hex)\n * [`fromData`](#from-data)\n * [`fromStream`](#from-stream)\n * [`create`](#create)\n * Integrity Verification\n * [`checkData`](#check-data)\n * [`checkStream`](#check-stream)\n * [`integrityStream`](#integrity-stream)\n\n### Example\n\n```javascript\nconst ssri = require('ssri')\n\nconst integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'\n\n// Parsing and serializing\nconst parsed = ssri.parse(integrity)\nssri.stringify(parsed) // === integrity (works on non-Integrity objects)\nparsed.toString() // === integrity\n\n// Async stream functions\nssri.checkStream(fs.createReadStream('./my-file'), integrity).then(...)\nssri.fromStream(fs.createReadStream('./my-file')).then(sri => {\n sri.toString() === integrity\n})\nfs.createReadStream('./my-file').pipe(ssri.createCheckerStream(sri))\n\n// Sync data functions\nssri.fromData(fs.readFileSync('./my-file')) // === parsed\nssri.checkData(fs.readFileSync('./my-file'), integrity) // => 'sha512'\n```\n\n### Features\n\n* Parses and stringifies SRI strings.\n* Generates SRI strings from raw data or Streams.\n* Strict standard compliance.\n* `?foo` metadata option support.\n* Multiple entries for the same algorithm.\n* Object-based integrity hash manipulation.\n* Small footprint: no dependencies, concise implementation.\n* Full test coverage.\n* Customizable algorithm picker.\n\n### Contributing\n\nThe ssri team enthusiastically welcomes contributions and project participation!\nThere's a bunch of things you can do if you want to contribute! The [Contributor\nGuide](CONTRIBUTING.md) has all the information you need for everything from\nreporting bugs to contributing entire new features. Please don't hesitate to\njump in if you'd like to, or even ask us questions if something isn't clear.\n\n### API\n\n#### <a name=\"parse\"></a> `> ssri.parse(sri, [opts]) -> Integrity`\n\nParses `sri` into an `Integrity` data structure. `sri` can be an integrity\nstring, an `Hash`-like with `digest` and `algorithm` fields and an optional\n`options` field, or an `Integrity`-like object. The resulting object will be an\n`Integrity` instance that has this shape:\n\n```javascript\n{\n 'sha1': [{algorithm: 'sha1', digest: 'deadbeef', options: []}],\n 'sha512': [\n {algorithm: 'sha512', digest: 'c0ffee', options: []},\n {algorithm: 'sha512', digest: 'bad1dea', options: ['foo']}\n ],\n}\n```\n\nIf `opts.single` is truthy, a single `Hash` object will be returned. That is, a\nsingle object that looks like `{algorithm, digest, options}`, as opposed to a\nlarger object with multiple of these.\n\nIf `opts.strict` is truthy, the resulting object will be filtered such that\nit strictly follows the Subresource Integrity spec, throwing away any entries\nwith any invalid components. This also means a restricted set of algorithms\nwill be used -- the spec limits them to `sha256`, `sha384`, and `sha512`.\n\nStrict mode is recommended if the integrity strings are intended for use in\nbrowsers, or in other situations where strict adherence to the spec is needed.\n\n##### Example\n\n```javascript\nssri.parse('sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo') // -> Integrity object\n```\n\n#### <a name=\"stringify\"></a> `> ssri.stringify(sri, [opts]) -> String`\n\nThis function is identical to [`Integrity#toString()`](#integrity-to-string),\nexcept it can be used on _any_ object that [`parse`](#parse) can handle -- that\nis, a string, an `Hash`-like, or an `Integrity`-like.\n\nThe `opts.sep` option defines the string to use when joining multiple entries\ntogether. To be spec-compliant, this _must_ be whitespace. The default is a\nsingle space (`' '`).\n\nIf `opts.strict` is true, the integrity string will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\n// Useful for cleaning up input SRI strings:\nssri.stringify('\\n\\rsha512-foo\\n\\t\\tsha384-bar')\n// -> 'sha512-foo sha384-bar'\n\n// Hash-like: only a single entry.\nssri.stringify({\n algorithm: 'sha512',\n digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',\n options: ['foo']\n})\n// ->\n// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'\n\n// Integrity-like: full multi-entry syntax. Similar to output of `ssri.parse`\nssri.stringify({\n 'sha512': [\n {\n algorithm: 'sha512',\n digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',\n options: ['foo']\n }\n ]\n})\n// ->\n// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'\n```\n\n#### <a name=\"integrity-concat\"></a> `> Integrity#concat(otherIntegrity, [opts]) -> Integrity`\n\nConcatenates an `Integrity` object with another IntegrityLike, or an integrity\nstring.\n\nThis is functionally equivalent to concatenating the string format of both\nintegrity arguments, and calling [`ssri.parse`](#ssri-parse) on the new string.\n\nIf `opts.strict` is true, the new `Integrity` will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\n// This will combine the integrity checks for two different versions of\n// your index.js file so you can use a single integrity string and serve\n// either of these to clients, from a single `<script>` tag.\nconst desktopIntegrity = ssri.fromData(fs.readFileSync('./index.desktop.js'))\nconst mobileIntegrity = ssri.fromData(fs.readFileSync('./index.mobile.js'))\n\n// Note that browsers (and ssri) will succeed as long as ONE of the entries\n// for the *prioritized* algorithm succeeds. That is, in order for this fallback\n// to work, both desktop and mobile *must* use the same `algorithm` values.\ndesktopIntegrity.concat(mobileIntegrity)\n```\n\n#### <a name=\"integrity-merge\"></a> `> Integrity#merge(otherIntegrity, [opts])`\n\nSafely merges another IntegrityLike or integrity string into an `Integrity`\nobject.\n\nIf the other integrity value has any algorithms in common with the current\nobject, then the hash digests must match, or an error is thrown.\n\nAny new hashes will be added to the current object's set.\n\nThis is useful when an integrity value may be upgraded with a stronger\nalgorithm, you wish to prevent accidentally suppressing integrity errors by\noverwriting the expected integrity value.\n\n##### Example\n\n```javascript\nconst data = fs.readFileSync('data.txt')\n\n// integrity.txt contains 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4='\n// because we were young, and didn't realize sha1 would not last\nconst expectedIntegrity = ssri.parse(fs.readFileSync('integrity.txt', 'utf8'))\nconst match = ssri.checkData(data, expectedIntegrity, {\n algorithms: ['sha512', 'sha1']\n})\nif (!match) {\n throw new Error('data corrupted or something!')\n}\n\n// get a stronger algo!\nif (match && match.algorithm !== 'sha512') {\n const updatedIntegrity = ssri.fromData(data, { algorithms: ['sha512'] })\n expectedIntegrity.merge(updatedIntegrity)\n fs.writeFileSync('integrity.txt', expectedIntegrity.toString())\n // file now contains\n // 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4= sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg=='\n}\n```\n\n#### <a name=\"integrity-to-string\"></a> `> Integrity#toString([opts]) -> String`\n\nReturns the string representation of an `Integrity` object. All hash entries\nwill be concatenated in the string by `opts.sep`, which defaults to `' '`.\n\nIf you want to serialize an object that didn't come from an `ssri` function,\nuse [`ssri.stringify()`](#stringify).\n\nIf `opts.strict` is true, the integrity string will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\nconst integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'\n\nssri.parse(integrity).toString() === integrity\n```\n\n#### <a name=\"integrity-to-json\"></a> `> Integrity#toJSON() -> String`\n\nReturns the string representation of an `Integrity` object. All hash entries\nwill be concatenated in the string by `' '`.\n\nThis is a convenience method so you can pass an `Integrity` object directly to `JSON.stringify`.\nFor more info check out [toJSON() behavior on mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior).\n\n##### Example\n\n```javascript\nconst integrity = '\"sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo\"'\n\nJSON.stringify(ssri.parse(integrity)) === integrity\n```\n\n#### <a name=\"integrity-match\"></a> `> Integrity#match(sri, [opts]) -> Hash | false`\n\nReturns the matching (truthy) hash if `Integrity` matches the argument passed as\n`sri`, which can be anything that [`parse`](#parse) will accept. `opts` will be\npassed through to `parse` and [`pickAlgorithm()`](#integrity-pick-algorithm).\n\n##### Example\n\n```javascript\nconst integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='\n\nssri.parse(integrity).match(integrity)\n// Hash {\n// digest: '9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='\n// algorithm: 'sha512'\n// }\n\nssri.parse(integrity).match('sha1-deadbeef')\n// false\n```\n\n#### <a name=\"integrity-pick-algorithm\"></a> `> Integrity#pickAlgorithm([opts]) -> String`\n\nReturns the \"best\" algorithm from those available in the integrity object.\n\nIf `opts.pickAlgorithm` is provided, it will be passed two algorithms as\narguments. ssri will prioritize whichever of the two algorithms is returned by\nthis function. Note that the function may be called multiple times, and it\n**must** return one of the two algorithms provided. By default, ssri will make\na best-effort to pick the strongest/most reliable of the given algorithms. It\nmay intentionally deprioritize algorithms with known vulnerabilities.\n\n##### Example\n\n```javascript\nssri.parse('sha1-WEakDigEST sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1').pickAlgorithm() // sha512\n```\n\n#### <a name=\"integrity-hex-digest\"></a> `> Integrity#hexDigest() -> String`\n\n`Integrity` is assumed to be either a single-hash `Integrity` instance, or a\n`Hash` instance. Returns its `digest`, converted to a hex representation of the\nbase64 data.\n\n##### Example\n\n```javascript\nssri.parse('sha1-deadbeef').hexDigest() // '75e69d6de79f'\n```\n\n#### <a name=\"from-hex\"></a> `> ssri.fromHex(hexDigest, algorithm, [opts]) -> Integrity`\n\nCreates an `Integrity` object with a single entry, based on a hex-formatted\nhash. This is a utility function to help convert existing shasums to the\nIntegrity format, and is roughly equivalent to something like:\n\n```javascript\nalgorithm + '-' + Buffer.from(hexDigest, 'hex').toString('base64')\n```\n\n`opts.options` may optionally be passed in: it must be an array of option\nstrings that will be added to all generated integrity hashes generated by\n`fromData`. This is a loosely-specified feature of SRIs, and currently has no\nspecified semantics besides being `?`-separated. Use at your own risk, and\nprobably avoid if your integrity strings are meant to be used with browsers.\n\nIf `opts.strict` is true, the integrity object will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\nIf `opts.single` is true, a single `Hash` object will be returned.\n\n##### Example\n\n```javascript\nssri.fromHex('75e69d6de79f', 'sha1').toString() // 'sha1-deadbeef'\n```\n\n#### <a name=\"from-data\"></a> `> ssri.fromData(data, [opts]) -> Integrity`\n\nCreates an `Integrity` object from either string or `Buffer` data, calculating\nall the requested hashes and adding any specified options to the object.\n\n`opts.algorithms` determines which algorithms to generate hashes for. All\nresults will be included in a single `Integrity` object. The default value for\n`opts.algorithms` is `['sha512']`. All algorithm strings must be hashes listed\nin `crypto.getHashes()` for the host Node.js platform.\n\n`opts.options` may optionally be passed in: it must be an array of option\nstrings that will be added to all generated integrity hashes generated by\n`fromData`. This is a loosely-specified feature of SRIs, and currently has no\nspecified semantics besides being `?`-separated. Use at your own risk, and\nprobably avoid if your integrity strings are meant to be used with browsers.\n\nIf `opts.strict` is true, the integrity object will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\nconst integrityObj = ssri.fromData('foobarbaz', {\n algorithms: ['sha256', 'sha384', 'sha512']\n})\nintegrity.toString('\\n')\n// ->\n// sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0=\n// sha384-irnCxQ0CfQhYGlVAUdwTPC9bF3+YWLxlaDGM4xbYminxpbXEq+D+2GCEBTxcjES9\n// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==\n```\n\n#### <a name=\"from-stream\"></a> `> ssri.fromStream(stream, [opts]) -> Promise<Integrity>`\n\nReturns a Promise of an Integrity object calculated by reading data from\na given `stream`.\n\nIt accepts both `opts.algorithms` and `opts.options`, which are documented as\npart of [`ssri.fromData`](#from-data).\n\nAdditionally, `opts.Promise` may be passed in to inject a Promise library of\nchoice. By default, ssri will use Node's built-in Promises.\n\nIf `opts.strict` is true, the integrity object will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\nssri.fromStream(fs.createReadStream('index.js'), {\n algorithms: ['sha1', 'sha512']\n}).then(integrity => {\n return ssri.checkStream(fs.createReadStream('index.js'), integrity)\n}) // succeeds\n```\n\n#### <a name=\"create\"></a> `> ssri.create([opts]) -> <Hash>`\n\nReturns a Hash object with `update(<Buffer or string>[,enc])` and `digest()` methods.\n\n\nThe Hash object provides the same methods as [crypto class Hash](https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html#crypto_class_hash).\n`digest()` accepts no arguments and returns an Integrity object calculated by reading data from\ncalls to update.\n\nIt accepts both `opts.algorithms` and `opts.options`, which are documented as\npart of [`ssri.fromData`](#from-data).\n\nIf `opts.strict` is true, the integrity object will be created using strict\nparsing rules. See [`ssri.parse`](#parse).\n\n##### Example\n\n```javascript\nconst integrity = ssri.create().update('foobarbaz').digest()\nintegrity.toString()\n// ->\n// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==\n```\n\n#### <a name=\"check-data\"></a> `> ssri.checkData(data, sri, [opts]) -> Hash|false`\n\nVerifies `data` integrity against an `sri` argument. `data` may be either a\n`String` or a `Buffer`, and `sri` can be any subresource integrity\nrepresentation that [`ssri.parse`](#parse) can handle.\n\nIf verification succeeds, `checkData` will return the name of the algorithm that\nwas used for verification (a truthy value). Otherwise, it will return `false`.\n\nIf `opts.pickAlgorithm` is provided, it will be used by\n[`Integrity#pickAlgorithm`](#integrity-pick-algorithm) when deciding which of\nthe available digests to match against.\n\nIf `opts.error` is true, and verification fails, `checkData` will throw either\nan `EBADSIZE` or an `EINTEGRITY` error, instead of just returning false.\n\n##### Example\n\n```javascript\nconst data = fs.readFileSync('index.js')\nssri.checkData(data, ssri.fromData(data)) // -> 'sha512'\nssri.checkData(data, 'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0')\nssri.checkData(data, 'sha1-BaDDigEST') // -> false\nssri.checkData(data, 'sha1-BaDDigEST', {error: true}) // -> Error! EINTEGRITY\n```\n\n#### <a name=\"check-stream\"></a> `> ssri.checkStream(stream, sri, [opts]) -> Promise<Hash>`\n\nVerifies the contents of `stream` against an `sri` argument. `stream` will be\nconsumed in its entirety by this process. `sri` can be any subresource integrity\nrepresentation that [`ssri.parse`](#parse) can handle.\n\n`checkStream` will return a Promise that either resolves to the\n`Hash` that succeeded verification, or, if the verification fails\nor an error happens with `stream`, the Promise will be rejected.\n\nIf the Promise is rejected because verification failed, the returned error will\nhave `err.code` as `EINTEGRITY`.\n\nIf `opts.size` is given, it will be matched against the stream size. An error\nwith `err.code` `EBADSIZE` will be returned by a rejection if the expected size\nand actual size fail to match.\n\nIf `opts.pickAlgorithm` is provided, it will be used by\n[`Integrity#pickAlgorithm`](#integrity-pick-algorithm) when deciding which of\nthe available digests to match against.\n\n##### Example\n\n```javascript\nconst integrity = ssri.fromData(fs.readFileSync('index.js'))\n\nssri.checkStream(\n fs.createReadStream('index.js'),\n integrity\n)\n// ->\n// Promise<{\n// algorithm: 'sha512',\n// digest: 'sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1'\n// }>\n\nssri.checkStream(\n fs.createReadStream('index.js'),\n 'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0'\n) // -> Promise<Hash>\n\nssri.checkStream(\n fs.createReadStream('index.js'),\n 'sha1-BaDDigEST'\n) // -> Promise<Error<{code: 'EINTEGRITY'}>>\n```\n\n#### <a name=\"integrity-stream\"></a> `> integrityStream([opts]) -> IntegrityStream`\n\nReturns a `Transform` stream that data can be piped through in order to generate\nand optionally check data integrity for piped data. When the stream completes\nsuccessfully, it emits `size` and `integrity` events, containing the total\nnumber of bytes processed and a calculated `Integrity` instance based on stream\ndata, respectively.\n\nIf `opts.algorithms` is passed in, the listed algorithms will be calculated when\ngenerating the final `Integrity` instance. The default is `['sha512']`.\n\nIf `opts.single` is passed in, a single `Hash` instance will be returned.\n\nIf `opts.integrity` is passed in, it should be an `integrity` value understood\nby [`parse`](#parse) that the stream will check the data against. If\nverification succeeds, the integrity stream will emit a `verified` event whose\nvalue is a single `Hash` object that is the one that succeeded verification. If\nverification fails, the stream will error with an `EINTEGRITY` error code.\n\nIf `opts.size` is given, it will be matched against the stream size. An error\nwith `err.code` `EBADSIZE` will be emitted by the stream if the expected size\nand actual size fail to match.\n\nIf `opts.pickAlgorithm` is provided, it will be passed two algorithms as\narguments. ssri will prioritize whichever of the two algorithms is returned by\nthis function. Note that the function may be called multiple times, and it\n**must** return one of the two algorithms provided. By default, ssri will make\na best-effort to pick the strongest/most reliable of the given algorithms. It\nmay intentionally deprioritize algorithms with known vulnerabilities.\n\n##### Example\n\n```javascript\nconst integrity = ssri.fromData(fs.readFileSync('index.js'))\nfs.createReadStream('index.js')\n.pipe(ssri.integrityStream({integrity}))\n```\n","readmeFilename":"README.md"}
+{
+ "name": "ssri",
+ "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.",
+ "dist-tags": {
+ "latest": "10.0.6"
+ },
+ "versions": {
+ "10.0.6": {
+ "name": "ssri",
+ "version": "10.0.6",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "ssri@10.0.6",
+ "bugs": {
+ "url": "https://github.com/npm/ssri/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "check-coverage": true
+ },
+ "dist": {
+ "shasum": "a8aade2de60ba2bce8688e3fa349bad05c7dc1e5",
+ "tarball": "http://localhost:4260/ssri/ssri-10.0.6.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/ssri@10.0.6",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 38738
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "422a99ed3c5f17abcdc5fea50add6c05dd2e1703",
+ "scripts": {
+ "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "coverage": "tap",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "prerelease": "npm t",
+ "postrelease": "npm publish",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/ssri.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.7.0",
+ "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.22.0",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "22.1.0",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.1",
+ "@npmcli/template-oss": "4.22.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/ssri.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/ssri#readme",
+ "bugs": {
+ "url": "https://github.com/npm/ssri/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/string-width/registry.json b/tests/registry/npm/string-width/registry.json
index ed3ab97b4..700db683b 100644
--- a/tests/registry/npm/string-width/registry.json
+++ b/tests/registry/npm/string-width/registry.json
@@ -1 +1,170 @@
-{"name":"string-width","description":"Get the visual width of a string - the number of columns required to display it","dist-tags":{"latest":"5.1.2","version4":"4.2.3"},"versions":{"2.1.1":{"name":"string-width","version":"2.1.1","description":"Get the visual width of a string - the number of columns required to display it","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/string-width.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=4"},"scripts":{"test":"xo && ava"},"files":["index.js"],"dependencies":{"is-fullwidth-code-point":"^2.0.0","strip-ansi":"^4.0.0"},"devDependencies":{"ava":"*","xo":"*"},"gitHead":"74d8d552b465692790c41169b123409669d41079","bugs":{"url":"https://github.com/sindresorhus/string-width/issues"},"_id":"string-width@2.1.1","_npmVersion":"5.0.0","_nodeVersion":"8.0.0","dist":{"integrity":"sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==","shasum":"ab93f27a8dc13d28cac815c462143a6d9012ae9e","tarball":"http://localhost:4260/string-width/string-width-2.1.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0QEscnKyvRpCxyjflFgll2NLG0pHj7WTPBjB5r0nYJwIgNyVWMoOnZbXUI6QFF0f4gUgvOUU8VcxH2n0kkdADykA="}]},"directories":{}},"4.2.3":{"name":"string-width","version":"4.2.3","description":"Get the visual width of a string - the number of columns required to display it","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/string-width.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"emoji-regex":"^8.0.0","is-fullwidth-code-point":"^3.0.0","strip-ansi":"^6.0.1"},"devDependencies":{"ava":"^1.4.1","tsd":"^0.7.1","xo":"^0.24.0"},"readme":"# string-width\n\n> Get the visual width of a string - the number of columns required to display it\n\nSome Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width.\n\nUseful to be able to measure the actual width of command-line output.\n\n\n## Install\n\n```\n$ npm install string-width\n```\n\n\n## Usage\n\n```js\nconst stringWidth = require('string-width');\n\nstringWidth('a');\n//=> 1\n\nstringWidth('古');\n//=> 2\n\nstringWidth('\\u001B[1m古\\u001B[22m');\n//=> 2\n```\n\n\n## Related\n\n- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module\n- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string\n- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string\n\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-string-width?utm_source=npm-string-width&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","readmeFilename":"readme.md","gitHead":"e7a2755c834246c59a4cc5de9471bef2d531a6b1","bugs":{"url":"https://github.com/sindresorhus/string-width/issues"},"_id":"string-width@4.2.3","_nodeVersion":"16.9.1","_npmVersion":"7.5.4","dist":{"integrity":"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==","shasum":"269c7117d27b05ad2e536830a8ec895ef9c6d010","tarball":"http://localhost:4260/string-width/string-width-4.2.3.tgz","fileCount":5,"unpackedSize":5161,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdE8iSHW3j8YsH6u/KbZmvj9DtpGTXHmhmmp6oeUG6/AIge8jaI1Qk/Z/GED/SrwJ+yNQAEzkZ28FrbwLFqeAqdSg="}]},"directories":{},"_hasShrinkwrap":false},"5.1.2":{"name":"string-width","version":"5.1.2","description":"Get the visual width of a string - the number of columns required to display it","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/string-width.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","engines":{"node":">=12"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"eastasianwidth":"^0.2.0","emoji-regex":"^9.2.2","strip-ansi":"^7.0.1"},"devDependencies":{"ava":"^3.15.0","tsd":"^0.14.0","xo":"^0.38.2"},"types":"./index.d.ts","gitHead":"9f90691968ad356c807aaad1a5ed98d795749932","bugs":{"url":"https://github.com/sindresorhus/string-width/issues"},"_id":"string-width@5.1.2","_nodeVersion":"12.22.1","_npmVersion":"8.3.2","dist":{"integrity":"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==","shasum":"14f8daec6d81e7221d2a357e668cab73bdbca794","tarball":"http://localhost:4260/string-width/string-width-5.1.2.tgz","fileCount":5,"unpackedSize":5781,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiHIYtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqVLA/+M/8rKbhdnMv4nDBxBiwykx9T/GKuPldo2n9HpmPoqdaYbsUR\r\nKqB4g+cLAbMdr3kSMkt82Ou2Ceb8b23wBVNZbzYRQS+OKzzQKwwgi8PggU0t\r\niAm9V1k14zoV9r+hXKAG0MTp7+hEoqjjVYBEiz+z7TL5W0XR4c5iHBjUgNfg\r\n3G3flpdODgSZ4c5wgcODfSbEly/8GAh8hKzNNdYqgVVXLdPwzag4ArCP64TN\r\nBry4KwaNEguk3bqK0BGM4IZc3iz4bkZILEb5FgTUZuO2HbkBkNg0TD7rQz57\r\nTzzjnNJRzzF15NNijEVuuWj7BJBzEx7SUeZ6rBQbRAtMpZDgnYMjfnm1UOvs\r\nRLRaJt6phv/mYtLNVjW/Q5k8QAZHZr7aVAcOH314OFo1TopJwYfZfd8HdtVo\r\nYT2smUy2iVMs3KbHKQ+JKlnlA5u+x/0jv2eD4BvY1F2j86JHI8XoLT3JwYDS\r\nfZogtRhjGClSSyXyhihqkV/DlfeQxglZ7QFkAWlNt8xhUupzZ2fezqOX+15M\r\nimEdQ67SYm9akBBvxsbLvWaaMPlIdJW9fIspHwOKHctD00qjPmcwcJFKJAmt\r\noETedpGcdQHFko/wFjqSIeHThKrodnbWH5s/7C8c0Eie4Ran/NSihB4GSFgx\r\nlXX/hq0UhZhoc6EmR3kBXOealyRvPm0sA14=\r\n=ZoNR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFh4IjLA+aBQo7r/VZcidTSCApNLobLlmjMKnBREpog9AiEApke6FV5/3E44vAJKBbdIZ832/aqqaNMi8TFY+Px6Rwc="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# string-width\n\n> Get the visual width of a string - the number of columns required to display it\n\nSome Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width.\n\nUseful to be able to measure the actual width of command-line output.\n\n## Install\n\n```\n$ npm install string-width\n```\n\n## Usage\n\n```js\nimport stringWidth from 'string-width';\n\nstringWidth('a');\n//=> 1\n\nstringWidth('古');\n//=> 2\n\nstringWidth('\\u001B[1m古\\u001B[22m');\n//=> 2\n```\n\n## API\n\n### stringWidth(string, options?)\n\n#### string\n\nType: `string`\n\nThe string to be counted.\n\n#### options\n\nType: `object`\n\n##### ambiguousIsNarrow\n\nType: `boolean`\\\nDefault: `false`\n\nCount [ambiguous width characters](https://www.unicode.org/reports/tr11/#Ambiguous) as having narrow width (count of 1) instead of wide width (count of 2).\n\n## Related\n\n- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module\n- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string\n- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-string-width?utm_source=npm-string-width&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","homepage":"https://github.com/sindresorhus/string-width#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/string-width.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/string-width/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "string-width",
+ "description": "Get the visual width of a string - the number of columns required to display it",
+ "dist-tags": {
+ "latest": "5.1.2",
+ "version4": "4.2.3"
+ },
+ "versions": {
+ "2.1.1": {
+ "name": "string-width",
+ "version": "2.1.1",
+ "description": "Get the visual width of a string - the number of columns required to display it",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/string-width.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "gitHead": "74d8d552b465692790c41169b123409669d41079",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/string-width/issues"
+ },
+ "_id": "string-width@2.1.1",
+ "_npmVersion": "5.0.0",
+ "_nodeVersion": "8.0.0",
+ "dist": {
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "shasum": "ab93f27a8dc13d28cac815c462143a6d9012ae9e",
+ "tarball": "http://localhost:4260/string-width/string-width-2.1.1.tgz"
+ },
+ "directories": {}
+ },
+ "4.2.3": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "description": "Get the visual width of a string - the number of columns required to display it",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/string-width.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.1",
+ "xo": "^0.24.0"
+ },
+ "readme": "# string-width\n\n> Get the visual width of a string - the number of columns required to display it\n\nSome Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width.\n\nUseful to be able to measure the actual width of command-line output.\n\n\n## Install\n\n```\n$ npm install string-width\n```\n\n\n## Usage\n\n```js\nconst stringWidth = require('string-width');\n\nstringWidth('a');\n//=> 1\n\nstringWidth('古');\n//=> 2\n\nstringWidth('\\u001B[1m古\\u001B[22m');\n//=> 2\n```\n\n\n## Related\n\n- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module\n- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string\n- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string\n\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-string-width?utm_source=npm-string-width&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n",
+ "readmeFilename": "readme.md",
+ "gitHead": "e7a2755c834246c59a4cc5de9471bef2d531a6b1",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/string-width/issues"
+ },
+ "_id": "string-width@4.2.3",
+ "_nodeVersion": "16.9.1",
+ "_npmVersion": "7.5.4",
+ "dist": {
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "shasum": "269c7117d27b05ad2e536830a8ec895ef9c6d010",
+ "tarball": "http://localhost:4260/string-width/string-width-4.2.3.tgz",
+ "fileCount": 5,
+ "unpackedSize": 5161
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "5.1.2": {
+ "name": "string-width",
+ "version": "5.1.2",
+ "description": "Get the visual width of a string - the number of columns required to display it",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/string-width.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "type": "module",
+ "exports": "./index.js",
+ "engines": {
+ "node": ">=12"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "devDependencies": {
+ "ava": "^3.15.0",
+ "tsd": "^0.14.0",
+ "xo": "^0.38.2"
+ },
+ "types": "./index.d.ts",
+ "gitHead": "9f90691968ad356c807aaad1a5ed98d795749932",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/string-width/issues"
+ },
+ "_id": "string-width@5.1.2",
+ "_nodeVersion": "12.22.1",
+ "_npmVersion": "8.3.2",
+ "dist": {
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "shasum": "14f8daec6d81e7221d2a357e668cab73bdbca794",
+ "tarball": "http://localhost:4260/string-width/string-width-5.1.2.tgz",
+ "fileCount": 5,
+ "unpackedSize": 5781
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/sindresorhus/string-width#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/string-width.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/string-width/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/strip-ansi/registry.json b/tests/registry/npm/strip-ansi/registry.json
index 73f190e0e..b50a2b638 100644
--- a/tests/registry/npm/strip-ansi/registry.json
+++ b/tests/registry/npm/strip-ansi/registry.json
@@ -1 +1,166 @@
-{"name":"strip-ansi","description":"Strip ANSI escape codes from a string","dist-tags":{"latest":"7.0.1","version6":"6.0.1"},"versions":{"4.0.0":{"name":"strip-ansi","version":"4.0.0","description":"Strip ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/strip-ansi.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=4"},"scripts":{"test":"xo && ava"},"files":["index.js"],"dependencies":{"ansi-regex":"^3.0.0"},"devDependencies":{"ava":"*","xo":"*"},"gitHead":"c299056a42b31d7a479d6a89b41318b2a2462cc7","bugs":{"url":"https://github.com/chalk/strip-ansi/issues"},"_id":"strip-ansi@4.0.0","_shasum":"a8479022eb1ac368a871389b635262c505ee368f","_from":".","_npmVersion":"2.15.11","_nodeVersion":"4.8.3","dist":{"shasum":"a8479022eb1ac368a871389b635262c505ee368f","tarball":"http://localhost:4260/strip-ansi/strip-ansi-4.0.0.tgz","integrity":"sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCHb1Csy8k35kjhKC6q92oiFt2kuQV/8WevQ9+AO1edAIgYgwiSmWPF1eN76CL+Wfe3JZrRsrG1KfL3LkykZgVr1s="}]},"directories":{}},"7.0.1":{"name":"strip-ansi","version":"7.0.1","description":"Strip ANSI escape codes from a string","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/strip-ansi.git"},"funding":"https://github.com/chalk/strip-ansi?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","engines":{"node":">=12"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"ansi-regex":"^6.0.1"},"devDependencies":{"ava":"^3.15.0","tsd":"^0.17.0","xo":"^0.44.0"},"gitHead":"dd40fa7ced678f14dfb43eb9b62b8e7313fb7011","bugs":{"url":"https://github.com/chalk/strip-ansi/issues"},"_id":"strip-ansi@7.0.1","_nodeVersion":"14.17.5","_npmVersion":"7.20.3","dist":{"integrity":"sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==","shasum":"61740a08ce36b61e50e65653f07060d000975fb2","tarball":"http://localhost:4260/strip-ansi/strip-ansi-7.0.1.tgz","fileCount":5,"unpackedSize":4090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh28O/CRA9TVsSAnZWagAAK+QP/R0BPwbqYKm2cKZ+Cus/\nkbU1maxjoVw7zikegwh/3jUfVA81v5YaxfkvrAq0Z+C0NXC1iJ3zlVCXTzDi\n0jcnNH6n4nV7P6PHYRuK+opNRD1nrsr/8oyowR8NkWPxJVrwaY2ytc8t+qYv\n+gKWENM7MRdcLRYlKI3PQ+hD0ViiZv0OYNqR3AmVOWRNAqSN5OprG3Q3piNM\n42mS2bdT5APpY8H2JfT4c4C5EVLXmJS5mAHuFFY+PP1/h4gnTXBLnWCePbpO\nXN5qT+bNCocXUt7WI2+gf7IL1QY9G+n2NbPMH/xBP1+pOYY8jBZ4kU64obvW\n/7YcHKjoFukd/Rq3Ud2Soj75GvABnJ6VKfZhhMLOq2n4J3wR5lFfRcnYNpNG\nEhXbQHr9C0bjeW0obOGy3ZP5RL3gm9G2h0N1C9tTkxM9MsqlBw9Wn1o3x3cd\ngBJnPHwJTm/X/PmOvFRsbf2/CykAZMYjxkNlqdV1YrJLeYYu4ZWbkxThPWu3\nSKek7ChwkIPCeOVg6Hhqd76CXbndzjNTxT4eb5/lnQypALG680yB/AVFdRlI\no+M7eP8z5FF8i0BFV2bU6+b6ldsLUzBAlxBJyo7BuCOX5XSJEHExKItV1XwW\ncVDenzuNgOrS5t2wbE9jH/8pinueBAJllC1bi6CGBvR8jTSlWhabkJkuEnse\n6q5t\r\n=C27g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDn4rHfbYwQwEPLxQRIm4QfxT9rWZDiINZP0MqM6LICKgIhAJTz8zQ3KFbr1ayTgxAO2X4LKInMfqQutoaHj2sTNW0W"}]},"directories":{},"_hasShrinkwrap":false},"6.0.1":{"name":"strip-ansi","version":"6.0.1","description":"Strip ANSI escape codes from a string","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/strip-ansi.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava && tsd"},"dependencies":{"ansi-regex":"^5.0.1"},"devDependencies":{"ava":"^2.4.0","tsd":"^0.10.0","xo":"^0.25.3"},"readme":"# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)\n\n> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string\n\n\n## Install\n\n```\n$ npm install strip-ansi\n```\n\n\n## Usage\n\n```js\nconst stripAnsi = require('strip-ansi');\n\nstripAnsi('\\u001B[4mUnicorn\\u001B[0m');\n//=> 'Unicorn'\n\nstripAnsi('\\u001B]8;;https://github.com\\u0007Click\\u001B]8;;\\u0007');\n//=> 'Click'\n```\n\n\n## strip-ansi for enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of strip-ansi and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-strip-ansi?utm_source=npm-strip-ansi&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n\n## Related\n\n- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module\n- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Streaming version of this module\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n","readmeFilename":"readme.md","gitHead":"59533da99981f9d550de1ae0eb9d1a93c2383be3","bugs":{"url":"https://github.com/chalk/strip-ansi/issues"},"_id":"strip-ansi@6.0.1","_nodeVersion":"16.9.1","_npmVersion":"7.5.4","dist":{"integrity":"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==","shasum":"9e26c63d30f53443e9489495b2105d37b67a85d9","tarball":"http://localhost:4260/strip-ansi/strip-ansi-6.0.1.tgz","fileCount":5,"unpackedSize":4029,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEIaIvQJAMRlSerQ8cuHIzWxWLJPS6LkkF/9tMpiAXTvAiBY3tMFoj8tB0mc3dm7Th97E9p88NfZfjOdr/HKu8apLw=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"repository":{"type":"git","url":"git+https://github.com/chalk/strip-ansi.git"},"homepage":"https://github.com/chalk/strip-ansi#readme","bugs":{"url":"https://github.com/chalk/strip-ansi/issues"},"license":"MIT","readmeFilename":""}
+{
+ "name": "strip-ansi",
+ "description": "Strip ANSI escape codes from a string",
+ "dist-tags": {
+ "latest": "7.0.1",
+ "version6": "6.0.1"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "strip-ansi",
+ "version": "4.0.0",
+ "description": "Strip ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/strip-ansi.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "gitHead": "c299056a42b31d7a479d6a89b41318b2a2462cc7",
+ "bugs": {
+ "url": "https://github.com/chalk/strip-ansi/issues"
+ },
+ "_id": "strip-ansi@4.0.0",
+ "_shasum": "a8479022eb1ac368a871389b635262c505ee368f",
+ "_from": ".",
+ "_npmVersion": "2.15.11",
+ "_nodeVersion": "4.8.3",
+ "dist": {
+ "shasum": "a8479022eb1ac368a871389b635262c505ee368f",
+ "tarball": "http://localhost:4260/strip-ansi/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="
+ },
+ "directories": {}
+ },
+ "7.0.1": {
+ "name": "strip-ansi",
+ "version": "7.0.1",
+ "description": "Strip ANSI escape codes from a string",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/strip-ansi.git"
+ },
+ "funding": "https://github.com/chalk/strip-ansi?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "type": "module",
+ "exports": "./index.js",
+ "engines": {
+ "node": ">=12"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "devDependencies": {
+ "ava": "^3.15.0",
+ "tsd": "^0.17.0",
+ "xo": "^0.44.0"
+ },
+ "gitHead": "dd40fa7ced678f14dfb43eb9b62b8e7313fb7011",
+ "bugs": {
+ "url": "https://github.com/chalk/strip-ansi/issues"
+ },
+ "_id": "strip-ansi@7.0.1",
+ "_nodeVersion": "14.17.5",
+ "_npmVersion": "7.20.3",
+ "dist": {
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "shasum": "61740a08ce36b61e50e65653f07060d000975fb2",
+ "tarball": "http://localhost:4260/strip-ansi/strip-ansi-7.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4090
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "6.0.1": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "description": "Strip ANSI escape codes from a string",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/strip-ansi.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "tsd": "^0.10.0",
+ "xo": "^0.25.3"
+ },
+ "readme": "# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)\n\n> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string\n\n\n## Install\n\n```\n$ npm install strip-ansi\n```\n\n\n## Usage\n\n```js\nconst stripAnsi = require('strip-ansi');\n\nstripAnsi('\\u001B[4mUnicorn\\u001B[0m');\n//=> 'Unicorn'\n\nstripAnsi('\\u001B]8;;https://github.com\\u0007Click\\u001B]8;;\\u0007');\n//=> 'Click'\n```\n\n\n## strip-ansi for enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of strip-ansi and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-strip-ansi?utm_source=npm-strip-ansi&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n\n## Related\n\n- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module\n- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Streaming version of this module\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n",
+ "readmeFilename": "readme.md",
+ "gitHead": "59533da99981f9d550de1ae0eb9d1a93c2383be3",
+ "bugs": {
+ "url": "https://github.com/chalk/strip-ansi/issues"
+ },
+ "_id": "strip-ansi@6.0.1",
+ "_nodeVersion": "16.9.1",
+ "_npmVersion": "7.5.4",
+ "dist": {
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "shasum": "9e26c63d30f53443e9489495b2105d37b67a85d9",
+ "tarball": "http://localhost:4260/strip-ansi/strip-ansi-6.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 4029
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/strip-ansi.git"
+ },
+ "homepage": "https://github.com/chalk/strip-ansi#readme",
+ "bugs": {
+ "url": "https://github.com/chalk/strip-ansi/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": ""
+}
diff --git a/tests/registry/npm/strip-final-newline/registry.json b/tests/registry/npm/strip-final-newline/registry.json
index df4b23739..a6416b010 100644
--- a/tests/registry/npm/strip-final-newline/registry.json
+++ b/tests/registry/npm/strip-final-newline/registry.json
@@ -1 +1,65 @@
-{"name":"strip-final-newline","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"strip-final-newline","version":"2.0.0","description":"Strip the final newline character from a string/buffer","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/strip-final-newline.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=6"},"scripts":{"test":"xo && ava"},"devDependencies":{"ava":"^0.25.0","xo":"^0.23.0"},"gitHead":"51c93d6c8683d9fd1cacdb32f2afebac9a1155a1","bugs":{"url":"https://github.com/sindresorhus/strip-final-newline/issues"},"_id":"strip-final-newline@2.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","dist":{"integrity":"sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==","shasum":"89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad","tarball":"http://localhost:4260/strip-final-newline/strip-final-newline-2.0.0.tgz","fileCount":4,"unpackedSize":3046,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb1XUbCRA9TVsSAnZWagAADe4QAIKfZKKn8CFHig0M8lfl\nZWkRAV+2dJAbhILvIrrCYcIZC3A8ICj5GwY5ujeKev8hqkxDe+VfRQRylDTn\nUXCLYMbpV+197qpQb7X6Wdu8ISfIE/zQpBqbGReK/ddJKFHQaIIRG0VWSqWm\nP6R0ICgQPAbMBZ8nYjBjRNvgiseqMwlyxXj1hNKuAR404dGDVIhSzwmg4vku\nmp4FOCDptmFvA/mSzOE/Ochwcdz2wQd6PLtHmCIHzLEvl2z8J4Qaagxwi8yn\neZtQs3B8xtNCKaXOZQYcOMAqZxC4dMGzIEqW3CX9Me9y2p1lHbws55uvNVcX\nHh88Y6/05jr6L6N19ZULpPv9bb5FUcHAOHZFvLhhAl9eQ2WxkZV0IYub5QT7\ngHfcTadB8Mqmw0y58qDwomMLcOXVTwhQYi22OnjTg8pIRq+bfHJzOSgnK7Aa\n464iiikCjO7hG9OfPlpiWdibmFzj8WEsEkzMs6Zeb3uMw6fS8UXTkYLQPzoc\nEtAtOx6PtyKg5Ajl4xlIt4cA24hzsnJs6lJOD89Pd+VIJwihKltOgvOtPN3q\nQ4d2o7S/Ea+e4wIPs6ls4ZWUs5vB7TRQWfrOAeANGxuUSWT+7foTMFBSpOXe\nvxVGokKs1tlzCcbGvew1ZIe+b7RcDbSBr1RwZEo9U41ETveKELS33/Y7oeeL\n2j7u\r\n=W7iG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUXZVFTxzUEpaEA+kyMDOgCbSmNMZnjYfafIwLWnwN6AiEA+mTwVnuB99UwLZ8AhO9YiC+QgZ5iqZjZEYAk2thqntE="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Strip the final newline character from a string/buffer","homepage":"https://github.com/sindresorhus/strip-final-newline#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/strip-final-newline.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/strip-final-newline/issues"},"license":"MIT","readme":"# strip-final-newline\n\n> Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from a string/buffer\n\nCan be useful when parsing the output of, for example, `ChildProcess#execFile`, as [binaries usually output a newline at the end](https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline). Normally, you would use `stdout.trim()`, but that would also remove newlines at the start and whitespace.\n\n## Install\n\n```\n$ npm install strip-final-newline\n```\n\n## Usage\n\n```js\nimport stripFinalNewline from 'strip-final-newline';\n\nstripFinalNewline('foo\\nbar\\n\\n');\n//=> 'foo\\nbar\\n'\n\nstripFinalNewline(Buffer.from('foo\\nbar\\n\\n')).toString();\n//=> 'foo\\nbar\\n'\n```\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-strip-eof?utm_source=npm-strip-eof&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n","readmeFilename":"readme.md"}
+{
+ "name": "strip-final-newline",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "strip-final-newline",
+ "version": "2.0.0",
+ "description": "Strip the final newline character from a string/buffer",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/strip-final-newline.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "devDependencies": {
+ "ava": "^0.25.0",
+ "xo": "^0.23.0"
+ },
+ "gitHead": "51c93d6c8683d9fd1cacdb32f2afebac9a1155a1",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/strip-final-newline/issues"
+ },
+ "_id": "strip-final-newline@2.0.0",
+ "_npmVersion": "6.4.1",
+ "_nodeVersion": "10.12.0",
+ "dist": {
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "shasum": "89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad",
+ "tarball": "http://localhost:4260/strip-final-newline/strip-final-newline-2.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 3046
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Strip the final newline character from a string/buffer",
+ "homepage": "https://github.com/sindresorhus/strip-final-newline#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/strip-final-newline.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/strip-final-newline/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/supports-color/registry.json b/tests/registry/npm/supports-color/registry.json
index 5a2d77a0a..909165976 100644
--- a/tests/registry/npm/supports-color/registry.json
+++ b/tests/registry/npm/supports-color/registry.json
@@ -1 +1,70 @@
-{"name":"supports-color","description":"Detect whether a terminal supports color","dist-tags":{"latest":"7.2.0"},"versions":{"7.2.0":{"name":"supports-color","version":"7.2.0","description":"Detect whether a terminal supports color","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/supports-color.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && ava"},"dependencies":{"has-flag":"^4.0.0"},"devDependencies":{"ava":"^1.4.1","import-fresh":"^3.0.0","xo":"^0.24.0"},"browser":"browser.js","gitHead":"c5edf46896d1fc1826cb1183a60d61eecb65d749","bugs":{"url":"https://github.com/chalk/supports-color/issues"},"_id":"supports-color@7.2.0","_nodeVersion":"12.18.2","_npmVersion":"6.14.7","dist":{"integrity":"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==","shasum":"1b7dcdcb32b8138801b3e478ba6a51caa89648da","tarball":"http://localhost:4260/supports-color/supports-color-7.2.0.tgz","fileCount":5,"unpackedSize":7035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfSOfPCRA9TVsSAnZWagAA1JEQAKKOOmIj0Pn5/XIGvNlg\nBR4gMIGAAlPuSAJAA7lZQukqIbZxtkepHkTYc0hOR8VIW0R8kr9fuHjlqv5n\n/xt6fGCvmOfzty0wcuuudsxtp710zt3XDKKoTTyiFZxowVldF/9B6hGuagXU\nWV96BUo9o72dfQB/70q9ulPAYqqtotOkO0WhP5/Nom0hZ9htDHTRkDkHnUsF\nAaxNAxGxOORNj2yo/KYjKf9H9g18YJcybhk65MWOA4w5M8H6gAb/qbEo0wTI\nxmvtuZClK8OrIEqbkC2y7W8EGS4Tq0vxCe0z8xaT44sm169+8SwMI4NPEz+B\ntCsKmFHtidQ5Gb3svu508fuaBT0Hjspfd3FA7VfiwLa9/pP7I071+KsXxv9W\nkaMIF0PL0LCx6vlwH15IkRiX1ESJcuF39zKMxRV9W2i9x65LRHU0d4G4r4ND\nBv2j2EvbeE0A2Ec83QLN/YCL+mFxrQsRj4cZtzAtzczk2qHSPD8R4mvaVLAQ\nzzxzJPZ6baYBCXsXhNy/dWLwN+C3DnMZiQPJQHirlNMsfNO0ZNtVEEU/E/VU\nMzzoJ97fZx+tkMB3atmxhM3Kcy6yM0EYqlrsQfR4WLmnD0QXogaQBWUjQpDW\ns/x0bBz693U6LoeLaZtQ0XebdwtRnEmLpY2eu0b4mgDYaJPrlmaQH3SNlor6\nwx3o\r\n=bmle\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE0VQZExbPCN/unr9MvTQXP8sE2Dc3/XaR75ek8UW/PdAiBAcA235EKWMIT6eyE5i6OIMFXIX21HdO+KikcpSHdOdQ=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# supports-color\n\n> Detect whether a terminal supports color\n\n## Install\n\n```\n$ npm install supports-color\n```\n\n## Usage\n\n```js\nimport supportsColor from 'supports-color';\n\nif (supportsColor.stdout) {\n\tconsole.log('Terminal stdout supports color');\n}\n\nif (supportsColor.stdout.has256) {\n\tconsole.log('Terminal stdout supports 256 colors');\n}\n\nif (supportsColor.stderr.has16m) {\n\tconsole.log('Terminal stderr supports 16 million colors (truecolor)');\n}\n```\n\n## API\n\nReturns an `object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.\n\nThe `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:\n\n- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)\n- `.level = 2` and `.has256 = true`: 256 color support\n- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)\n\n### Custom instance\n\nThe package also exposes the named export `createSupportColor` function that takes an arbitrary write stream (for example, `process.stdout`) and an optional options object to (re-)evaluate color support for an arbitrary stream.\n\n```js\nimport {createSupportsColor} from 'supports-color';\n\nconst stdoutSupportsColor = createSupportsColor(process.stdout);\n\nif (stdoutSupportsColor) {\n\tconsole.log('Terminal stdout supports color');\n}\n\n// `stdoutSupportsColor` is the same as `supportsColor.stdout`\n```\n\nThe options object supports a single boolean property `sniffFlags`. By default it is `true`, which instructs the detection to sniff `process.argv` for the multitude of `--color` flags (see _Info_ below). If `false`, then `process.argv` is not considered when determining color support.\n\n## Info\n\nIt obeys the `--color` and `--no-color` CLI flags.\n\nFor situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.\n\nExplicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.\n\n## Related\n\n- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n- [is-unicode-supported](https://github.com/sindresorhus/is-unicode-supported) - Detect whether the terminal supports Unicode\n- [is-interactive](https://github.com/sindresorhus/is-interactive) - Check if stdout or stderr is interactive\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-supports-color?utm_source=npm-supports-color&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n\n---\n","homepage":"https://github.com/chalk/supports-color#readme","repository":{"type":"git","url":"git+https://github.com/chalk/supports-color.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/chalk/supports-color/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "supports-color",
+ "description": "Detect whether a terminal supports color",
+ "dist-tags": {
+ "latest": "7.2.0"
+ },
+ "versions": {
+ "7.2.0": {
+ "name": "supports-color",
+ "version": "7.2.0",
+ "description": "Detect whether a terminal supports color",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/supports-color.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "import-fresh": "^3.0.0",
+ "xo": "^0.24.0"
+ },
+ "browser": "browser.js",
+ "gitHead": "c5edf46896d1fc1826cb1183a60d61eecb65d749",
+ "bugs": {
+ "url": "https://github.com/chalk/supports-color/issues"
+ },
+ "_id": "supports-color@7.2.0",
+ "_nodeVersion": "12.18.2",
+ "_npmVersion": "6.14.7",
+ "dist": {
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "shasum": "1b7dcdcb32b8138801b3e478ba6a51caa89648da",
+ "tarball": "http://localhost:4260/supports-color/supports-color-7.2.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 7035
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/chalk/supports-color#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/supports-color.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chalk/supports-color/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/supports-esm/registry.json b/tests/registry/npm/supports-esm/registry.json
index aa953bacc..3faf44387 100644
--- a/tests/registry/npm/supports-esm/registry.json
+++ b/tests/registry/npm/supports-esm/registry.json
@@ -1 +1,64 @@
-{"name":"supports-esm","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"supports-esm","version":"1.0.0","description":"Detect at runtime if Node.js supports ECMAScript modules","main":"index.js","exports":"./index.js","dependencies":{"has-package-exports":"^1.1.0"},"devDependencies":{"semver":"^7.3.2"},"scripts":{"test":"node test.js"},"repository":{"type":"git","url":"git+https://github.com/targos/supports-esm.git"},"author":{"name":"Michaël Zasso","email":"targos@protonmail.com"},"license":"MIT","bugs":{"url":"https://github.com/targos/supports-esm/issues"},"gitHead":"433e6107ae208a642fdf27dc0862d79a7c8b9145","_id":"supports-esm@1.0.0","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-96Am8CDqUaC0I2+C/swJ0yEvM8ZnGn4unoers/LSdE4umhX7mELzqyLzx3HnZAluq5PXIsGMKqa7NkqaeHMPcg==","shasum":"7cc567747d0745e2b77b331c9b9cae13cf4dc60e","tarball":"http://localhost:4260/supports-esm/supports-esm-1.0.0.tgz","fileCount":4,"unpackedSize":3489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJev7mjCRA9TVsSAnZWagAANe8P/0TWu/Gj/Nq6fNoK/ZSd\nAthgVBhz9pIPiLe0W3ACsb7nPUoJYykAA10N+Bzscb2S6dKLCuByxUtdiv+M\nOk10z2q+E/FRhOTPsXBRSvQdEBhKD1A1/diCGQTo9MGGchWOtwi+vlNDQUf5\nK6iNyNxjFenVj+t56A97LSQmtHq1I1bbzBa4zBO11mpDDVsTGCDnnSO0TFDO\npBBYmuMEVaHz/Yt7eIoBCQR5+DvIwgpbDrGrV0L25kT8VmZRxqRXOBFJNO2C\nYE2VlE7SZhxRwkRDyonJ3RZJzFCw9NSJTUJwXk8zRNdpv+6XB+YLj0OBgQ28\nGYHqnsJJ5kETM+y4oONU4aKWi+hn6/EteVAAaBkYE1E5NSJoOh5OEE90PytX\nY1vVWn7Yqip+fbw0QrSpgSXj0rfui26MRvCTL1wBZ7Y3phkBB/c2rLmQa7RO\nO+hbRkjk9cyzBzNXe4r2Zv2eKwn6TZNIBPT/EcYaHPnuKn4X4DnPgEB+bP2G\nqWa1C5lQ9VVt3xYYJE961uec+hAlKlllkKu4587rqvZ+OGFqi9AnIXagCBU4\n7LmAsbd/RRhlZcgTAv29qFwPf/nEgjHkcKvyJBLpmq+G9c2o3LM+oVwbZU8D\n2iQ2oyJ2ui8NavomlNxqZkoaocuKER7qgUEJWBB3aTUREhSpFZ1EK3Flm546\netuD\r\n=evMx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDiId5jvQO53FtGea7llGowJaurzOK+xWkjyCE0wA6hgIgd1KdPWDd/ofGUvBGP1Hqqdr5365vjkYyVNxnOUDbWCo="}]},"directories":{},"_hasShrinkwrap":false}},"description":"Detect at runtime if Node.js supports ECMAScript modules","homepage":"https://github.com/targos/supports-esm#readme","repository":{"type":"git","url":"git+https://github.com/targos/supports-esm.git"},"author":{"name":"Michaël Zasso","email":"targos@protonmail.com"},"bugs":{"url":"https://github.com/targos/supports-esm/issues"},"license":"MIT","readme":"# supports-esm\n\n[![NPM version][npm-image]][npm-url]\n[![build status][ci-image]][ci-url]\n[![npm download][download-image]][download-url]\n[![License][license-image]][license-url]\n\nDetect at runtime if Node.js supports ECMAScript modules.\n\n## Installation\n\n`$ npm install supports-esm`\n\n## Usage\n\nThis library exports `true` if the current Node.js version is considered to have\nreasonable support for ESM features, `false` otherwise.\n\nVersion 1.x returns `true` if the following features are all present:\n\n- Dynamic imports\n- \"exports\" field in `package.json`, including conditional exports\n- Package self-reference\n\nOne notable use case is to conditionally execute an ESM or CommonJS entrypoint\nfrom a \"bin\" script, such as a command-line interface authored in ESM and\ntranspiled to CommonJS for backwards compatibility:\n\n```js\n'use strict';\n\nconst supportsESM = require('supports-esm');\n\nif (supportsESM) {\n import('../src/cli.js').catch((error) => {\n console.error(error);\n process.exit(1);\n });\n} else {\n require('../build-cjs/cli.js');\n}\n```\n\nThis snippet works in all Node.js versions >= 10.0.0.\n\n[npm-image]: https://img.shields.io/npm/v/supports-esm.svg\n[npm-url]: https://npmjs.org/package/supports-esm\n[ci-image]: https://github.com/targos/supports-esm/workflows/Test/badge.svg?branch=master\n[ci-url]: https://github.com/targos/supports-esm/actions?query=workflow%3ATest\n[download-image]: https://img.shields.io/npm/dm/supports-esm.svg\n[download-url]: https://npmjs.org/package/supports-esm\n[license-image]: https://img.shields.io/npm/l/supports-esm.svg\n[license-url]: LICENSE\n","readmeFilename":"README.md"}
+{
+ "name": "supports-esm",
+ "dist-tags": {
+ "latest": "1.0.0"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "supports-esm",
+ "version": "1.0.0",
+ "description": "Detect at runtime if Node.js supports ECMAScript modules",
+ "main": "index.js",
+ "exports": "./index.js",
+ "dependencies": {
+ "has-package-exports": "^1.1.0"
+ },
+ "devDependencies": {
+ "semver": "^7.3.2"
+ },
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/targos/supports-esm.git"
+ },
+ "author": {
+ "name": "Michaël Zasso",
+ "email": "targos@protonmail.com"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/targos/supports-esm/issues"
+ },
+ "gitHead": "433e6107ae208a642fdf27dc0862d79a7c8b9145",
+ "_id": "supports-esm@1.0.0",
+ "_nodeVersion": "14.2.0",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-96Am8CDqUaC0I2+C/swJ0yEvM8ZnGn4unoers/LSdE4umhX7mELzqyLzx3HnZAluq5PXIsGMKqa7NkqaeHMPcg==",
+ "shasum": "7cc567747d0745e2b77b331c9b9cae13cf4dc60e",
+ "tarball": "http://localhost:4260/supports-esm/supports-esm-1.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 3489
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "Detect at runtime if Node.js supports ECMAScript modules",
+ "homepage": "https://github.com/targos/supports-esm#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/targos/supports-esm.git"
+ },
+ "author": {
+ "name": "Michaël Zasso",
+ "email": "targos@protonmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/targos/supports-esm/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/tar/registry.json b/tests/registry/npm/tar/registry.json
index 2e125b972..fa31f3a95 100644
--- a/tests/registry/npm/tar/registry.json
+++ b/tests/registry/npm/tar/registry.json
@@ -1 +1,105 @@
-{"name":"tar","description":"tar for node","dist-tags":{"latest":"6.2.1"},"versions":{"6.2.1":{"name":"tar","version":"6.2.1","author":{"name":"GitHub Inc."},"license":"ISC","_id":"tar@6.2.1","bugs":{"url":"https://github.com/isaacs/node-tar/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"],"timeout":0,"coverage-map":"map.js"},"dist":{"shasum":"717549c541bc3c2af15751bea94b1dd068d4b03a","tarball":"http://localhost:4260/tar/tar-6.2.1.tgz","fileCount":29,"integrity":"sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==","signatures":[{"sig":"MEQCICiN57b6g7ZWCQN3sRJ+KpQedOYvNEmp0rJiwyGiT6ilAiA92/r4ohXAxTc9ATTxiPbhsnqxFx5d2WFp4qzPVMI+cA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166613},"engines":{"node":">=10"},"gitHead":"c65f76d89a69a4c0d2a1e3ab97c289ce965f6476","scripts":{"snap":"tap","test":"tap","genparse":"node scripts/generate-parse-fixtures.js"},"repository":{"url":"git+https://github.com/isaacs/node-tar.git","type":"git"},"_npmVersion":"10.5.0","description":"tar for node","directories":{},"templateOSS":{"content":"scripts/template-oss","engines":">=10","version":"4.11.0","distPaths":["index.js"],"allowPaths":["/index.js"],"ciVersions":["10.x","12.x","14.x","16.x","18.x"],"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"20.11.0","dependencies":{"chownr":"^2.0.0","mkdirp":"^1.0.3","yallist":"^4.0.0","minipass":"^5.0.0","minizlib":"^2.1.1","fs-minipass":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.0.1","nock":"^13.2.9","chmodr":"^1.2.0","rimraf":"^3.0.2","mutate-fs":"^2.1.1","end-of-stream":"^1.4.3","events-to-array":"^2.0.3","@npmcli/template-oss":"4.11.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"type":"git","url":"git+https://github.com/isaacs/node-tar.git"},"license":"ISC","homepage":"https://github.com/isaacs/node-tar#readme","bugs":{"url":"https://github.com/isaacs/node-tar/issues"},"readme":"# node-tar\n\nFast and full-featured Tar for Node.js\n\nThe API is designed to mimic the behavior of `tar(1)` on unix systems.\nIf you are familiar with how tar works, most of this will hopefully be\nstraightforward for you. If not, then hopefully this module can teach\nyou useful unix skills that may come in handy someday :)\n\n## Background\n\nA \"tar file\" or \"tarball\" is an archive of file system entries\n(directories, files, links, etc.) The name comes from \"tape archive\".\nIf you run `man tar` on almost any Unix command line, you'll learn\nquite a bit about what it can do, and its history.\n\nTar has 5 main top-level commands:\n\n- `c` Create an archive\n- `r` Replace entries within an archive\n- `u` Update entries within an archive (ie, replace if they're newer)\n- `t` List out the contents of an archive\n- `x` Extract an archive to disk\n\nThe other flags and options modify how this top level function works.\n\n## High-Level API\n\nThese 5 functions are the high-level API. All of them have a\nsingle-character name (for unix nerds familiar with `tar(1)`) as well\nas a long name (for everyone else).\n\nAll the high-level functions take the following arguments, all three\nof which are optional and may be omitted.\n\n1. `options` - An optional object specifying various options\n2. `paths` - An array of paths to add or extract\n3. `callback` - Called when the command is completed, if async. (If\n sync or no file specified, providing a callback throws a\n `TypeError`.)\n\nIf the command is sync (ie, if `options.sync=true`), then the\ncallback is not allowed, since the action will be completed immediately.\n\nIf a `file` argument is specified, and the command is async, then a\n`Promise` is returned. In this case, if async, a callback may be\nprovided which is called when the command is completed.\n\nIf a `file` option is not specified, then a stream is returned. For\n`create`, this is a readable stream of the generated archive. For\n`list` and `extract` this is a writable stream that an archive should\nbe written into. If a file is not specified, then a callback is not\nallowed, because you're already getting a stream to work with.\n\n`replace` and `update` only work on existing archives, and so require\na `file` argument.\n\nSync commands without a file argument return a stream that acts on its\ninput immediately in the same tick. For readable streams, this means\nthat all of the data is immediately available by calling\n`stream.read()`. For writable streams, it will be acted upon as soon\nas it is provided, but this can be at any time.\n\n### Warnings and Errors\n\nTar emits warnings and errors for recoverable and unrecoverable situations,\nrespectively. In many cases, a warning only affects a single entry in an\narchive, or is simply informing you that it's modifying an entry to comply\nwith the settings provided.\n\nUnrecoverable warnings will always raise an error (ie, emit `'error'` on\nstreaming actions, throw for non-streaming sync actions, reject the\nreturned Promise for non-streaming async operations, or call a provided\ncallback with an `Error` as the first argument). Recoverable errors will\nraise an error only if `strict: true` is set in the options.\n\nRespond to (recoverable) warnings by listening to the `warn` event.\nHandlers receive 3 arguments:\n\n- `code` String. One of the error codes below. This may not match\n `data.code`, which preserves the original error code from fs and zlib.\n- `message` String. More details about the error.\n- `data` Metadata about the error. An `Error` object for errors raised by\n fs and zlib. All fields are attached to errors raisd by tar. Typically\n contains the following fields, as relevant:\n - `tarCode` The tar error code.\n - `code` Either the tar error code, or the error code set by the\n underlying system.\n - `file` The archive file being read or written.\n - `cwd` Working directory for creation and extraction operations.\n - `entry` The entry object (if it could be created) for `TAR_ENTRY_INFO`,\n `TAR_ENTRY_INVALID`, and `TAR_ENTRY_ERROR` warnings.\n - `header` The header object (if it could be created, and the entry could\n not be created) for `TAR_ENTRY_INFO` and `TAR_ENTRY_INVALID` warnings.\n - `recoverable` Boolean. If `false`, then the warning will emit an\n `error`, even in non-strict mode.\n\n#### Error Codes\n\n- `TAR_ENTRY_INFO` An informative error indicating that an entry is being\n modified, but otherwise processed normally. For example, removing `/` or\n `C:\\` from absolute paths if `preservePaths` is not set.\n\n- `TAR_ENTRY_INVALID` An indication that a given entry is not a valid tar\n archive entry, and will be skipped. This occurs when:\n\n - a checksum fails,\n - a `linkpath` is missing for a link type, or\n - a `linkpath` is provided for a non-link type.\n\n If every entry in a parsed archive raises an `TAR_ENTRY_INVALID` error,\n then the archive is presumed to be unrecoverably broken, and\n `TAR_BAD_ARCHIVE` will be raised.\n\n- `TAR_ENTRY_ERROR` The entry appears to be a valid tar archive entry, but\n encountered an error which prevented it from being unpacked. This occurs\n when:\n\n - an unrecoverable fs error happens during unpacking,\n - an entry is trying to extract into an excessively deep\n location (by default, limited to 1024 subfolders),\n - an entry has `..` in the path and `preservePaths` is not set, or\n - an entry is extracting through a symbolic link, when `preservePaths` is\n not set.\n\n- `TAR_ENTRY_UNSUPPORTED` An indication that a given entry is\n a valid archive entry, but of a type that is unsupported, and so will be\n skipped in archive creation or extracting.\n\n- `TAR_ABORT` When parsing gzipped-encoded archives, the parser will\n abort the parse process raise a warning for any zlib errors encountered.\n Aborts are considered unrecoverable for both parsing and unpacking.\n\n- `TAR_BAD_ARCHIVE` The archive file is totally hosed. This can happen for\n a number of reasons, and always occurs at the end of a parse or extract:\n\n - An entry body was truncated before seeing the full number of bytes.\n - The archive contained only invalid entries, indicating that it is\n likely not an archive, or at least, not an archive this library can\n parse.\n\n `TAR_BAD_ARCHIVE` is considered informative for parse operations, but\n unrecoverable for extraction. Note that, if encountered at the end of an\n extraction, tar WILL still have extracted as much it could from the\n archive, so there may be some garbage files to clean up.\n\nErrors that occur deeper in the system (ie, either the filesystem or zlib)\nwill have their error codes left intact, and a `tarCode` matching one of\nthe above will be added to the warning metadata or the raised error object.\n\nErrors generated by tar will have one of the above codes set as the\n`error.code` field as well, but since errors originating in zlib or fs will\nhave their original codes, it's better to read `error.tarCode` if you wish\nto see how tar is handling the issue.\n\n### Examples\n\nThe API mimics the `tar(1)` command line functionality, with aliases\nfor more human-readable option and function names. The goal is that\nif you know how to use `tar(1)` in Unix, then you know how to use\n`import('tar')` in JavaScript.\n\nTo replicate `tar czf my-tarball.tgz files and folders`, you'd do:\n\n```js\nimport { create } from 'tar'\ncreate(\n {\n gzip: <true|gzip options>,\n file: 'my-tarball.tgz'\n },\n ['some', 'files', 'and', 'folders']\n).then(_ => { .. tarball has been created .. })\n```\n\nTo replicate `tar cz files and folders > my-tarball.tgz`, you'd do:\n\n```js\n// if you're familiar with the tar(1) cli flags, this can be nice\nimport * as tar from 'tar'\ntar.c(\n {\n // 'z' is alias for 'gzip' option\n z: <true|gzip options>\n },\n ['some', 'files', 'and', 'folders']\n).pipe(fs.createWriteStream('my-tarball.tgz'))\n```\n\nTo replicate `tar xf my-tarball.tgz` you'd do:\n\n```js\ntar.x( // or `tar.extract`\n {\n // or `file:`\n f: 'my-tarball.tgz'\n }\n).then(_=> { .. tarball has been dumped in cwd .. })\n```\n\nTo replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`:\n\n```js\nfs.createReadStream('my-tarball.tgz').pipe(\n tar.x({\n strip: 1,\n C: 'some-dir', // alias for cwd:'some-dir', also ok\n }),\n)\n```\n\nTo replicate `tar tf my-tarball.tgz`, do this:\n\n```js\ntar.t({\n file: 'my-tarball.tgz',\n onReadEntry: entry => { .. do whatever with it .. }\n})\n```\n\nFor example, to just get the list of filenames from an archive:\n\n```js\nconst getEntryFilenames = async tarballFilename => {\n const filenames = []\n await tar.t({\n file: tarballFilename,\n onReadEntry: entry => filenames.push(entry.path),\n })\n return filenames\n}\n```\n\nTo replicate `cat my-tarball.tgz | tar t` do:\n\n```js\nfs.createReadStream('my-tarball.tgz')\n .pipe(tar.t())\n .on('entry', entry => { .. do whatever with it .. })\n```\n\nTo do anything synchronous, add `sync: true` to the options. Note\nthat sync functions don't take a callback and don't return a promise.\nWhen the function returns, it's already done. Sync methods without a\nfile argument return a sync stream, which flushes immediately. But,\nof course, it still won't be done until you `.end()` it.\n\n```js\nconst getEntryFilenamesSync = tarballFilename => {\n const filenames = []\n tar.t({\n file: tarballFilename,\n onReadEntry: entry => filenames.push(entry.path),\n sync: true,\n })\n return filenames\n}\n```\n\nTo filter entries, add `filter: <function>` to the options.\nTar-creating methods call the filter with `filter(path, stat)`.\nTar-reading methods (including extraction) call the filter with\n`filter(path, entry)`. The filter is called in the `this`-context of\nthe `Pack` or `Unpack` stream object.\n\nThe arguments list to `tar t` and `tar x` specify a list of filenames\nto extract or list, so they're equivalent to a filter that tests if\nthe file is in the list.\n\nFor those who _aren't_ fans of tar's single-character command names:\n\n```\ntar.c === tar.create\ntar.r === tar.replace (appends to archive, file is required)\ntar.u === tar.update (appends if newer, file is required)\ntar.x === tar.extract\ntar.t === tar.list\n```\n\nKeep reading for all the command descriptions and options, as well as\nthe low-level API that they are built on.\n\n### tar.c(options, fileList, callback) [alias: tar.create]\n\nCreate a tarball archive.\n\nThe `fileList` is an array of paths to add to the tarball. Adding a\ndirectory also adds its children recursively.\n\nAn entry in `fileList` that starts with an `@` symbol is a tar archive\nwhose entries will be added. To add a file that starts with `@`,\nprepend it with `./`.\n\nThe following options are supported:\n\n- `file` Write the tarball archive to the specified filename. If this\n is specified, then the callback will be fired when the file has been\n written, and a promise will be returned that resolves when the file\n is written. If a filename is not specified, then a Readable Stream\n will be returned which will emit the file data. [Alias: `f`]\n- `sync` Act synchronously. If this is set, then any provided file\n will be fully written after the call to `tar.c`. If this is set,\n and a file is not provided, then the resulting stream will already\n have the data ready to `read` or `emit('data')` as soon as you\n request it.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `cwd` The current working directory for creating the archive.\n Defaults to `process.cwd()`. [Alias: `C`]\n- `prefix` A path portion to prefix onto the entries in the archive.\n- `gzip` Set to any truthy value to create a gzipped archive, or an\n object with settings for `zlib.Gzip()` [Alias: `z`]\n- `filter` A function that gets called with `(path, stat)` for each\n entry being added. Return `true` to add the entry to the archive,\n or `false` to omit it.\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths. [Alias: `P`]\n- `mode` The mode to set on the created file archive\n- `noDirRecurse` Do not recursively archive the contents of\n directories. [Alias: `n`]\n- `follow` Set to true to pack the targets of symbolic links. Without\n this option, symbolic links are archived as such. [Alias: `L`, `h`]\n- `noPax` Suppress pax extended headers. Note that this means that\n long paths and linkpaths will be truncated, and large or negative\n numeric values may be interpreted incorrectly.\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n [Alias: `m`, `no-mtime`]\n- `mtime` Set to a `Date` object to force a specific `mtime` for\n everything added to the archive. Overridden by `noMtime`.\n- `onWriteEntry` Called with each `WriteEntry` or\n `WriteEntrySync` that is created in the course of writing the\n archive.\n\nThe following options are mostly internal, but can be modified in some\nadvanced use cases, such as re-using caches between runs.\n\n- `linkCache` A Map object containing the device and inode value for\n any file whose nlink is > 1, to identify hard links.\n- `statCache` A Map object that caches calls `lstat`.\n- `readdirCache` A Map object that caches calls to `readdir`.\n- `jobs` A number specifying how many concurrent jobs to run.\n Defaults to 4.\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n\n### tar.x(options, fileList, callback) [alias: tar.extract]\n\nExtract a tarball archive.\n\nThe `fileList` is an array of paths to extract from the tarball. If\nno paths are provided, then all the entries are extracted.\n\nIf the archive is gzipped, then tar will detect this and unzip it.\n\nNote that all directories that are created will be forced to be\nwritable, readable, and listable by their owner, to avoid cases where\na directory prevents extraction of child entries by virtue of its\nmode.\n\nMost extraction errors will cause a `warn` event to be emitted. If\nthe `cwd` is missing, or not a directory, then the extraction will\nfail completely.\n\nThe following options are supported:\n\n- `cwd` Extract files relative to the specified directory. Defaults\n to `process.cwd()`. If provided, this must exist and must be a\n directory. [Alias: `C`]\n- `file` The archive file to extract. If not specified, then a\n Writable stream is returned where the archive data should be\n written. [Alias: `f`]\n- `sync` Create files and directories synchronously.\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `filter` A function that gets called with `(path, entry)` for each\n entry being unpacked. Return `true` to unpack the entry from the\n archive, or `false` to skip it.\n- `newer` Set to true to keep the existing file on disk if it's newer\n than the file in the archive. [Alias: `keep-newer`,\n `keep-newer-files`]\n- `keep` Do not overwrite existing files. In particular, if a file\n appears more than once in an archive, later copies will not\n overwrite earlier copies. [Alias: `k`, `keep-existing`]\n- `preservePaths` Allow absolute paths, paths containing `..`, and\n extracting through symbolic links. By default, `/` is stripped from\n absolute paths, `..` paths are not extracted, and any file whose\n location would be modified by a symbolic link is not extracted.\n [Alias: `P`]\n- `unlink` Unlink files before creating them. Without this option,\n tar overwrites existing files, which preserves existing hardlinks.\n With this option, existing hardlinks will be broken, as will any\n symlink that would affect the location of an extracted file. [Alias:\n `U`]\n- `strip` Remove the specified number of leading path elements.\n Pathnames with fewer elements will be silently skipped. Note that\n the pathname is edited after applying the filter, but before\n security checks. [Alias: `strip-components`, `stripComponents`]\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `preserveOwner` If true, tar will set the `uid` and `gid` of\n extracted entries to the `uid` and `gid` fields in the archive.\n This defaults to true when run as root, and false otherwise. If\n false, then files and directories will be set with the owner and\n group of the user running the process. This is similar to `-p` in\n `tar(1)`, but ACLs and other system-specific data is never unpacked\n in this implementation, and modes are set by default already.\n [Alias: `p`]\n- `uid` Set to a number to force ownership of all extracted files and\n folders, and all implicitly created directories, to be owned by the\n specified user id, regardless of the `uid` field in the archive.\n Cannot be used along with `preserveOwner`. Requires also setting a\n `gid` option.\n- `gid` Set to a number to force ownership of all extracted files and\n folders, and all implicitly created directories, to be owned by the\n specified group id, regardless of the `gid` field in the archive.\n Cannot be used along with `preserveOwner`. Requires also setting a\n `uid` option.\n- `noMtime` Set to true to omit writing `mtime` value for extracted\n entries. [Alias: `m`, `no-mtime`]\n- `transform` Provide a function that takes an `entry` object, and\n returns a stream, or any falsey value. If a stream is provided,\n then that stream's data will be written instead of the contents of\n the archive entry. If a falsey value is provided, then the entry is\n written to disk as normal. (To exclude items from extraction, use\n the `filter` option described above.)\n- `onReadEntry` A function that gets called with `(entry)` for each entry\n that passes the filter.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `chmod` Set to true to call `fs.chmod()` to ensure that the\n extracted file matches the entry mode. This may necessitate a\n call to the deprecated and thread-unsafe `process.umask()`\n method to determine the default umask value, unless a\n `processUmask` options is also provided. Otherwise tar will\n extract with whatever mode is provided, and let the process\n `umask` apply normally.\n- `processUmask` Set to an explicit numeric value to avoid\n calling `process.umask()` when `chmod: true` is set.\n- `maxDepth` The maximum depth of subfolders to extract into. This\n defaults to 1024. Anything deeper than the limit will raise a\n warning and skip the entry. Set to `Infinity` to remove the\n limitation.\n\nThe following options are mostly internal, but can be modified in some\nadvanced use cases, such as re-using caches between runs.\n\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n- `umask` Filter the modes of entries like `process.umask()`.\n- `dmode` Default mode for directories\n- `fmode` Default mode for files\n- `dirCache` A Map object of which directories exist.\n- `maxMetaEntrySize` The maximum size of meta entries that is\n supported. Defaults to 1 MB.\n\nNote that using an asynchronous stream type with the `transform`\noption will cause undefined behavior in sync extractions.\n[MiniPass](http://npm.im/minipass)-based streams are designed for this\nuse case.\n\n### tar.t(options, fileList, callback) [alias: tar.list]\n\nList the contents of a tarball archive.\n\nThe `fileList` is an array of paths to list from the tarball. If\nno paths are provided, then all the entries are listed.\n\nIf the archive is gzipped, then tar will detect this and unzip it.\n\nIf the `file` option is _not_ provided, then returns an event emitter that\nemits `entry` events with `tar.ReadEntry` objects. However, they don't\nemit `'data'` or `'end'` events. (If you want to get actual readable\nentries, use the `tar.Parse` class instead.)\n\nIf a `file` option _is_ provided, then the return value will be a promise\nthat resolves when the file has been fully traversed in async mode, or\n`undefined` if `sync: true` is set. Thus, you _must_ specify an `onReadEntry`\nmethod in order to do anything useful with the data it parses.\n\nThe following options are supported:\n\n- `file` The archive file to list. If not specified, then a\n Writable stream is returned where the archive data should be\n written. [Alias: `f`]\n- `sync` Read the specified file synchronously. (This has no effect\n when a file option isn't specified, because entries are emitted as\n fast as they are parsed from the stream anyway.)\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `filter` A function that gets called with `(path, entry)` for each\n entry being listed. Return `true` to emit the entry from the\n archive, or `false` to skip it.\n- `onReadEntry` A function that gets called with `(entry)` for each entry\n that passes the filter. This is important for when `file` is set,\n because there is no other way to do anything useful with this method.\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n- `noResume` By default, `entry` streams are resumed immediately after\n the call to `onReadEntry`. Set `noResume: true` to suppress this\n behavior. Note that by opting into this, the stream will never\n complete until the entry data is consumed.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n\n### tar.u(options, fileList, callback) [alias: tar.update]\n\nAdd files to an archive if they are newer than the entry already in\nthe tarball archive.\n\nThe `fileList` is an array of paths to add to the tarball. Adding a\ndirectory also adds its children recursively.\n\nAn entry in `fileList` that starts with an `@` symbol is a tar archive\nwhose entries will be added. To add a file that starts with `@`,\nprepend it with `./`.\n\nThe following options are supported:\n\n- `file` Required. Write the tarball archive to the specified\n filename. [Alias: `f`]\n- `sync` Act synchronously. If this is set, then any provided file\n will be fully written after the call to `tar.c`.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `cwd` The current working directory for adding entries to the\n archive. Defaults to `process.cwd()`. [Alias: `C`]\n- `prefix` A path portion to prefix onto the entries in the archive.\n- `gzip` Set to any truthy value to create a gzipped archive, or an\n object with settings for `zlib.Gzip()` [Alias: `z`]\n- `filter` A function that gets called with `(path, stat)` for each\n entry being added. Return `true` to add the entry to the archive,\n or `false` to omit it.\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths. [Alias: `P`]\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n- `noDirRecurse` Do not recursively archive the contents of\n directories. [Alias: `n`]\n- `follow` Set to true to pack the targets of symbolic links. Without\n this option, symbolic links are archived as such. [Alias: `L`, `h`]\n- `noPax` Suppress pax extended headers. Note that this means that\n long paths and linkpaths will be truncated, and large or negative\n numeric values may be interpreted incorrectly.\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n [Alias: `m`, `no-mtime`]\n- `mtime` Set to a `Date` object to force a specific `mtime` for\n everything added to the archive. Overridden by `noMtime`.\n- `onWriteEntry` Called with each `WriteEntry` or\n `WriteEntrySync` that is created in the course of writing the\n archive.\n\n### tar.r(options, fileList, callback) [alias: tar.replace]\n\nAdd files to an existing archive. Because later entries override\nearlier entries, this effectively replaces any existing entries.\n\nThe `fileList` is an array of paths to add to the tarball. Adding a\ndirectory also adds its children recursively.\n\nAn entry in `fileList` that starts with an `@` symbol is a tar archive\nwhose entries will be added. To add a file that starts with `@`,\nprepend it with `./`.\n\nThe following options are supported:\n\n- `file` Required. Write the tarball archive to the specified\n filename. [Alias: `f`]\n- `sync` Act synchronously. If this is set, then any provided file\n will be fully written after the call to `tar.c`.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `cwd` The current working directory for adding entries to the\n archive. Defaults to `process.cwd()`. [Alias: `C`]\n- `prefix` A path portion to prefix onto the entries in the archive.\n- `gzip` Set to any truthy value to create a gzipped archive, or an\n object with settings for `zlib.Gzip()` [Alias: `z`]\n- `filter` A function that gets called with `(path, stat)` for each\n entry being added. Return `true` to add the entry to the archive,\n or `false` to omit it.\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths. [Alias: `P`]\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n- `noDirRecurse` Do not recursively archive the contents of\n directories. [Alias: `n`]\n- `follow` Set to true to pack the targets of symbolic links. Without\n this option, symbolic links are archived as such. [Alias: `L`, `h`]\n- `noPax` Suppress pax extended headers. Note that this means that\n long paths and linkpaths will be truncated, and large or negative\n numeric values may be interpreted incorrectly.\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n [Alias: `m`, `no-mtime`]\n- `mtime` Set to a `Date` object to force a specific `mtime` for\n everything added to the archive. Overridden by `noMtime`.\n- `onWriteEntry` Called with each `WriteEntry` or\n `WriteEntrySync` that is created in the course of writing the\n archive.\n\n## Low-Level API\n\n### class Pack\n\nA readable tar stream.\n\nHas all the standard readable stream interface stuff. `'data'` and\n`'end'` events, `read()` method, `pause()` and `resume()`, etc.\n\n#### constructor(options)\n\nThe following options are supported:\n\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `cwd` The current working directory for creating the archive.\n Defaults to `process.cwd()`.\n- `prefix` A path portion to prefix onto the entries in the archive.\n- `gzip` Set to any truthy value to create a gzipped archive, or an\n object with settings for `zlib.Gzip()`\n- `filter` A function that gets called with `(path, stat)` for each\n entry being added. Return `true` to add the entry to the archive,\n or `false` to omit it.\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths.\n- `linkCache` A Map object containing the device and inode value for\n any file whose nlink is > 1, to identify hard links.\n- `statCache` A Map object that caches calls `lstat`.\n- `readdirCache` A Map object that caches calls to `readdir`.\n- `jobs` A number specifying how many concurrent jobs to run.\n Defaults to 4.\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 16 MB.\n- `noDirRecurse` Do not recursively archive the contents of\n directories.\n- `follow` Set to true to pack the targets of symbolic links. Without\n this option, symbolic links are archived as such.\n- `noPax` Suppress pax extended headers. Note that this means that\n long paths and linkpaths will be truncated, and large or negative\n numeric values may be interpreted incorrectly.\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n- `mtime` Set to a `Date` object to force a specific `mtime` for\n everything added to the archive. Overridden by `noMtime`.\n- `onWriteEntry` Called with each `WriteEntry` or\n `WriteEntrySync` that is created in the course of writing the\n archive.\n\n#### add(path)\n\nAdds an entry to the archive. Returns the Pack stream.\n\n#### write(path)\n\nAdds an entry to the archive. Returns true if flushed.\n\n#### end()\n\nFinishes the archive.\n\n### class PackSync\n\nSynchronous version of `Pack`.\n\n### class Unpack\n\nA writable stream that unpacks a tar archive onto the file system.\n\nAll the normal writable stream stuff is supported. `write()` and\n`end()` methods, `'drain'` events, etc.\n\nNote that all directories that are created will be forced to be\nwritable, readable, and listable by their owner, to avoid cases where\na directory prevents extraction of child entries by virtue of its\nmode.\n\n`'close'` is emitted when it's done writing stuff to the file system.\n\nMost unpack errors will cause a `warn` event to be emitted. If the\n`cwd` is missing, or not a directory, then an error will be emitted.\n\n#### constructor(options)\n\n- `cwd` Extract files relative to the specified directory. Defaults\n to `process.cwd()`. If provided, this must exist and must be a\n directory.\n- `filter` A function that gets called with `(path, entry)` for each\n entry being unpacked. Return `true` to unpack the entry from the\n archive, or `false` to skip it.\n- `newer` Set to true to keep the existing file on disk if it's newer\n than the file in the archive.\n- `keep` Do not overwrite existing files. In particular, if a file\n appears more than once in an archive, later copies will not\n overwrite earlier copies.\n- `preservePaths` Allow absolute paths, paths containing `..`, and\n extracting through symbolic links. By default, `/` is stripped from\n absolute paths, `..` paths are not extracted, and any file whose\n location would be modified by a symbolic link is not extracted.\n- `unlink` Unlink files before creating them. Without this option,\n tar overwrites existing files, which preserves existing hardlinks.\n With this option, existing hardlinks will be broken, as will any\n symlink that would affect the location of an extracted file.\n- `strip` Remove the specified number of leading path elements.\n Pathnames with fewer elements will be silently skipped. Note that\n the pathname is edited after applying the filter, but before\n security checks.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `umask` Filter the modes of entries like `process.umask()`.\n- `dmode` Default mode for directories\n- `fmode` Default mode for files\n- `dirCache` A Map object of which directories exist.\n- `maxMetaEntrySize` The maximum size of meta entries that is\n supported. Defaults to 1 MB.\n- `preserveOwner` If true, tar will set the `uid` and `gid` of\n extracted entries to the `uid` and `gid` fields in the archive.\n This defaults to true when run as root, and false otherwise. If\n false, then files and directories will be set with the owner and\n group of the user running the process. This is similar to `-p` in\n `tar(1)`, but ACLs and other system-specific data is never unpacked\n in this implementation, and modes are set by default already.\n- `win32` True if on a windows platform. Causes behavior where\n filenames containing `<|>?` chars are converted to\n windows-compatible values while being unpacked.\n- `uid` Set to a number to force ownership of all extracted files and\n folders, and all implicitly created directories, to be owned by the\n specified user id, regardless of the `uid` field in the archive.\n Cannot be used along with `preserveOwner`. Requires also setting a\n `gid` option.\n- `gid` Set to a number to force ownership of all extracted files and\n folders, and all implicitly created directories, to be owned by the\n specified group id, regardless of the `gid` field in the archive.\n Cannot be used along with `preserveOwner`. Requires also setting a\n `uid` option.\n- `noMtime` Set to true to omit writing `mtime` value for extracted\n entries.\n- `transform` Provide a function that takes an `entry` object, and\n returns a stream, or any falsey value. If a stream is provided,\n then that stream's data will be written instead of the contents of\n the archive entry. If a falsey value is provided, then the entry is\n written to disk as normal. (To exclude items from extraction, use\n the `filter` option described above.)\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `onReadEntry` A function that gets called with `(entry)` for each entry\n that passes the filter.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `chmod` Set to true to call `fs.chmod()` to ensure that the\n extracted file matches the entry mode. This may necessitate a\n call to the deprecated and thread-unsafe `process.umask()`\n method to determine the default umask value, unless a\n `processUmask` options is also provided. Otherwise tar will\n extract with whatever mode is provided, and let the process\n `umask` apply normally.\n- `processUmask` Set to an explicit numeric value to avoid\n calling `process.umask()` when `chmod: true` is set.\n- `maxDepth` The maximum depth of subfolders to extract into. This\n defaults to 1024. Anything deeper than the limit will raise a\n warning and skip the entry. Set to `Infinity` to remove the\n limitation.\n\n### class UnpackSync\n\nSynchronous version of `Unpack`.\n\nNote that using an asynchronous stream type with the `transform`\noption will cause undefined behavior in sync unpack streams.\n[MiniPass](http://npm.im/minipass)-based streams are designed for this\nuse case.\n\n### class tar.Parse\n\nA writable stream that parses a tar archive stream. All the standard\nwritable stream stuff is supported.\n\nIf the archive is gzipped, then tar will detect this and unzip it.\n\nEmits `'entry'` events with `tar.ReadEntry` objects, which are\nthemselves readable streams that you can pipe wherever.\n\nEach `entry` will not emit until the one before it is flushed through,\nso make sure to either consume the data (with `on('data', ...)` or\n`.pipe(...)`) or throw it away with `.resume()` to keep the stream\nflowing.\n\n#### constructor(options)\n\nReturns an event emitter that emits `entry` events with\n`tar.ReadEntry` objects.\n\nThe following options are supported:\n\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `filter` A function that gets called with `(path, entry)` for each\n entry being listed. Return `true` to emit the entry from the\n archive, or `false` to skip it.\n- `onReadEntry` A function that gets called with `(entry)` for each entry\n that passes the filter.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n\n#### abort(error)\n\nStop all parsing activities. This is called when there are zlib\nerrors. It also emits an unrecoverable warning with the error provided.\n\n### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass)\n\nA representation of an entry that is being read out of a tar archive.\n\nIt has the following fields:\n\n- `extended` The extended metadata object provided to the constructor.\n- `globalExtended` The global extended metadata object provided to the\n constructor.\n- `remain` The number of bytes remaining to be written into the\n stream.\n- `blockRemain` The number of 512-byte blocks remaining to be written\n into the stream.\n- `ignore` Whether this entry should be ignored.\n- `meta` True if this represents metadata about the next entry, false\n if it represents a filesystem object.\n- All the fields from the header, extended header, and global extended\n header are added to the ReadEntry object. So it has `path`, `type`,\n `size`, `mode`, and so on.\n\n#### constructor(header, extended, globalExtended)\n\nCreate a new ReadEntry object with the specified header, extended\nheader, and global extended header values.\n\n### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass)\n\nA representation of an entry that is being written from the file\nsystem into a tar archive.\n\nEmits data for the Header, and for the Pax Extended Header if one is\nrequired, as well as any body data.\n\nCreating a WriteEntry for a directory does not also create\nWriteEntry objects for all of the directory contents.\n\nIt has the following fields:\n\n- `path` The path field that will be written to the archive. By\n default, this is also the path from the cwd to the file system\n object.\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `myuid` If supported, the uid of the user running the current\n process.\n- `myuser` The `env.USER` string if set, or `''`. Set as the entry\n `uname` field if the file's `uid` matches `this.myuid`.\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 1 MB.\n- `linkCache` A Map object containing the device and inode value for\n any file whose nlink is > 1, to identify hard links.\n- `statCache` A Map object that caches calls `lstat`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths.\n- `cwd` The current working directory for creating the archive.\n Defaults to `process.cwd()`.\n- `absolute` The absolute path to the entry on the filesystem. By\n default, this is `path.resolve(this.cwd, this.path)`, but it can be\n overridden explicitly.\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `win32` True if on a windows platform. Causes behavior where paths\n replace `\\` with `/` and filenames containing the windows-compatible\n forms of `<|>?:` characters are converted to actual `<|>?:` characters\n in the archive.\n- `noPax` Suppress pax extended headers. Note that this means that\n long paths and linkpaths will be truncated, and large or negative\n numeric values may be interpreted incorrectly.\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n\n#### constructor(path, options)\n\n`path` is the path of the entry as it is written in the archive.\n\nThe following options are supported:\n\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `maxReadSize` The maximum buffer size for `fs.read()` operations.\n Defaults to 1 MB.\n- `linkCache` A Map object containing the device and inode value for\n any file whose nlink is > 1, to identify hard links.\n- `statCache` A Map object that caches calls `lstat`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths.\n- `cwd` The current working directory for creating the archive.\n Defaults to `process.cwd()`.\n- `absolute` The absolute path to the entry on the filesystem. By\n default, this is `path.resolve(this.cwd, this.path)`, but it can be\n overridden explicitly.\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `win32` True if on a windows platform. Causes behavior where paths\n replace `\\` with `/`.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n- `umask` Set to restrict the modes on the entries in the archive,\n somewhat like how umask works on file creation. Defaults to\n `process.umask()` on unix systems, or `0o22` on Windows.\n\n#### warn(message, data)\n\nIf strict, emit an error with the provided message.\n\nOthewise, emit a `'warn'` event with the provided message and data.\n\n### class tar.WriteEntry.Sync\n\nSynchronous version of tar.WriteEntry\n\n### class tar.WriteEntry.Tar\n\nA version of tar.WriteEntry that gets its data from a tar.ReadEntry\ninstead of from the filesystem.\n\n#### constructor(readEntry, options)\n\n`readEntry` is the entry being read out of another archive.\n\nThe following options are supported:\n\n- `portable` Omit metadata that is system-specific: `ctime`, `atime`,\n `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note\n that `mtime` is still included, because this is necessary for other\n time-based operations. Additionally, `mode` is set to a \"reasonable\n default\" for most unix systems, based on a `umask` value of `0o22`.\n- `preservePaths` Allow absolute paths. By default, `/` is stripped\n from absolute paths.\n- `strict` Treat warnings as crash-worthy errors. Default false.\n- `onwarn` A function that will get called with `(code, message, data)` for\n any warnings encountered. (See \"Warnings and Errors\")\n- `noMtime` Set to true to omit writing `mtime` values for entries.\n Note that this prevents using other mtime-based features like\n `tar.update` or the `keepNewer` option with the resulting tar archive.\n\n### class tar.Header\n\nA class for reading and writing header blocks.\n\nIt has the following fields:\n\n- `nullBlock` True if decoding a block which is entirely composed of\n `0x00` null bytes. (Useful because tar files are terminated by\n at least 2 null blocks.)\n- `cksumValid` True if the checksum in the header is valid, false\n otherwise.\n- `needPax` True if the values, as encoded, will require a Pax\n extended header.\n- `path` The path of the entry.\n- `mode` The 4 lowest-order octal digits of the file mode. That is,\n read/write/execute permissions for world, group, and owner, and the\n setuid, setgid, and sticky bits.\n- `uid` Numeric user id of the file owner\n- `gid` Numeric group id of the file owner\n- `size` Size of the file in bytes\n- `mtime` Modified time of the file\n- `cksum` The checksum of the header. This is generated by adding all\n the bytes of the header block, treating the checksum field itself as\n all ascii space characters (that is, `0x20`).\n- `type` The human-readable name of the type of entry this represents,\n or the alphanumeric key if unknown.\n- `typeKey` The alphanumeric key for the type of entry this header\n represents.\n- `linkpath` The target of Link and SymbolicLink entries.\n- `uname` Human-readable user name of the file owner\n- `gname` Human-readable group name of the file owner\n- `devmaj` The major portion of the device number. Always `0` for\n files, directories, and links.\n- `devmin` The minor portion of the device number. Always `0` for\n files, directories, and links.\n- `atime` File access time.\n- `ctime` File change time.\n\n#### constructor(data, [offset=0])\n\n`data` is optional. It is either a Buffer that should be interpreted\nas a tar Header starting at the specified offset and continuing for\n512 bytes, or a data object of keys and values to set on the header\nobject, and eventually encode as a tar Header.\n\n#### decode(block, offset)\n\nDecode the provided buffer starting at the specified offset.\n\nBuffer length must be greater than 512 bytes.\n\n#### set(data)\n\nSet the fields in the data object.\n\n#### encode(buffer, offset)\n\nEncode the header fields into the buffer at the specified offset.\n\nReturns `this.needPax` to indicate whether a Pax Extended Header is\nrequired to properly encode the specified data.\n\n### class tar.Pax\n\nAn object representing a set of key-value pairs in an Pax extended\nheader entry.\n\nIt has the following fields. Where the same name is used, they have\nthe same semantics as the tar.Header field of the same name.\n\n- `global` True if this represents a global extended header, or false\n if it is for a single entry.\n- `atime`\n- `charset`\n- `comment`\n- `ctime`\n- `gid`\n- `gname`\n- `linkpath`\n- `mtime`\n- `path`\n- `size`\n- `uid`\n- `uname`\n- `dev`\n- `ino`\n- `nlink`\n\n#### constructor(object, global)\n\nSet the fields set in the object. `global` is a boolean that defaults\nto false.\n\n#### encode()\n\nReturn a Buffer containing the header and body for the Pax extended\nheader entry, or `null` if there is nothing to encode.\n\n#### encodeBody()\n\nReturn a string representing the body of the pax extended header\nentry.\n\n#### encodeField(fieldName)\n\nReturn a string representing the key/value encoding for the specified\nfieldName, or `''` if the field is unset.\n\n### tar.Pax.parse(string, extended, global)\n\nReturn a new Pax object created by parsing the contents of the string\nprovided.\n\nIf the `extended` object is set, then also add the fields from that\nobject. (This is necessary because multiple metadata entries can\noccur in sequence.)\n\n### tar.types\n\nA translation table for the `type` field in tar headers.\n\n#### tar.types.name.get(code)\n\nGet the human-readable name for a given alphanumeric code.\n\n#### tar.types.code.get(name)\n\nGet the alphanumeric code for a given human-readable name.\n","readmeFilename":"README.md"}
+{
+ "name": "tar",
+ "description": "tar for node",
+ "dist-tags": {
+ "latest": "6.2.1"
+ },
+ "versions": {
+ "6.2.1": {
+ "name": "tar",
+ "version": "6.2.1",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "tar@6.2.1",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-tar/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "timeout": 0,
+ "coverage-map": "map.js"
+ },
+ "dist": {
+ "shasum": "717549c541bc3c2af15751bea94b1dd068d4b03a",
+ "tarball": "http://localhost:4260/tar/tar-6.2.1.tgz",
+ "fileCount": 29,
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "unpackedSize": 166613
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "gitHead": "c65f76d89a69a4c0d2a1e3ab97c289ce965f6476",
+ "scripts": {
+ "snap": "tap",
+ "test": "tap",
+ "genparse": "node scripts/generate-parse-fixtures.js"
+ },
+ "repository": {
+ "url": "git+https://github.com/isaacs/node-tar.git",
+ "type": "git"
+ },
+ "_npmVersion": "10.5.0",
+ "description": "tar for node",
+ "directories": {},
+ "templateOSS": {
+ "content": "scripts/template-oss",
+ "engines": ">=10",
+ "version": "4.11.0",
+ "distPaths": [
+ "index.js"
+ ],
+ "allowPaths": [
+ "/index.js"
+ ],
+ "ciVersions": [
+ "10.x",
+ "12.x",
+ "14.x",
+ "16.x",
+ "18.x"
+ ],
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "20.11.0",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "fs-minipass": "^2.0.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.0.1",
+ "nock": "^13.2.9",
+ "chmodr": "^1.2.0",
+ "rimraf": "^3.0.2",
+ "mutate-fs": "^2.1.1",
+ "end-of-stream": "^1.4.3",
+ "events-to-array": "^2.0.3",
+ "@npmcli/template-oss": "4.11.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/node-tar.git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/isaacs/node-tar#readme",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-tar/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/trim_registry_files.js b/tests/registry/npm/trim_registry_files.js
index a47ded794..608624b1d 100755
--- a/tests/registry/npm/trim_registry_files.js
+++ b/tests/registry/npm/trim_registry_files.js
@@ -14,6 +14,7 @@ for (const dirPath of getPackageDirs()) {
const registryPath = dirPath + "/registry.json";
const data = JSON.parse(Deno.readTextFileSync(registryPath));
// this is to save data
+ delete data.readme;
for (const version in data.versions) {
if (!versions.includes(version)) {
delete data.versions[version];
@@ -31,6 +32,8 @@ for (const dirPath of getPackageDirs()) {
delete data.versions[version].maintainers;
delete data.versions[version]._npmUser;
delete data.versions[version]._npmOperationalInternal;
+ delete data.versions[version].dist.signatures;
+ delete data.versions[version].dist["npm-signature"];
if (!versions.includes(data["dist-tags"].latest)) {
data["dist-tags"].latest = [...versions].sort().pop();
}
diff --git a/tests/registry/npm/tweetnacl/registry.json b/tests/registry/npm/tweetnacl/registry.json
index 084173a73..82e03387b 100644
--- a/tests/registry/npm/tweetnacl/registry.json
+++ b/tests/registry/npm/tweetnacl/registry.json
@@ -1 +1,78 @@
-{"name":"tweetnacl","dist-tags":{"latest":"0.14.5"},"description":"Port of TweetNaCl cryptographic library to JavaScript","readme":"TweetNaCl.js\n============\n\nPort of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/)\nto JavaScript for modern browsers and Node.js. Public domain.\n\n[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master)\n](https://travis-ci.org/dchest/tweetnacl-js)\n\nDemo: <https://dchest.github.io/tweetnacl-js/>\n\nDocumentation\n=============\n\n* [Overview](#overview)\n* [Audits](#audits)\n* [Installation](#installation)\n* [Examples](#examples)\n* [Usage](#usage)\n * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box)\n * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox)\n * [Scalar multiplication](#scalar-multiplication)\n * [Signatures](#signatures)\n * [Hashing](#hashing)\n * [Random bytes generation](#random-bytes-generation)\n * [Constant-time comparison](#constant-time-comparison)\n* [System requirements](#system-requirements)\n* [Development and testing](#development-and-testing)\n* [Benchmarks](#benchmarks)\n* [Contributors](#contributors)\n* [Who uses it](#who-uses-it)\n\n\nOverview\n--------\n\nThe primary goal of this project is to produce a translation of TweetNaCl to\nJavaScript which is as close as possible to the original C implementation, plus\na thin layer of idiomatic high-level API on top of it.\n\nThere are two versions, you can use either of them:\n\n* `nacl.js` is the port of TweetNaCl with minimum differences from the\n original + high-level API.\n\n* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with\n faster versions. (Used by default when importing NPM package.)\n\n\nAudits\n------\n\nTweetNaCl.js has been audited by [Cure53](https://cure53.de/) in January-February\n2017 (audit was sponsored by [Deletype](https://deletype.com)):\n\n> The overall outcome of this audit signals a particularly positive assessment\n> for TweetNaCl-js, as the testing team was unable to find any security\n> problems in the library. It has to be noted that this is an exceptionally\n> rare result of a source code audit for any project and must be seen as a true\n> testament to a development proceeding with security at its core.\n>\n> To reiterate, the TweetNaCl-js project, the source code was found to be\n> bug-free at this point.\n>\n> [...]\n>\n> In sum, the testing team is happy to recommend the TweetNaCl-js project as\n> likely one of the safer and more secure cryptographic tools among its\n> competition.\n\n[Read full audit report](https://cure53.de/tweetnacl.pdf)\n\n\nInstallation\n------------\n\nYou can install TweetNaCl.js via a package manager:\n\n[Yarn](https://yarnpkg.com/):\n\n $ yarn add tweetnacl\n\n[NPM](https://www.npmjs.org/):\n\n $ npm install tweetnacl\n\nor [download source code](https://github.com/dchest/tweetnacl-js/releases).\n\n\nExamples\n--------\nYou can find usage examples in our [wiki](https://github.com/dchest/tweetnacl-js/wiki/Examples).\n\n\nUsage\n-----\n\nAll API functions accept and return bytes as `Uint8Array`s. If you need to\nencode or decode strings, use functions from\n<https://github.com/dchest/tweetnacl-util-js> or one of the more robust codec\npackages.\n\nIn Node.js v4 and later `Buffer` objects are backed by `Uint8Array`s, so you\ncan freely pass them to TweetNaCl.js functions as arguments. The returned\nobjects are still `Uint8Array`s, so if you need `Buffer`s, you'll have to\nconvert them manually; make sure to convert using copying: `Buffer.from(array)`\n(or `new Buffer(array)` in Node.js v4 or earlier), instead of sharing:\n`Buffer.from(array.buffer)` (or `new Buffer(array.buffer)` Node 4 or earlier),\nbecause some functions return subarrays of their buffers.\n\n\n### Public-key authenticated encryption (box)\n\nImplements *x25519-xsalsa20-poly1305*.\n\n#### nacl.box.keyPair()\n\nGenerates a new random key pair for box and returns it as an object with\n`publicKey` and `secretKey` members:\n\n {\n publicKey: ..., // Uint8Array with 32-byte public key\n secretKey: ... // Uint8Array with 32-byte secret key\n }\n\n\n#### nacl.box.keyPair.fromSecretKey(secretKey)\n\nReturns a key pair for box with public key corresponding to the given secret\nkey.\n\n#### nacl.box(message, nonce, theirPublicKey, mySecretKey)\n\nEncrypts and authenticates message using peer's public key, our secret key, and\nthe given nonce, which must be unique for each distinct message for a key pair.\n\nReturns an encrypted and authenticated message, which is\n`nacl.box.overheadLength` longer than the original message.\n\n#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey)\n\nAuthenticates and decrypts the given box with peer's public key, our secret\nkey, and the given nonce.\n\nReturns the original message, or `null` if authentication fails.\n\n#### nacl.box.before(theirPublicKey, mySecretKey)\n\nReturns a precomputed shared key which can be used in `nacl.box.after` and\n`nacl.box.open.after`.\n\n#### nacl.box.after(message, nonce, sharedKey)\n\nSame as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`.\n\n#### nacl.box.open.after(box, nonce, sharedKey)\n\nSame as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`.\n\n#### Constants\n\n##### nacl.box.publicKeyLength = 32\n\nLength of public key in bytes.\n\n##### nacl.box.secretKeyLength = 32\n\nLength of secret key in bytes.\n\n##### nacl.box.sharedKeyLength = 32\n\nLength of precomputed shared key in bytes.\n\n##### nacl.box.nonceLength = 24\n\nLength of nonce in bytes.\n\n##### nacl.box.overheadLength = 16\n\nLength of overhead added to box compared to original message.\n\n\n### Secret-key authenticated encryption (secretbox)\n\nImplements *xsalsa20-poly1305*.\n\n#### nacl.secretbox(message, nonce, key)\n\nEncrypts and authenticates message using the key and the nonce. The nonce must\nbe unique for each distinct message for this key.\n\nReturns an encrypted and authenticated message, which is\n`nacl.secretbox.overheadLength` longer than the original message.\n\n#### nacl.secretbox.open(box, nonce, key)\n\nAuthenticates and decrypts the given secret box using the key and the nonce.\n\nReturns the original message, or `null` if authentication fails.\n\n#### Constants\n\n##### nacl.secretbox.keyLength = 32\n\nLength of key in bytes.\n\n##### nacl.secretbox.nonceLength = 24\n\nLength of nonce in bytes.\n\n##### nacl.secretbox.overheadLength = 16\n\nLength of overhead added to secret box compared to original message.\n\n\n### Scalar multiplication\n\nImplements *x25519*.\n\n#### nacl.scalarMult(n, p)\n\nMultiplies an integer `n` by a group element `p` and returns the resulting\ngroup element.\n\n#### nacl.scalarMult.base(n)\n\nMultiplies an integer `n` by a standard group element and returns the resulting\ngroup element.\n\n#### Constants\n\n##### nacl.scalarMult.scalarLength = 32\n\nLength of scalar in bytes.\n\n##### nacl.scalarMult.groupElementLength = 32\n\nLength of group element in bytes.\n\n\n### Signatures\n\nImplements [ed25519](http://ed25519.cr.yp.to).\n\n#### nacl.sign.keyPair()\n\nGenerates new random key pair for signing and returns it as an object with\n`publicKey` and `secretKey` members:\n\n {\n publicKey: ..., // Uint8Array with 32-byte public key\n secretKey: ... // Uint8Array with 64-byte secret key\n }\n\n#### nacl.sign.keyPair.fromSecretKey(secretKey)\n\nReturns a signing key pair with public key corresponding to the given\n64-byte secret key. The secret key must have been generated by\n`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`.\n\n#### nacl.sign.keyPair.fromSeed(seed)\n\nReturns a new signing key pair generated deterministically from a 32-byte seed.\nThe seed must contain enough entropy to be secure. This method is not\nrecommended for general use: instead, use `nacl.sign.keyPair` to generate a new\nkey pair from a random seed.\n\n#### nacl.sign(message, secretKey)\n\nSigns the message using the secret key and returns a signed message.\n\n#### nacl.sign.open(signedMessage, publicKey)\n\nVerifies the signed message and returns the message without signature.\n\nReturns `null` if verification failed.\n\n#### nacl.sign.detached(message, secretKey)\n\nSigns the message using the secret key and returns a signature.\n\n#### nacl.sign.detached.verify(message, signature, publicKey)\n\nVerifies the signature for the message and returns `true` if verification\nsucceeded or `false` if it failed.\n\n#### Constants\n\n##### nacl.sign.publicKeyLength = 32\n\nLength of signing public key in bytes.\n\n##### nacl.sign.secretKeyLength = 64\n\nLength of signing secret key in bytes.\n\n##### nacl.sign.seedLength = 32\n\nLength of seed for `nacl.sign.keyPair.fromSeed` in bytes.\n\n##### nacl.sign.signatureLength = 64\n\nLength of signature in bytes.\n\n\n### Hashing\n\nImplements *SHA-512*.\n\n#### nacl.hash(message)\n\nReturns SHA-512 hash of the message.\n\n#### Constants\n\n##### nacl.hash.hashLength = 64\n\nLength of hash in bytes.\n\n\n### Random bytes generation\n\n#### nacl.randomBytes(length)\n\nReturns a `Uint8Array` of the given length containing random bytes of\ncryptographic quality.\n\n**Implementation note**\n\nTweetNaCl.js uses the following methods to generate random bytes,\ndepending on the platform it runs on:\n\n* `window.crypto.getRandomValues` (WebCrypto standard)\n* `window.msCrypto.getRandomValues` (Internet Explorer 11)\n* `crypto.randomBytes` (Node.js)\n\nIf the platform doesn't provide a suitable PRNG, the following functions,\nwhich require random numbers, will throw exception:\n\n* `nacl.randomBytes`\n* `nacl.box.keyPair`\n* `nacl.sign.keyPair`\n\nOther functions are deterministic and will continue working.\n\nIf a platform you are targeting doesn't implement secure random number\ngenerator, but you somehow have a cryptographically-strong source of entropy\n(not `Math.random`!), and you know what you are doing, you can plug it into\nTweetNaCl.js like this:\n\n nacl.setPRNG(function(x, n) {\n // ... copy n random bytes into x ...\n });\n\nNote that `nacl.setPRNG` *completely replaces* internal random byte generator\nwith the one provided.\n\n\n### Constant-time comparison\n\n#### nacl.verify(x, y)\n\nCompares `x` and `y` in constant time and returns `true` if their lengths are\nnon-zero and equal, and their contents are equal.\n\nReturns `false` if either of the arguments has zero length, or arguments have\ndifferent lengths, or their contents differ.\n\n\nSystem requirements\n-------------------\n\nTweetNaCl.js supports modern browsers that have a cryptographically secure\npseudorandom number generator and typed arrays, including the latest versions\nof:\n\n* Chrome\n* Firefox\n* Safari (Mac, iOS)\n* Internet Explorer 11\n\nOther systems:\n\n* Node.js\n\n\nDevelopment and testing\n------------------------\n\nInstall NPM modules needed for development:\n\n $ npm install\n\nTo build minified versions:\n\n $ npm run build\n\nTests use minified version, so make sure to rebuild it every time you change\n`nacl.js` or `nacl-fast.js`.\n\n### Testing\n\nTo run tests in Node.js:\n\n $ npm run test-node\n\nBy default all tests described here work on `nacl.min.js`. To test other\nversions, set environment variable `NACL_SRC` to the file name you want to test.\nFor example, the following command will test fast minified version:\n\n $ NACL_SRC=nacl-fast.min.js npm run test-node\n\nTo run full suite of tests in Node.js, including comparing outputs of\nJavaScript port to outputs of the original C version:\n\n $ npm run test-node-all\n\nTo prepare tests for browsers:\n\n $ npm run build-test-browser\n\nand then open `test/browser/test.html` (or `test/browser/test-fast.html`) to\nrun them.\n\nTo run tests in both Node and Electron:\n\n $ npm test\n\n### Benchmarking\n\nTo run benchmarks in Node.js:\n\n $ npm run bench\n $ NACL_SRC=nacl-fast.min.js npm run bench\n\nTo run benchmarks in a browser, open `test/benchmark/bench.html` (or\n`test/benchmark/bench-fast.html`).\n\n\nBenchmarks\n----------\n\nFor reference, here are benchmarks from MacBook Pro (Retina, 13-inch, Mid 2014)\nlaptop with 2.6 GHz Intel Core i5 CPU (Intel) in Chrome 53/OS X and Xiaomi Redmi\nNote 3 smartphone with 1.8 GHz Qualcomm Snapdragon 650 64-bit CPU (ARM) in\nChrome 52/Android:\n\n| | nacl.js Intel | nacl-fast.js Intel | nacl.js ARM | nacl-fast.js ARM |\n| ------------- |:-------------:|:-------------------:|:-------------:|:-----------------:|\n| salsa20 | 1.3 MB/s | 128 MB/s | 0.4 MB/s | 43 MB/s |\n| poly1305 | 13 MB/s | 171 MB/s | 4 MB/s | 52 MB/s |\n| hash | 4 MB/s | 34 MB/s | 0.9 MB/s | 12 MB/s |\n| secretbox 1K | 1113 op/s | 57583 op/s | 334 op/s | 14227 op/s |\n| box 1K | 145 op/s | 718 op/s | 37 op/s | 368 op/s |\n| scalarMult | 171 op/s | 733 op/s | 56 op/s | 380 op/s |\n| sign | 77 op/s | 200 op/s | 20 op/s | 61 op/s |\n| sign.open | 39 op/s | 102 op/s | 11 op/s | 31 op/s |\n\n(You can run benchmarks on your devices by clicking on the links at the bottom\nof the [home page](https://tweetnacl.js.org)).\n\nIn short, with *nacl-fast.js* and 1024-byte messages you can expect to encrypt and\nauthenticate more than 57000 messages per second on a typical laptop or more than\n14000 messages per second on a $170 smartphone, sign about 200 and verify 100\nmessages per second on a laptop or 60 and 30 messages per second on a smartphone,\nper CPU core (with Web Workers you can do these operations in parallel),\nwhich is good enough for most applications.\n\n\nContributors\n------------\n\nSee AUTHORS.md file.\n\n\nThird-party libraries based on TweetNaCl.js\n-------------------------------------------\n\n* [forward-secrecy](https://github.com/alax/forward-secrecy) — Axolotl ratchet implementation\n* [nacl-stream](https://github.com/dchest/nacl-stream-js) - streaming encryption\n* [tweetnacl-auth-js](https://github.com/dchest/tweetnacl-auth-js) — implementation of [`crypto_auth`](http://nacl.cr.yp.to/auth.html)\n* [tweetnacl-sealed-box](https://github.com/whs/tweetnacl-sealed-box) — implementation of [`sealed boxes`](https://download.libsodium.org/doc/public-key_cryptography/sealed_boxes.html)\n* [chloride](https://github.com/dominictarr/chloride) - unified API for various NaCl modules\n\n\nWho uses it\n-----------\n\nSome notable users of TweetNaCl.js:\n\n* [GitHub](https://github.com)\n* [MEGA](https://github.com/meganz/webclient)\n* [Stellar](https://www.stellar.org/)\n* [miniLock](https://github.com/kaepora/miniLock)\n","versions":{"0.14.5":{"name":"tweetnacl","version":"0.14.5","description":"Port of TweetNaCl cryptographic library to JavaScript","main":"nacl-fast.js","types":"nacl.d.ts","directories":{"test":"test"},"scripts":{"build":"uglifyjs nacl.js -c -m -o nacl.min.js && uglifyjs nacl-fast.js -c -m -o nacl-fast.min.js","test-node":"tape test/*.js | faucet","test-node-all":"make -C test/c && tape test/*.js test/c/*.js | faucet","test-browser":"NACL_SRC=${NACL_SRC:='nacl.min.js'} && npm run build-test-browser && cat $NACL_SRC test/browser/_bundle.js | tape-run | faucet","build-test-browser":"browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null","test":"npm run test-node-all && npm run test-browser","bench":"node test/benchmark/bench.js","lint":"eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js"},"repository":{"type":"git","url":"git+https://github.com/dchest/tweetnacl-js.git"},"author":{"name":"TweetNaCl-js contributors"},"license":"Unlicense","bugs":{"url":"https://github.com/dchest/tweetnacl-js/issues"},"devDependencies":{"browserify":"^13.0.0","eslint":"^2.2.0","faucet":"^0.0.1","tap-browser-color":"^0.1.2","tape":"^4.4.0","tape-run":"^2.1.3","tweetnacl-util":"^0.13.3","uglify-js":"^2.6.1"},"browser":{"buffer":false,"crypto":false},"gitHead":"cce829e473b1ae299a9373b5140c713ee88f577f","_id":"tweetnacl@0.14.5","_shasum":"5ae68177f192d4456269d108afa93ff8743f4f64","_from":".","_npmVersion":"3.10.8","_nodeVersion":"7.0.0","dist":{"shasum":"5ae68177f192d4456269d108afa93ff8743f4f64","tarball":"http://localhost:4260/tweetnacl/tweetnacl-0.14.5.tgz","integrity":"sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHhdkxfW1hN14i/xMCWfhygkl+52bR+DkNVmdARtwc6wIgPxfsfj8jgtNcMyBXTnqqri0hI2MhOcZniVHZ8VDCcFk="}]}}},"homepage":"https://tweetnacl.js.org","repository":{"type":"git","url":"git+https://github.com/dchest/tweetnacl-js.git"},"author":{"name":"TweetNaCl-js contributors"},"bugs":{"url":"https://github.com/dchest/tweetnacl-js/issues"},"license":"Unlicense","readmeFilename":"README.md"}
+{
+ "name": "tweetnacl",
+ "dist-tags": {
+ "latest": "0.14.5"
+ },
+ "description": "Port of TweetNaCl cryptographic library to JavaScript",
+ "versions": {
+ "0.14.5": {
+ "name": "tweetnacl",
+ "version": "0.14.5",
+ "description": "Port of TweetNaCl cryptographic library to JavaScript",
+ "main": "nacl-fast.js",
+ "types": "nacl.d.ts",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "build": "uglifyjs nacl.js -c -m -o nacl.min.js && uglifyjs nacl-fast.js -c -m -o nacl-fast.min.js",
+ "test-node": "tape test/*.js | faucet",
+ "test-node-all": "make -C test/c && tape test/*.js test/c/*.js | faucet",
+ "test-browser": "NACL_SRC=${NACL_SRC:='nacl.min.js'} && npm run build-test-browser && cat $NACL_SRC test/browser/_bundle.js | tape-run | faucet",
+ "build-test-browser": "browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null",
+ "test": "npm run test-node-all && npm run test-browser",
+ "bench": "node test/benchmark/bench.js",
+ "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/dchest/tweetnacl-js.git"
+ },
+ "author": {
+ "name": "TweetNaCl-js contributors"
+ },
+ "license": "Unlicense",
+ "bugs": {
+ "url": "https://github.com/dchest/tweetnacl-js/issues"
+ },
+ "devDependencies": {
+ "browserify": "^13.0.0",
+ "eslint": "^2.2.0",
+ "faucet": "^0.0.1",
+ "tap-browser-color": "^0.1.2",
+ "tape": "^4.4.0",
+ "tape-run": "^2.1.3",
+ "tweetnacl-util": "^0.13.3",
+ "uglify-js": "^2.6.1"
+ },
+ "browser": {
+ "buffer": false,
+ "crypto": false
+ },
+ "gitHead": "cce829e473b1ae299a9373b5140c713ee88f577f",
+ "_id": "tweetnacl@0.14.5",
+ "_shasum": "5ae68177f192d4456269d108afa93ff8743f4f64",
+ "_from": ".",
+ "_npmVersion": "3.10.8",
+ "_nodeVersion": "7.0.0",
+ "dist": {
+ "shasum": "5ae68177f192d4456269d108afa93ff8743f4f64",
+ "tarball": "http://localhost:4260/tweetnacl/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+ }
+ }
+ },
+ "homepage": "https://tweetnacl.js.org",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/dchest/tweetnacl-js.git"
+ },
+ "author": {
+ "name": "TweetNaCl-js contributors"
+ },
+ "bugs": {
+ "url": "https://github.com/dchest/tweetnacl-js/issues"
+ },
+ "license": "Unlicense",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/type-detect/registry.json b/tests/registry/npm/type-detect/registry.json
index 9c04ee5c7..0ea3ddc10 100644
--- a/tests/registry/npm/type-detect/registry.json
+++ b/tests/registry/npm/type-detect/registry.json
@@ -1 +1,125 @@
-{"name":"type-detect","description":"Improved typeof detection for node.js and the browser.","dist-tags":{"latest":"4.0.8"},"versions":{"4.0.8":{"name":"type-detect","description":"Improved typeof detection for node.js and the browser.","license":"MIT","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"files":["index.js","type-detect.js"],"main":"./type-detect.js","repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/type-detect.git"},"scripts":{"bench":"node bench","build":"rollup -c rollup.conf.js","commit-msg":"commitlint -x angular","lint":"eslint --ignore-path .gitignore .","prepare":"cross-env NODE_ENV=production npm run build","semantic-release":"semantic-release pre && npm publish && semantic-release post","pretest:node":"cross-env NODE_ENV=test npm run build","pretest:browser":"cross-env NODE_ENV=test npm run build","test":"npm run test:node && npm run test:browser","test:browser":"karma start --singleRun=true","test:node":"nyc mocha type-detect.test.js","posttest:node":"nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage","posttest:browser":"npm run upload-coverage","upload-coverage":"codecov"},"eslintConfig":{"env":{"es6":true},"extends":["strict/es6"],"globals":{"HTMLElement":false},"rules":{"complexity":0,"max-statements":0,"prefer-rest-params":0}},"devDependencies":{"@commitlint/cli":"^4.2.2","benchmark":"^2.1.0","buble":"^0.16.0","codecov":"^3.0.0","commitlint-config-angular":"^4.2.1","cross-env":"^5.1.1","eslint":"^4.10.0","eslint-config-strict":"^14.0.0","eslint-plugin-filenames":"^1.2.0","husky":"^0.14.3","karma":"^1.7.1","karma-chrome-launcher":"^2.2.0","karma-coverage":"^1.1.1","karma-detect-browsers":"^2.2.5","karma-edge-launcher":"^0.4.2","karma-firefox-launcher":"^1.0.1","karma-ie-launcher":"^1.0.0","karma-mocha":"^1.3.0","karma-opera-launcher":"^1.0.0","karma-safari-launcher":"^1.0.0","karma-safaritechpreview-launcher":"0.0.6","karma-sauce-launcher":"^1.2.0","mocha":"^4.0.1","nyc":"^11.3.0","rollup":"^0.50.0","rollup-plugin-buble":"^0.16.0","rollup-plugin-commonjs":"^8.2.6","rollup-plugin-istanbul":"^1.1.0","rollup-plugin-node-resolve":"^3.0.0","semantic-release":"^8.2.0","simple-assert":"^1.0.0"},"engines":{"node":">=4"},"version":"4.0.8","gitHead":"a40d8395f06507edd3e4806cb3fe5a878f6a6551","bugs":{"url":"https://github.com/chaijs/type-detect/issues"},"_id":"type-detect@4.0.8","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","dist":{"integrity":"sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==","shasum":"7646fb5f18871cfbb7749e69bd39a6388eb7450c","tarball":"http://localhost:4260/type-detect/type-detect-4.0.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEFxImpCxU+MuBlIeBAmerqd0RsGClH5O5G220HhFDPjAiBu9IIino0NDpaZJe49jwAOU5KIoB0BfJu8oPqZi0uLhw=="}]},"directories":{}}},"readme":"<h1 align=center>\n <a href=\"http://chaijs.com\" title=\"Chai Documentation\">\n <img alt=\"ChaiJS\" src=\"http://chaijs.com/img/chai-logo.png\"/> type-detect\n </a>\n</h1>\n<br>\n<p align=center>\n Improved typeof detection for <a href=\"http://nodejs.org\">node</a> and the browser.\n</p>\n\n<p align=center>\n <a href=\"./LICENSE\">\n <img\n alt=\"license:mit\"\n src=\"https://img.shields.io/badge/license-mit-green.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://github.com/chaijs/type-detect/releases\">\n <img\n alt=\"tag:?\"\n src=\"https://img.shields.io/github/tag/chaijs/type-detect.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://travis-ci.org/chaijs/type-detect\">\n <img\n alt=\"build:?\"\n src=\"https://img.shields.io/travis/chaijs/type-detect/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://coveralls.io/r/chaijs/type-detect\">\n <img\n alt=\"coverage:?\"\n src=\"https://img.shields.io/coveralls/chaijs/type-detect/master.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/type-detect\">\n <img\n alt=\"npm:?\"\n src=\"https://img.shields.io/npm/v/type-detect.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://www.npmjs.com/packages/type-detect\">\n <img\n alt=\"dependencies:?\"\n src=\"https://img.shields.io/npm/dm/type-detect.svg?style=flat-square\"\n />\n </a>\n <a href=\"\">\n <img\n alt=\"devDependencies:?\"\n src=\"https://img.shields.io/david/chaijs/type-detect.svg?style=flat-square\"\n />\n </a>\n <br/>\n <table>\n <tr><th colspan=6>Supported Browsers</th></tr> <tr>\n <th align=center><img src=\"https://camo.githubusercontent.com/ab586f11dfcb49bf5f2c2fa9adadc5e857de122a/687474703a2f2f73766773686172652e636f6d2f692f3278532e737667\" alt=\"\"> Chrome</th>\n <th align=center><img src=\"https://camo.githubusercontent.com/98cca3108c18dcfaa62667b42046540c6822cdac/687474703a2f2f73766773686172652e636f6d2f692f3279352e737667\" alt=\"\"> Edge</th>\n <th align=center><img src=\"https://camo.githubusercontent.com/acdcb09840a9e1442cbaf1b684f95ab3c3f41cf4/687474703a2f2f73766773686172652e636f6d2f692f3279462e737667\" alt=\"\"> Firefox</th>\n <th align=center><img src=\"https://camo.githubusercontent.com/728f8cb0bee9ed58ab85e39266f1152c53e0dffd/687474703a2f2f73766773686172652e636f6d2f692f3278342e737667\" alt=\"\"> Safari</th>\n <th align=center><img src=\"https://camo.githubusercontent.com/96a2317034dee0040d0a762e7a30c3c650c45aac/687474703a2f2f73766773686172652e636f6d2f692f3279532e737667\" alt=\"\"> IE</th>\n </tr><tr>\n <td align=center>✅</td>\n <td align=center>✅</td>\n <td align=center>✅</td>\n <td align=center>✅</td>\n <td align=center>9, 10, 11</td>\n </tr>\n </table>\n <br>\n <a href=\"https://chai-slack.herokuapp.com/\">\n <img\n alt=\"Join the Slack chat\"\n src=\"https://img.shields.io/badge/slack-join%20chat-E2206F.svg?style=flat-square\"\n />\n </a>\n <a href=\"https://gitter.im/chaijs/chai\">\n <img\n alt=\"Join the Gitter chat\"\n src=\"https://img.shields.io/badge/gitter-join%20chat-D0104D.svg?style=flat-square\"\n />\n </a>\n</p>\n\n## What is Type-Detect?\n\nType Detect is a module which you can use to detect the type of a given object. It returns a string representation of the object's type, either using [`typeof`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-typeof-operator) or [`@@toStringTag`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-symbol.tostringtag). It also normalizes some object names for consistency among browsers.\n\n## Why?\n\nThe `typeof` operator will only specify primitive values; everything else is `\"object\"` (including `null`, arrays, regexps, etc). Many developers use `Object.prototype.toString()` - which is a fine alternative and returns many more types (null returns `[object Null]`, Arrays as `[object Array]`, regexps as `[object RegExp]` etc). \n\nSadly, `Object.prototype.toString` is slow, and buggy. By slow - we mean it is slower than `typeof`. By buggy - we mean that some values (like Promises, the global object, iterators, dataviews, a bunch of HTML elements) all report different things in different browsers.\n\n`type-detect` fixes all of the shortcomings with `Object.prototype.toString`. We have extra code to speed up checks of JS and DOM objects, as much as 20-30x faster for some values. `type-detect` also fixes any consistencies with these objects.\n\n## Installation\n\n### Node.js\n\n`type-detect` is available on [npm](http://npmjs.org). To install it, type:\n\n $ npm install type-detect\n\n### Browsers\n\nYou can also use it within the browser; install via npm and use the `type-detect.js` file found within the download. For example:\n\n```html\n<script src=\"./node_modules/type-detect/type-detect.js\"></script>\n```\n\n## Usage\n\nThe primary export of `type-detect` is function that can serve as a replacement for `typeof`. The results of this function will be more specific than that of native `typeof`.\n\n```js\nvar type = require('type-detect');\n```\n\n#### array\n\n```js\nassert(type([]) === 'Array');\nassert(type(new Array()) === 'Array');\n```\n\n#### regexp\n\n```js\nassert(type(/a-z/gi) === 'RegExp');\nassert(type(new RegExp('a-z')) === 'RegExp');\n```\n\n#### function\n\n```js\nassert(type(function () {}) === 'function');\n```\n\n#### arguments\n\n```js\n(function () {\n assert(type(arguments) === 'Arguments');\n})();\n```\n\n#### date\n\n```js\nassert(type(new Date) === 'Date');\n```\n\n#### number\n\n```js\nassert(type(1) === 'number');\nassert(type(1.234) === 'number');\nassert(type(-1) === 'number');\nassert(type(-1.234) === 'number');\nassert(type(Infinity) === 'number');\nassert(type(NaN) === 'number');\nassert(type(new Number(1)) === 'Number'); // note - the object version has a capital N\n```\n\n#### string\n\n```js\nassert(type('hello world') === 'string');\nassert(type(new String('hello')) === 'String'); // note - the object version has a capital S\n```\n\n#### null\n\n```js\nassert(type(null) === 'null');\nassert(type(undefined) !== 'null');\n```\n\n#### undefined\n\n```js\nassert(type(undefined) === 'undefined');\nassert(type(null) !== 'undefined');\n```\n\n#### object\n\n```js\nvar Noop = function () {};\nassert(type({}) === 'Object');\nassert(type(Noop) !== 'Object');\nassert(type(new Noop) === 'Object');\nassert(type(new Object) === 'Object');\n```\n\n#### ECMA6 Types\n\nAll new ECMAScript 2015 objects are also supported, such as Promises and Symbols:\n\n```js\nassert(type(new Map() === 'Map');\nassert(type(new WeakMap()) === 'WeakMap');\nassert(type(new Set()) === 'Set');\nassert(type(new WeakSet()) === 'WeakSet');\nassert(type(Symbol()) === 'symbol');\nassert(type(new Promise(callback) === 'Promise');\nassert(type(new Int8Array()) === 'Int8Array');\nassert(type(new Uint8Array()) === 'Uint8Array');\nassert(type(new UInt8ClampedArray()) === 'Uint8ClampedArray');\nassert(type(new Int16Array()) === 'Int16Array');\nassert(type(new Uint16Array()) === 'Uint16Array');\nassert(type(new Int32Array()) === 'Int32Array');\nassert(type(new UInt32Array()) === 'Uint32Array');\nassert(type(new Float32Array()) === 'Float32Array');\nassert(type(new Float64Array()) === 'Float64Array');\nassert(type(new ArrayBuffer()) === 'ArrayBuffer');\nassert(type(new DataView(arrayBuffer)) === 'DataView');\n```\n\nAlso, if you use `Symbol.toStringTag` to change an Objects return value of the `toString()` Method, `type()` will return this value, e.g:\n\n```js\nvar myObject = {};\nmyObject[Symbol.toStringTag] = 'myCustomType';\nassert(type(myObject) === 'myCustomType');\n```\n","author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/chaijs/type-detect.git"},"homepage":"https://github.com/chaijs/type-detect#readme","bugs":{"url":"https://github.com/chaijs/type-detect/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "type-detect",
+ "description": "Improved typeof detection for node.js and the browser.",
+ "dist-tags": {
+ "latest": "4.0.8"
+ },
+ "versions": {
+ "4.0.8": {
+ "name": "type-detect",
+ "description": "Improved typeof detection for node.js and the browser.",
+ "license": "MIT",
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "files": [
+ "index.js",
+ "type-detect.js"
+ ],
+ "main": "./type-detect.js",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/type-detect.git"
+ },
+ "scripts": {
+ "bench": "node bench",
+ "build": "rollup -c rollup.conf.js",
+ "commit-msg": "commitlint -x angular",
+ "lint": "eslint --ignore-path .gitignore .",
+ "prepare": "cross-env NODE_ENV=production npm run build",
+ "semantic-release": "semantic-release pre && npm publish && semantic-release post",
+ "pretest:node": "cross-env NODE_ENV=test npm run build",
+ "pretest:browser": "cross-env NODE_ENV=test npm run build",
+ "test": "npm run test:node && npm run test:browser",
+ "test:browser": "karma start --singleRun=true",
+ "test:node": "nyc mocha type-detect.test.js",
+ "posttest:node": "nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage",
+ "posttest:browser": "npm run upload-coverage",
+ "upload-coverage": "codecov"
+ },
+ "eslintConfig": {
+ "env": {
+ "es6": true
+ },
+ "extends": [
+ "strict/es6"
+ ],
+ "globals": {
+ "HTMLElement": false
+ },
+ "rules": {
+ "complexity": 0,
+ "max-statements": 0,
+ "prefer-rest-params": 0
+ }
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^4.2.2",
+ "benchmark": "^2.1.0",
+ "buble": "^0.16.0",
+ "codecov": "^3.0.0",
+ "commitlint-config-angular": "^4.2.1",
+ "cross-env": "^5.1.1",
+ "eslint": "^4.10.0",
+ "eslint-config-strict": "^14.0.0",
+ "eslint-plugin-filenames": "^1.2.0",
+ "husky": "^0.14.3",
+ "karma": "^1.7.1",
+ "karma-chrome-launcher": "^2.2.0",
+ "karma-coverage": "^1.1.1",
+ "karma-detect-browsers": "^2.2.5",
+ "karma-edge-launcher": "^0.4.2",
+ "karma-firefox-launcher": "^1.0.1",
+ "karma-ie-launcher": "^1.0.0",
+ "karma-mocha": "^1.3.0",
+ "karma-opera-launcher": "^1.0.0",
+ "karma-safari-launcher": "^1.0.0",
+ "karma-safaritechpreview-launcher": "0.0.6",
+ "karma-sauce-launcher": "^1.2.0",
+ "mocha": "^4.0.1",
+ "nyc": "^11.3.0",
+ "rollup": "^0.50.0",
+ "rollup-plugin-buble": "^0.16.0",
+ "rollup-plugin-commonjs": "^8.2.6",
+ "rollup-plugin-istanbul": "^1.1.0",
+ "rollup-plugin-node-resolve": "^3.0.0",
+ "semantic-release": "^8.2.0",
+ "simple-assert": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "version": "4.0.8",
+ "gitHead": "a40d8395f06507edd3e4806cb3fe5a878f6a6551",
+ "bugs": {
+ "url": "https://github.com/chaijs/type-detect/issues"
+ },
+ "_id": "type-detect@4.0.8",
+ "_npmVersion": "5.6.0",
+ "_nodeVersion": "8.9.4",
+ "dist": {
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "shasum": "7646fb5f18871cfbb7749e69bd39a6388eb7450c",
+ "tarball": "http://localhost:4260/type-detect/type-detect-4.0.8.tgz"
+ },
+ "directories": {}
+ }
+ },
+ "author": {
+ "name": "Jake Luer",
+ "email": "jake@alogicalparadox.com",
+ "url": "http://alogicalparadox.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/chaijs/type-detect.git"
+ },
+ "homepage": "https://github.com/chaijs/type-detect#readme",
+ "bugs": {
+ "url": "https://github.com/chaijs/type-detect/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/type-fest/registry.json b/tests/registry/npm/type-fest/registry.json
index 46e577c7c..b68a7e409 100644
--- a/tests/registry/npm/type-fest/registry.json
+++ b/tests/registry/npm/type-fest/registry.json
@@ -1 +1,84 @@
-{"name":"type-fest","dist-tags":{"latest":"0.20.2"},"versions":{"0.20.2":{"name":"type-fest","version":"0.20.2","description":"A collection of essential TypeScript types","license":"(MIT OR CC0-1.0)","repository":{"type":"git","url":"git+https://github.com/sindresorhus/type-fest.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"engines":{"node":">=10"},"scripts":{"//test":"xo && tsd && tsc","test":"xo && tsc"},"devDependencies":{"@sindresorhus/tsconfig":"~0.7.0","tsd":"^0.13.1","typescript":"^4.1.2","xo":"^0.35.0"},"types":"./index.d.ts","typesVersions":{">=4.1":{"*":["ts41/*"]}},"xo":{"rules":{"@typescript-eslint/ban-types":"off","@typescript-eslint/indent":"off","node/no-unsupported-features/es-builtins":"off"}},"gitHead":"0337bcdebdad653915d35bf39428abf702ae5de5","bugs":{"url":"https://github.com/sindresorhus/type-fest/issues"},"_id":"type-fest@0.20.2","_nodeVersion":"10.22.1","_npmVersion":"6.14.9","dist":{"integrity":"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==","shasum":"1bf207f4b28f91583666cb5fbd327887301cd5f4","tarball":"http://localhost:4260/type-fest/type-fest-0.20.2.tgz","fileCount":42,"unpackedSize":110590,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfwMvsCRA9TVsSAnZWagAAFK4P/1xhVvs8GAjTc3fFGKrj\nyVBiieGROEbrE7aVRcjEMZXIrONRjxQPRwzwxeVehh/IJhVjL75NYhK+C8QH\nWazIZjIJYRgf6Pq70GSrSNug44hPebhIb3X7xrjj0mLvpUwezO24nN4jzTWi\nyC8/KgzIYK6/en3ZoG3OewfzO6xXomEs/j0xRKrgFXeEzGcxlBIHleGXdaSZ\ndeH4K45VPdSq3eccM0fcaILrRolL/EON20BN+dj7wYmMCX6ND+kmqcWYcmqV\n7IxOxYwq76dkPkI3bsg2aWbXYPIERWDlOkmZBijXiMYWral9fmdDl6BJUbZ2\nCzqCf5vMY5ZPbQTEJ+DhDf9soQf1oYFnMs4ytiynsdlyaRYufl2HSZnSbgY7\numUexWG6Ftt2D0UxFwdRX6uIXUvnEEUHiYRKaUuQccj7iSG7sNkDvExHeg7w\n5R/RIBzCFc/VVk1AVgIVPfe5e9POeqRwyNEjo02w45ybT/tE2J4YlS6kE6Wu\nIPKoHR1MI3LtgosNfULDc6tmbJH2VfjgdzfbHZY49xpu6fZKi7RAc3N1kSR9\njyVRBNwGO6F4ze8woXirRqaldAtppHk0DNr45EjdrlOdHfMroAre9PVT5MLD\nz7mg/tYQvriCxtyH0+ZA+hFFpOZAcbV8LQjattIod9OhT+6TY2D8L5k2IA7U\n5FyD\r\n=lUVY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQhBNZB0M7zjJ+L+RSqyml87iQ5+mWTDUO/yFPYa+vQAiBdmY3HoCer5WgTuYktiKMiy+Pu86GHqlnYLtp8+7WeyQ=="}]},"directories":{},"_hasShrinkwrap":false}},"description":"A collection of essential TypeScript types","homepage":"https://github.com/sindresorhus/type-fest#readme","repository":{"type":"git","url":"git+https://github.com/sindresorhus/type-fest.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/sindresorhus/type-fest/issues"},"license":"(MIT OR CC0-1.0)","readme":"<div align=\"center\">\n\t<br>\n\t<br>\n\t<img src=\"media/logo.svg\" alt=\"type-fest\" height=\"300\">\n\t<br>\n\t<br>\n\t<b>A collection of essential TypeScript types</b>\n\t<br>\n\t<br>\n\t<br>\n\t<br>\n\t<hr>\n\t<div align=\"center\">\n\t\t<p>\n\t\t\t<p>\n\t\t\t\t<sup>\n\t\t\t\t\t<a href=\"https://github.com/sponsors/sindresorhus\">Sindre Sorhus' open source work is supported by the community</a>\n\t\t\t\t</sup>\n\t\t\t</p>\n\t\t\t<sup>Special thanks to:</sup>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<a href=\"https://standardresume.co/tech\">\n\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/standard-resume-logo.svg\" width=\"180\"/>\n\t\t\t</a>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<a href=\"https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=type-fest&utm_source=github\">\n\t\t\t\t<div>\n\t\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/workos-logo-white-bg.svg\" width=\"220\" alt=\"WorkOS\">\n\t\t\t\t</div>\n\t\t\t\t<b>Your app, enterprise-ready.</b>\n\t\t\t\t<div>\n\t\t\t\t\t<sub>Start selling to enterprise customers with just a few lines of code.</sub>\n\t\t\t\t\t<br>\n\t\t\t\t\t<sup>Add Single Sign-On (and more) in minutes instead of months.</sup>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<a href=\"https://www.useanvil.com/?utm_source=sindresorhus#gh-light-mode-only\">\n\t\t\t\t<div>\n\t\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/anvil-logo-light.svg\" width=\"200\" alt=\"Anvil\">\n\t\t\t\t</div>\n\t\t\t\t<br>\n\t\t\t\t<b>Paperwork that makes the data work.</b>\n\t\t\t\t<div>\n\t\t\t\t\t<sub>\n\t\t\t\t\tEasy APIs for paperwork. PDF generation, e-signature and embeddable no-code webforms.\n\t\t\t\t\t<br>\n\t\t\t\t\tThe easiest way to build paperwork automation into your product.\n\t\t\t\t\t</sub>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t\t<a href=\"https://www.useanvil.com/?utm_source=sindresorhus#gh-dark-mode-only\">\n\t\t\t\t<div>\n\t\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/anvil-logo-dark.svg\" width=\"200\" alt=\"Anvil\">\n\t\t\t\t</div>\n\t\t\t\t<br>\n\t\t\t\t<b>Paperwork that makes the data work.</b>\n\t\t\t\t<div>\n\t\t\t\t\t<sub>\n\t\t\t\t\tEasy APIs for paperwork. PDF generation, e-signature and embeddable no-code webforms.\n\t\t\t\t\t<br>\n\t\t\t\t\tThe easiest way to build paperwork automation into your product.\n\t\t\t\t\t</sub>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<a href=\"https://sizzy.co/?utm_campaign=github_repo&utm_source=github&utm_medium=referral&utm_content=type-fest&utm_term=sindre\">\n\t\t\t\t<div>\n\t\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/sizzy-logo.png\" width=\"240\" alt=\"Sizzy\">\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<sub>\n\t\t\t\t\t<b>Before Sizzy:</b> web development is stressing you out, responsive design is hard, you have an overwhelming amount of opened tabs & apps.\n\t\t\t\t\t<br>\n\t\t\t\t\t<b>After Sizzy:</b> all the tools you need in one place, responsive design is a breeze, no more context switching.\n\t\t\t\t\t</sub>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t</p>\n\t</div>\n\t<br>\n\t<hr>\n</div>\n<br>\n<br>\n\n[![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://giphy.com/gifs/illustration-rainbow-unicorn-26AHG5KGFxSkUWw1i)\n[![npm dependents](https://badgen.net/npm/dependents/type-fest)](https://www.npmjs.com/package/type-fest?activeTab=dependents)\n[![npm downloads](https://badgen.net/npm/dt/type-fest)](https://www.npmjs.com/package/type-fest)\n[![Docs](https://paka.dev/badges/v0/cute.svg)](https://paka.dev/npm/type-fest)\n\nMany of the types here should have been built-in. You can help by suggesting some of them to the [TypeScript project](https://github.com/Microsoft/TypeScript/blob/main/CONTRIBUTING.md).\n\nEither add this package as a dependency or copy-paste the needed types. No credit required. 👌\n\nPR welcome for additional commonly needed types and docs improvements. Read the [contributing guidelines](.github/contributing.md) first.\n\n**Help wanted with reviewing [proposals](https://github.com/sindresorhus/type-fest/issues) and [pull requests](https://github.com/sindresorhus/type-fest/pulls).**\n\n## Install\n\n```sh\nnpm install type-fest\n```\n\n*Requires TypeScript >=4.7*\n\n## Usage\n\n```ts\nimport type {Except} from 'type-fest';\n\ntype Foo = {\n\tunicorn: string;\n\trainbow: boolean;\n};\n\ntype FooWithoutRainbow = Except<Foo, 'rainbow'>;\n//=> {unicorn: string}\n```\n\n## API\n\nClick the type names for complete docs.\n\n### Basic\n\n- [`Primitive`](source/primitive.d.ts) - Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).\n- [`Class`](source/basic.d.ts) - Matches a [`class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes).\n- [`Constructor`](source/basic.d.ts) - Matches a [`class` constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes).\n- [`TypedArray`](source/typed-array.d.ts) - Matches any [typed array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray), like `Uint8Array` or `Float64Array`.\n- [`ObservableLike`](source/observable-like.d.ts) - Matches a value that is like an [Observable](https://github.com/tc39/proposal-observable).\n\n### Utilities\n\n- [`EmptyObject`](source/empty-object.d.ts) - Represents a strictly empty plain object, the `{}` value.\n- [`IsEmptyObject`](source/empty-object.d.ts) - Returns a `boolean` for whether the type is strictly equal to an empty plain object, the `{}` value.\n- [`Except`](source/except.d.ts) - Create a type from an object type without certain keys. This is a stricter version of [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys).\n- [`Writable`](source/writable.d.ts) - Create a type that strips `readonly` from all or some of an object's keys. The inverse of `Readonly<T>`.\n- [`Merge`](source/merge.d.ts) - Merge two types into a new type. Keys of the second type overrides keys of the first type.\n- [`MergeExclusive`](source/merge-exclusive.d.ts) - Create a type that has mutually exclusive keys.\n- [`RequireAtLeastOne`](source/require-at-least-one.d.ts) - Create a type that requires at least one of the given keys.\n- [`RequireExactlyOne`](source/require-exactly-one.d.ts) - Create a type that requires exactly a single key of the given keys and disallows more.\n- [`RequireAllOrNone`](source/require-all-or-none.d.ts) - Create a type that requires all of the given keys or none of the given keys.\n- [`OmitIndexSignature`](source/omit-index-signature.d.ts) - Omit any index signatures from the given object type, leaving only explicitly defined properties.\n- [`PickIndexSignature`](source/pick-index-signature.d.ts) - Pick only index signatures from the given object type, leaving out all explicitly defined properties.\n- [`PartialDeep`](source/partial-deep.d.ts) - Create a deeply optional version of another type. Use [`Partial<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype) if you only need one level deep.\n- [`PartialOnUndefinedDeep`](source/partial-on-undefined-deep.d.ts) - Create a deep version of another type where all keys accepting `undefined` type are set to optional.\n- [`ReadonlyDeep`](source/readonly-deep.d.ts) - Create a deeply immutable version of an `object`/`Map`/`Set`/`Array` type. Use [`Readonly<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype) if you only need one level deep.\n- [`LiteralUnion`](source/literal-union.d.ts) - Create a union type by combining primitive types and literal types without sacrificing auto-completion in IDEs for the literal type part of the union. Workaround for [Microsoft/TypeScript#29729](https://github.com/Microsoft/TypeScript/issues/29729).\n- [`Opaque`](source/opaque.d.ts) - Create an [opaque type](https://codemix.com/opaque-types-in-javascript/).\n- [`UnwrapOpaque`](source/opaque.d.ts) - Revert an [opaque type](https://codemix.com/opaque-types-in-javascript/) back to its original type.\n- [`InvariantOf`](source/invariant-of.d.ts) - Create an [invariant type](https://basarat.gitbook.io/typescript/type-system/type-compatibility#footnote-invariance), which is a type that does not accept supertypes and subtypes.\n- [`SetOptional`](source/set-optional.d.ts) - Create a type that makes the given keys optional.\n- [`SetRequired`](source/set-required.d.ts) - Create a type that makes the given keys required.\n- [`SetNonNullable`](source/set-non-nullable.d.ts) - Create a type that makes the given keys non-nullable.\n- [`ValueOf`](source/value-of.d.ts) - Create a union of the given object's values, and optionally specify which keys to get the values from.\n- [`ConditionalKeys`](source/conditional-keys.d.ts) - Extract keys from a shape where values extend the given `Condition` type.\n- [`ConditionalPick`](source/conditional-pick.d.ts) - Like `Pick` except it selects properties from a shape where the values extend the given `Condition` type.\n- [`ConditionalPickDeep`](source/conditional-pick-deep.d.ts) - Like `ConditionalPick` except that it selects the properties deeply.\n- [`ConditionalExcept`](source/conditional-except.d.ts) - Like `Omit` except it removes properties from a shape where the values extend the given `Condition` type.\n- [`UnionToIntersection`](source/union-to-intersection.d.ts) - Convert a union type to an intersection type.\n- [`LiteralToPrimitive`](source/literal-to-primitive.d.ts) - Convert a [literal type](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) to the [primitive type](source/primitive.d.ts) it belongs to.\n- [`Stringified`](source/stringified.d.ts) - Create a type with the keys of the given type changed to `string` type.\n- [`IterableElement`](source/iterable-element.d.ts) - Get the element type of an `Iterable`/`AsyncIterable`. For example, an array or a generator.\n- [`Entry`](source/entry.d.ts) - Create a type that represents the type of an entry of a collection.\n- [`Entries`](source/entries.d.ts) - Create a type that represents the type of the entries of a collection.\n- [`SetReturnType`](source/set-return-type.d.ts) - Create a function type with a return type of your choice and the same parameters as the given function type.\n- [`Simplify`](source/simplify.d.ts) - Useful to flatten the type output to improve type hints shown in editors. And also to transform an interface into a type to aide with assignability.\n- [`Get`](source/get.d.ts) - Get a deeply-nested property from an object using a key path, like [Lodash's `.get()`](https://lodash.com/docs/latest#get) function.\n- [`StringKeyOf`](source/string-key-of.d.ts) - Get keys of the given type as strings.\n- [`Schema`](source/schema.d.ts) - Create a deep version of another object type where property values are recursively replaced into a given value type.\n- [`Exact`](source/exact.d.ts) - Create a type that does not allow extra properties.\n- [`OptionalKeysOf`](source/optional-keys-of.d.ts) - Extract all optional keys from the given type.\n- [`HasOptionalKeys`](source/has-optional-keys.d.ts) - Create a `true`/`false` type depending on whether the given type has any optional fields.\n- [`RequiredKeysOf`](source/required-keys-of.d.ts) - Extract all required keys from the given type.\n- [`HasRequiredKeys`](source/has-required-keys.d.ts) - Create a `true`/`false` type depending on whether the given type has any required fields.\n- [`Spread`](source/spread.d.ts) - Mimic the type inferred by TypeScript when merging two objects or two arrays/tuples using the spread syntax.\n\n### JSON\n\n- [`Jsonify`](source/jsonify.d.ts) - Transform a type to one that is assignable to the `JsonValue` type.\n- [`JsonPrimitive`](source/basic.d.ts) - Matches a JSON primitive.\n- [`JsonObject`](source/basic.d.ts) - Matches a JSON object.\n- [`JsonArray`](source/basic.d.ts) - Matches a JSON array.\n- [`JsonValue`](source/basic.d.ts) - Matches any valid JSON value.\n\n### Async\n\n- [`Promisable`](source/promisable.d.ts) - Create a type that represents either the value or the value wrapped in `PromiseLike`.\n- [`AsyncReturnType`](source/async-return-type.d.ts) - Unwrap the return type of a function that returns a `Promise`.\n- [`Asyncify`](source/asyncify.d.ts) - Create an async version of the given function type.\n\n### String\n\n- [`Trim`](source/trim.d.ts) - Remove leading and trailing spaces from a string.\n- [`Split`](source/split.d.ts) - Represents an array of strings split using a given character or character set.\n- [`Replace`](source/replace.d.ts) - Represents a string with some or all matches replaced by a replacement.\n\n### Array\n\n- [`Includes`](source/includes.d.ts) - Returns a boolean for whether the given array includes the given item.\n- [`Join`](source/join.d.ts) - Join an array of strings and/or numbers using the given string as a delimiter.\n- [`LastArrayElement`](source/last-array-element.d.ts) - Extracts the type of the last element of an array.\n- [`FixedLengthArray`](source/fixed-length-array.d.ts) - Create a type that represents an array of the given type and length.\n- [`MultidimensionalArray`](source/multidimensional-array.d.ts) - Create a type that represents a multidimensional array of the given type and dimensions.\n- [`MultidimensionalReadonlyArray`](source/multidimensional-readonly-array.d.ts) - Create a type that represents a multidimensional readonly array of the given type and dimensions.\n- [`ReadonlyTuple`](source/readonly-tuple.d.ts) - Create a type that represents a read-only tuple of the given type and length.\n- [`TupleToUnion`](source/tuple-to-union.d.ts) - Convert a tuple into a union type of its elements.\n\n### Numeric\n\n- [`PositiveInfinity`](source/numeric.d.ts) - Matches the hidden `Infinity` type.\n- [`NegativeInfinity`](source/numeric.d.ts) - Matches the hidden `-Infinity` type.\n- [`Finite`](source/numeric.d.ts) - A finite `number`.\n- [`Integer`](source/numeric.d.ts) - A `number` that is an integer.\n- [`Float`](source/numeric.d.ts) - A `number` that is not an integer.\n- [`NegativeFloat`](source/numeric.d.ts) - A negative (`-∞ < x < 0`) `number` that is not an integer.\n- [`Negative`](source/numeric.d.ts) - A negative `number`/`bigint` (`-∞ < x < 0`)\n- [`NonNegative`](source/numeric.d.ts) - A non-negative `number`/`bigint` (`0 <= x < ∞`).\n- [`NegativeInteger`](source/numeric.d.ts) - A negative (`-∞ < x < 0`) `number` that is an integer.\n- [`NonNegativeInteger`](source/numeric.d.ts) - A non-negative (`0 <= x < ∞`) `number` that is an integer.\n\n### Change case\n\n- [`CamelCase`](source/camel-case.d.ts) - Convert a string literal to camel-case (`fooBar`).\n- [`CamelCasedProperties`](source/camel-cased-properties.d.ts) - Convert object properties to camel-case (`fooBar`).\n- [`CamelCasedPropertiesDeep`](source/camel-cased-properties-deep.d.ts) - Convert object properties to camel-case recursively (`fooBar`).\n- [`KebabCase`](source/kebab-case.d.ts) - Convert a string literal to kebab-case (`foo-bar`).\n- [`KebabCasedProperties`](source/kebab-cased-properties.d.ts) - Convert a object properties to kebab-case recursively (`foo-bar`).\n- [`KebabCasedPropertiesDeep`](source/kebab-cased-properties-deep.d.ts) - Convert object properties to kebab-case (`foo-bar`).\n- [`PascalCase`](source/pascal-case.d.ts) - Converts a string literal to pascal-case (`FooBar`)\n- [`PascalCasedProperties`](source/pascal-cased-properties.d.ts) - Converts object properties to pascal-case (`FooBar`)\n- [`PascalCasedPropertiesDeep`](source/pascal-cased-properties-deep.d.ts) - Converts object properties to pascal-case (`FooBar`)\n- [`SnakeCase`](source/snake-case.d.ts) - Convert a string literal to snake-case (`foo_bar`).\n- [`SnakeCasedProperties`](source/snake-cased-properties-deep.d.ts) - Convert object properties to snake-case (`foo_bar`).\n- [`SnakeCasedPropertiesDeep`](source/snake-cased-properties-deep.d.ts) - Convert object properties to snake-case recursively (`foo_bar`).\n- [`ScreamingSnakeCase`](source/screaming-snake-case.d.ts) - Convert a string literal to screaming-snake-case (`FOO_BAR`).\n- [`DelimiterCase`](source/delimiter-case.d.ts) - Convert a string literal to a custom string delimiter casing.\n- [`DelimiterCasedProperties`](source/delimiter-cased-properties.d.ts) - Convert object properties to a custom string delimiter casing.\n- [`DelimiterCasedPropertiesDeep`](source/delimiter-cased-properties-deep.d.ts) - Convert object properties to a custom string delimiter casing recursively.\n\n### Miscellaneous\n\n- [`PackageJson`](source/package-json.d.ts) - Type for [npm's `package.json` file](https://docs.npmjs.com/creating-a-package-json-file). It also includes support for [TypeScript Declaration Files](https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html) and [Yarn Workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/).\n- [`TsConfigJson`](source/tsconfig-json.d.ts) - Type for [TypeScript's `tsconfig.json` file](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html).\n\n## Declined types\n\n*If we decline a type addition, we will make sure to document the better solution here.*\n\n- [`Diff` and `Spread`](https://github.com/sindresorhus/type-fest/pull/7) - The pull request author didn't provide any real-world use-cases and the PR went stale. If you think this type is useful, provide some real-world use-cases and we might reconsider.\n- [`Dictionary`](https://github.com/sindresorhus/type-fest/issues/33) - You only save a few characters (`Dictionary<number>` vs `Record<string, number>`) from [`Record`](https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type), which is more flexible and well-known. Also, you shouldn't use an object as a dictionary. We have `Map` in JavaScript now.\n- [`ExtractProperties` and `ExtractMethods`](https://github.com/sindresorhus/type-fest/pull/4) - The types violate the single responsibility principle. Instead, refine your types into more granular type hierarchies.\n- [`Url2Json`](https://github.com/sindresorhus/type-fest/pull/262) - Inferring search parameters from a URL string is a cute idea, but not very useful in practice, since search parameters are usually dynamic and defined separately.\n- [`Nullish`](https://github.com/sindresorhus/type-fest/pull/318) - The type only saves a couple of characters, not everyone knows what \"nullish\" means, and I'm also trying to [get away from `null`](https://github.com/sindresorhus/meta/discussions/7).\n- [`TitleCase`](https://github.com/sindresorhus/type-fest/pull/303) - It's not solving a common need and is a better fit for a separate package.\n- [`ExtendOr` and `ExtendAnd`](https://github.com/sindresorhus/type-fest/pull/247) - The benefits don't outweigh having to learn what they mean.\n- [`PackageJsonExtras`](https://github.com/sindresorhus/type-fest/issues/371) - There are too many possible configurations that can be put into `package.json`. If you would like to extend `PackageJson` to support an additional configuration in your project, please see the *Extending existing types* section below.\n\n## Alternative type names\n\n*If you know one of our types by a different name, add it here for discovery.*\n\n- `PartialBy` - See [`SetOptional`](https://github.com/sindresorhus/type-fest/blob/main/source/set-optional.d.ts)\n- `RecordDeep`- See [`Schema`](https://github.com/sindresorhus/type-fest/blob/main/source/schema.d.ts)\n- `Mutable`- See [`Writable`](https://github.com/sindresorhus/type-fest/blob/main/source/writable.d.ts)\n\n## Tips\n\n### Extending existing types\n\n- [`PackageJson`](source/package-json.d.ts) - There are a lot of tools that place extra configurations inside the `package.json` file. You can extend `PackageJson` to support these additional configurations.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBDAnmApnA3gBQIYGMDW2A5igFIDOEAdnNuXAEJ0o4HFmVUC+cAZlBBBwA5ElQBaXinIxhAbgCwAKFCRYCZGnQAZYFRgooPfoJHSANntmKlysWlaESFanAC8jZo-YuaAMgwLKwBhal5gIgB+AC44XX1DADpQqnCiLhsgA)\n\n\t```ts\n\timport type {PackageJson as BasePackageJson} from 'type-fest';\n\timport type {Linter} from 'eslint';\n\n\ttype PackageJson = BasePackageJson & {eslintConfig?: Linter.Config};\n\t```\n\t</details>\n\n### Related\n\n- [typed-query-selector](https://github.com/g-plane/typed-query-selector) - Enhances `document.querySelector` and `document.querySelectorAll` with a template literal type that matches element types returned from an HTML element query selector.\n- [`Linter.Config`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/eslint/index.d.ts) - Definitions for the [ESLint configuration schema](https://eslint.org/docs/user-guide/configuring/language-options).\n\n### Built-in types\n\nThere are many advanced types most users don't know about.\n\n- [`Partial<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype) - Make all properties in `T` optional.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgHIHsAmEDC6QzADmyA3gLABQyycADnanALYQBcyAzmFKEQNxUaddFDAcQAV2YAjaIMoBfKlQQAbOJ05osEAIIMAQpOBrsUMkOR1eANziRkCfISKSoD4Pg4ZseAsTIALyW1DS0DEysHADkvvoMMQA0VsKi4sgAzAAMuVaKClY2wPaOknSYDrguADwA0sgQAB6QIJjaANYQAJ7oMDp+LsQAfAAUXd0cdUnI9mo+uv6uANp1ALoAlKHhyGAAFsCcAHTOAW4eYF4gyxNrwbNwago0ypRWp66jH8QcAApwYmAjxq8SWIy2FDCNDA3ToKFBQyIdR69wmfQG1TOhShyBgomQX3w3GQE2Q6IA8jIAFYQBBgI4TTiEs5bTQYsFInrLTbbHZOIlgZDlSqQABqj0kKBC3yINx6a2xfOQwH6o2FVXFaklwSCIUkbQghBAEEwENSfNOlykEGefNe5uhB2O6sgS3GPRmLogmslG1tLxUOKgEDA7hAuydtteryAA)\n\n\t```ts\n\tinterface NodeConfig {\n\t\t\tappName: string;\n\t\t\tport: number;\n\t}\n\n\tclass NodeAppBuilder {\n\t\t\tprivate configuration: NodeConfig = {\n\t\t\t\t\tappName: 'NodeApp',\n\t\t\t\t\tport: 3000\n\t\t\t};\n\n\t\t\tprivate updateConfig<Key extends keyof NodeConfig>(key: Key, value: NodeConfig[Key]) {\n\t\t\t\t\tthis.configuration[key] = value;\n\t\t\t}\n\n\t\t\tconfig(config: Partial<NodeConfig>) {\n\t\t\t\t\ttype NodeConfigKey = keyof NodeConfig;\n\n\t\t\t\t\tfor (const key of Object.keys(config) as NodeConfigKey[]) {\n\t\t\t\t\t\t\tconst updateValue = config[key];\n\n\t\t\t\t\t\t\tif (updateValue === undefined) {\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.updateConfig(key, updateValue);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\t\t\t}\n\t}\n\n\t// `Partial<NodeConfig>`` allows us to provide only a part of the\n\t// NodeConfig interface.\n\tnew NodeAppBuilder().config({appName: 'ToDoApp'});\n\t```\n\t</details>\n\n- [`Required<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype) - Make all properties in `T` required.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/AQ4SwOwFwUwJwGYEMDGNgGED21VQGJZwC2wA3gFCjXAzFJgA2A-AFzADOUckA5gNxUaIYjA4ckvGG07c+g6gF8KQkAgCuEFFDA5O6gEbEwUbLm2ESwABQIixACJIoSdgCUYAR3Vg4MACYAPGYuFvYAfACU5Ko0APRxwADKMBD+wFAAFuh2Vv7OSBlYGdmc8ABu8LHKsRyGxqY4oQT21pTCIHQMjOwA5DAAHgACxAAOjDAAdChYxL0ANLHUouKSMH0AEmAAhJhY6ozpAJ77GTCMjMCiV0ToSAb7UJPPC9WRgrEJwAAqR6MwSRQPFGUFocDgRHYxnEfGAowh-zgUCOwF6KwkUl6tXqJhCeEsxDaS1AXSYfUGI3GUxmc0WSneQA)\n\n\t```ts\n\tinterface ContactForm {\n\t\t\temail?: string;\n\t\t\tmessage?: string;\n\t}\n\n\tfunction submitContactForm(formData: Required<ContactForm>) {\n\t\t\t// Send the form data to the server.\n\t}\n\n\tsubmitContactForm({\n\t\t\temail: 'ex@mple.com',\n\t\t\tmessage: 'Hi! Could you tell me more about…',\n\t});\n\n\t// TypeScript error: missing property 'message'\n\tsubmitContactForm({\n\t\t\temail: 'ex@mple.com',\n\t});\n\t```\n\t</details>\n\n- [`Readonly<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype) - Make all properties in `T` readonly.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/AQ4UwOwVwW2AZA9gc3mAbmANsA3gKFCOAHkAzMgGkOJABEwAjKZa2kAUQCcvEu32AMQCGAF2FYBIAL4BufDRABLCKLBcywgMZgEKZOoDCiCGSXI8i4hGEwwALmABnUVxXJ57YFgzZHSVF8sT1BpBSItLGEnJz1kAy5LLy0TM2RHACUwYQATEywATwAeAITjU3MAPnkrCJMXLigtUT4AClxgGztKbyDgaX99I1TzAEokr1BRAAslJwA6FIqLAF48TtswHp9MHDla9hJGACswZvmyLjAwAC8wVpm5xZHkUZDaMKIwqyWXYCW0oN4sNlsA1h0ug5gAByACyBQAggAHJHQ7ZBIFoXbzBjMCz7OoQP5YIaJNYQMAAdziCVaALGNSIAHomcAACoFJFgADKWjcSNEwG4vC4ji0wggEEQguiTnMEGALWAV1yAFp8gVgEjeFyuKICvMrCTgVxnst5jtsGC4ljsPNhXxGaAWcAAOq6YRXYDCRg+RWIcA5JSC+kWdCepQ+v3RYCU3RInzRMCGwlpC19NYBW1Ye08R1AA)\n\n\t```ts\n\tenum LogLevel {\n\t\t\tOff,\n\t\t\tDebug,\n\t\t\tError,\n\t\t\tFatal\n\t};\n\n\tinterface LoggerConfig {\n\t\t\tname: string;\n\t\t\tlevel: LogLevel;\n\t}\n\n\tclass Logger {\n\t\t\tconfig: Readonly<LoggerConfig>;\n\n\t\t\tconstructor({name, level}: LoggerConfig) {\n\t\t\t\t\tthis.config = {name, level};\n\t\t\t\t\tObject.freeze(this.config);\n\t\t\t}\n\t}\n\n\tconst config: LoggerConfig = {\n\t\tname: 'MyApp',\n\t\tlevel: LogLevel.Debug\n\t};\n\n\tconst logger = new Logger(config);\n\n\t// TypeScript Error: cannot assign to read-only property.\n\tlogger.config.level = LogLevel.Error;\n\n\t// We are able to edit config variable as we please.\n\tconfig.level = LogLevel.Error;\n\t```\n\t</details>\n\n- [`Pick<T, K>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys) - From `T`, pick a set of properties whose keys are in the union `K`.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/AQ4SwOwFwUwJwGYEMDGNgEE5TCgNugN4BQoZwOUBAXMAM5RyQDmA3KeSFABYCuAtgCMISMHloMmENh04oA9tBjQJjFuzIBfYrOAB6PcADCcGElh1gEGAHcKATwAO6ebyjB5CTNlwFwSxFR0BX5HeToYABNgBDh5fm8cfBg6AHIKG3ldA2BHOOcfFNpUygJ0pAhokr4hETFUgDpswywkggAFUwA3MFtgAF5gQgowKhhVKTYKGuFRcXo1aVZgbTIoJ3RW3xhOmB6+wfbcAGsAHi3kgBpgEtGy4AAfG54BWfqAPnZm4AAlZUj4MAkMA8GAGB4vEgfMlLLw6CwPBA8PYRmMgZVgAC6CgmI4cIommQELwICh8RBgKZKvALh1ur0bHQABR5PYMui0Wk7em2ADaAF0AJS0AASABUALIAGQAogR+Mp3CROCAFBBwVC2ikBpj5CgBIqGjizLA5TAFdAmalImAuqlBRoVQh5HBgEy1eDWfs7J5cjzGYKhroVfpDEhHM4MV6GRR5NN0JrtnRg6BVirTFBeHAKYmYY6QNpdB73LmCJZBlSAXAubtvczeSmQMNSuMbmKNgBlHFgPEUNwusBIPAAQlS1xetTmxT0SDoESgdD0C4aACtHMwxytLrohawgA)\n\n\t```ts\n\tinterface Article {\n\t\t\ttitle: string;\n\t\t\tthumbnail: string;\n\t\t\tcontent: string;\n\t}\n\n\t// Creates new type out of the `Article` interface composed\n\t// from the Articles' two properties: `title` and `thumbnail`.\n\t// `ArticlePreview = {title: string; thumbnail: string}`\n\ttype ArticlePreview = Pick<Article, 'title' | 'thumbnail'>;\n\n\t// Render a list of articles using only title and description.\n\tfunction renderArticlePreviews(previews: ArticlePreview[]): HTMLElement {\n\t\t\tconst articles = document.createElement('div');\n\n\t\t\tfor (const preview of previews) {\n\t\t\t\t\t// Append preview to the articles.\n\t\t\t}\n\n\t\t\treturn articles;\n\t}\n\n\tconst articles = renderArticlePreviews([\n\t\t\t{\n\t\t\t\ttitle: 'TypeScript tutorial!',\n\t\t\t\tthumbnail: '/assets/ts.jpg'\n\t\t\t}\n\t]);\n\t```\n\t</details>\n\n- [`Record<K, T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type) - Construct a type with a set of properties `K` of type `T`.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/AQ4ejYAUHsGcCWAXBMB2dgwGbAKYC2ADgDYwCeeemCaWArgE7ADGMxAhmuQHQBQoYEnJE8wALKEARnkaxEKdMAC8wAOS0kstGuAAfdQBM8ANzxlRjXQbVaWACwC0JPB0NqA3HwGgIwAJJoWozYHCxixnAsjAhStADmwESMMJYo1Fi4HMCIaPEu+MRklHj8gpqyoeHAAKJFFFTAAN4+giDYCIxwSAByHAR4AFw5SDF5Xm2gJBzdfQPD3WPxE5PAlBxdAPLYNQAelgh4aOHDaPQEMowrIAC+3oJ+AMKMrlrAXFhSAFZ4LEhC9g4-0BmA4JBISXgiCkBQABpILrJ5MhUGhYcATGD6Bk4Hh-jNgABrPDkOBlXyQAAq9ngYmJpOAAHcEOCRjAXqwYODfoo6DhakUSph+Uh7GI4P0xER4Cj0OSQGwMP8tP1hgAlX7swwAHgRl2RvIANALSA08ABtAC6AD4VM1Wm0Kow0MMrYaHYJjGYLLJXZb3at1HYnC43Go-QHQDcvA6-JsmEJXARgCDgMYWAhjIYhDAU+YiMAAFIwex0ZmilMITCGF79TLAGRsAgJYAAZRwSEZGzEABFTOZUrJ5Yn+jwnWgeER6HB7AAKJrADpdXqS4ZqYultTG6azVfqHswPBbtauLY7fayQ7HIbAAAMwBuAEoYw9IBq2Ixs9h2eFMOQYPQObALQKJgggABeYhghCIpikkKRpOQRIknAsZUiIeCttECBEP8NSMCkjDDAARMGziuIYxHwYOjDCMBmDNnAuTxA6irdCOBB1Lh5Dqpqn66tISIykawBnOCtqqC0gbjqc9DgpGkxegOliyfJDrRkAA)\n\n\t```ts\n\t// Positions of employees in our company.\n\ttype MemberPosition = 'intern' | 'developer' | 'tech-lead';\n\n\t// Interface describing properties of a single employee.\n\tinterface Employee {\n\t\t\tfirstName: string;\n\t\t\tlastName: string;\n\t\t\tyearsOfExperience: number;\n\t}\n\n\t// Create an object that has all possible `MemberPosition` values set as keys.\n\t// Those keys will store a collection of Employees of the same position.\n\tconst team: Record<MemberPosition, Employee[]> = {\n\t\t\tintern: [],\n\t\t\tdeveloper: [],\n\t\t\t'tech-lead': [],\n\t};\n\n\t// Our team has decided to help John with his dream of becoming Software Developer.\n\tteam.intern.push({\n\t\tfirstName: 'John',\n\t\tlastName: 'Doe',\n\t\tyearsOfExperience: 0\n\t});\n\n\t// `Record` forces you to initialize all of the property keys.\n\t// TypeScript Error: \"tech-lead\" property is missing\n\tconst teamEmpty: Record<MemberPosition, null> = {\n\t\t\tintern: null,\n\t\t\tdeveloper: null,\n\t};\n\t```\n\t</details>\n\n- [`Exclude<T, U>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion) - Exclude from `T` those types that are assignable to `U`.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/JYOwLgpgTgZghgYwgAgMrQG7QMIHsQzADmyA3gFDLIAOuUYAXMiAK4A2byAPsgM5hRQJHqwC2AI2gBucgF9y5MAE9qKAEoQAjiwj8AEnBAATNtGQBeZAAooWphu26wAGmS3e93bRC8IASgsAPmRDJRlyAHoI5ABRAA8ENhYjFFYOZGVVZBgoXFFkAAM0zh5+QRBhZhYJaAKAOkjogEkQZAQ4X2QAdwALCFbaemRgXmQtFjhOMFwq9K6ULuB0lk6U+HYwZAxJnQaYFhAEMGB8ZCIIMAAFOjAANR2IK0HGWISklIAedCgsKDwCYgAbQA5M9gQBdVzFQJ+JhiSRQMiUYYwayZCC4VHPCzmSzAspCYEBWxgFhQAZwKC+FpgJ43VwARgADH4ZFQSWSBjcZPJyPtDsdTvxKWBvr8rD1DCZoJ5HPopaYoK4EPhCEQmGKcKriLCtrhgEYkVQVT5Nr4fmZLLZtMBbFZgT0wGBqES6ghbHBIJqoBKFdBWQpjfh+DQbhY2tqiHVsbjLMVkAB+ZAAZiZaeQTHOVxu9ySjxNaujNwDVHNvzqbBGkBAdPoAfkQA)\n\n\t```ts\n\tinterface ServerConfig {\n\t\tport: null | string | number;\n\t}\n\n\ttype RequestHandler = (request: Request, response: Response) => void;\n\n\t// Exclude `null` type from `null | string | number`.\n\t// In case the port is equal to `null`, we will use default value.\n\tfunction getPortValue(port: Exclude<ServerConfig['port'], null>): number {\n\t\tif (typeof port === 'string') {\n\t\t\treturn parseInt(port, 10);\n\t\t}\n\n\t\treturn port;\n\t}\n\n\tfunction startServer(handler: RequestHandler, config: ServerConfig): void {\n\t\tconst server = require('http').createServer(handler);\n\n\t\tconst port = config.port === null ? 3000 : getPortValue(config.port);\n\t\tserver.listen(port);\n\t}\n\t```\n\t</details>\n\n- [`Extract<T, U>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union) - Extract from `T` those types that are assignable to `U`.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXzSwEdkQBJYACgEoAueVZAWwCMQYBuAKDDwGcM8MgBF4AXngBlAJ6scESgHIRi6ty5ZUGdoihgEABXZ888AN5d48ANoiAuvUat23K6ihMQ9ATE0BzV3goPy8GZjZOLgBfLi4Aejj4AEEICBwAdz54MAALKFQQ+BxEeAAHY1NgKAwoIKy0grr4DByEUpgccpgMaXgAaxBerCzi+B9-ZulygDouFHRsU1z8kKMYE1RhaqgAHkt4AHkWACt4EAAPbVRgLLWNgBp9gGlBs8uQa6yAUUuYPQwdgNpKM7nh7mMML4CgA+R5WABqUAgpDeVxuhxO1he0jsXGh8EoOBO9COx3BQPo2PBADckaR6IjkSA6PBqTgsMBzPsicdrEC7OJWXSQNwYvFEgAVTS9JLXODpeDpKBZFg4GCoWa8VACIJykAKiQWKy2YQOAioYikCg0OEMDyhRSy4DyxS24KhAAMjyi6gS8AAwjh5OD0iBFHAkJoEOksC1mnkMJq8gUQKDNttKPlnfrwYp3J5XfBHXqoKpfYkAOI4ansTxaeDADmoRSCCBYAbxhC6TDx6rwYHIRX5bScjA4bLJwoDmDwDkfbA9JMrVMVdM1TN69LgkTgwgkchUahqIA)\n\n\t```ts\n\tdeclare function uniqueId(): number;\n\n\tconst ID = Symbol('ID');\n\n\tinterface Person {\n\t\t[ID]: number;\n\t\tname: string;\n\t\tage: number;\n\t}\n\n\t// Allows changing the person data as long as the property key is of string type.\n\tfunction changePersonData<\n\t\tObj extends Person,\n\t\tKey extends Extract<keyof Person, string>,\n\t\tValue extends Obj[Key]\n\t> (obj: Obj, key: Key, value: Value): void {\n\t\tobj[key] = value;\n\t}\n\n\t// Tiny Andrew was born.\n\tconst andrew = {\n\t\t[ID]: uniqueId(),\n\t\tname: 'Andrew',\n\t\tage: 0,\n\t};\n\n\t// Cool, we're fine with that.\n\tchangePersonData(andrew, 'name', 'Pony');\n\n\t// Goverment didn't like the fact that you wanted to change your identity.\n\tchangePersonData(andrew, ID, uniqueId());\n\t```\n\t</details>\n\n- [`NonNullable<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype) - Exclude `null` and `undefined` from `T`.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\tWorks with <a href=\"https://www.typescriptlang.org/tsconfig#strictNullChecks\"><code>strictNullChecks</code></a> set to <code>true</code>.\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/C4TwDgpgBACg9gJ2AOQK4FsBGEFQLxQDOwCAlgHYDmUAPlORtrnQwDasDcAUFwPQBU-WAEMkUOADMowqAGNWwwoSgATCBIqlgpOOSjAAFsOBRSy1IQgr9cKJlSlW1mZYQA3HFH68u8xcoBlHA8EACEHJ08Aby4oKDBUTFZSWXjEFEYcAEIALihkXTR2YSSIAB54JDQsHAA+blj4xOTUsHSACkMzPKD3HHDHNQQAGjSkPMqMmoQASh7g-oihqBi4uNIpdraxPAI2VhmVxrX9AzMAOm2ppnwoAA4ABifuE4BfKAhWSyOTuK7CS7pao3AhXF5rV48E4ICDAVAIPT-cGQyG+XTEIgLMJLTx7CAAdygvRCA0iCHaMwarhJOIQjUBSHaACJHk8mYdeLwxtdcVAAOSsh58+lXdr7Dlcq7A3n3J4PEUdADMcspUE53OluAIUGVTx46oAKuAIAFZGQwCYAKIIBCILjUxaDHAMnla+iodjcIA)\n\n\t```ts\n\ttype PortNumber = string | number | null;\n\n\t/** Part of a class definition that is used to build a server */\n\tclass ServerBuilder {\n\t\t\tportNumber!: NonNullable<PortNumber>;\n\n\t\t\tport(this: ServerBuilder, port: PortNumber): ServerBuilder {\n\t\t\t\t\tif (port == null) {\n\t\t\t\t\t\t\tthis.portNumber = 8000;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.portNumber = port;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\t\t\t}\n\t}\n\n\tconst serverBuilder = new ServerBuilder();\n\n\tserverBuilder\n\t\t\t.port('8000') // portNumber = '8000'\n\t\t\t.port(null) // portNumber = 8000\n\t\t\t.port(3000); // portNumber = 3000\n\n\t// TypeScript error\n\tserverBuilder.portNumber = null;\n\t```\n\t</details>\n\n- [`Parameters<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype) - Obtain the parameters of a function type in a tuple.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/GYVwdgxgLglg9mABAZwBYmMANgUwBQxgAOIUAXIgIZgCeA2gLoCUFAbnDACaIDeAUIkQB6IYgCypSlBxUATrMo1ECsJzgBbLEoipqAc0J7EMKMgDkiHLnU4wp46pwAPHMgB0fAL58+oSLARECEosLAA5ABUYG2QAHgAxJGdpVWREPDdMylk9ZApqemZEAF4APipacrw-CApEgBogkKwAYThwckQwEHUAIxxZJl4BYVEImiIZKF0oZRwiWVdbeygJmThgOYgcGFYcbhqApCJsyhtpWXcR1cnEePBoeDAABVPzgbTixFeFd8uEsClADcIxGiygIFkSEOT3SmTc2VydQeRx+ZxwF2QQ34gkEwDgsnSuFmMBKiAADEDjIhYk1Qm0OlSYABqZnYka4xA1DJZHJYkGc7yCbyeRA+CAIZCzNAYbA4CIAdxg2zJwVCkWirjwMswuEaACYmCCgA)\n\n\t```ts\n\tfunction shuffle(input: any[]): void {\n\t\t// Mutate array randomly changing its' elements indexes.\n\t}\n\n\tfunction callNTimes<Fn extends (...args: any[]) => any> (func: Fn, callCount: number) {\n\t\t// Type that represents the type of the received function parameters.\n\t\ttype FunctionParameters = Parameters<Fn>;\n\n\t\treturn function (...args: FunctionParameters) {\n\t\t\tfor (let i = 0; i < callCount; i++) {\n\t\t\t\tfunc(...args);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst shuffleTwice = callNTimes(shuffle, 2);\n\t```\n\t</details>\n\n- [`ConstructorParameters<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#constructorparameterstype) - Obtain the parameters of a constructor function type in a tuple.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECCBOAXAlqApgWQPYBM0mgG8AoaaFRENALmgkXmQDsBzAblOmCycTV4D8teo1YdO3JiICuwRFngAKClWENmLAJRFOZRAAtkEAHQq00ALzlklNBzIBfYk+KhIMAJJTEYJsDQAwmDA+mgAPAAq0GgAHnxMODCKTGgA7tCKxllg8CwQtL4AngDaALraFgB80EWa1SRkAA6MAG5gfNAB4FABPDJyCrQR9tDNyG0dwMGhtBhgjWEiGgA00F70vv4RhY3hEZXVVinpc42KmuJkkv3y8Bly8EPaDWTkhiZd7r3e8LK3llwGCMXGQWGhEOsfH5zJlsrl8p0+gw-goAAo5MAAW3BaHgEEilU0tEhmzQ212BJ0ry4SOg+kg+gBBiMximIGA0nAfAQLGk2N4EAAEgzYcYcnkLsRdDTvNEYkYUKwSdCme9WdM0MYwYhFPSIPpJdTkAAzDKxBUaZX+aAAQgsVmkCTQxuYaBw2ng4Ok8CYcotSu8pMur09iG9vuObxZnx6SN+AyUWTF8MN0CcZE4Ywm5jZHK5aB5fP4iCFIqT4oRRTKRLo6lYVNeAHpG50wOzOe1zHr9NLQ+HoABybsD4HOKXXRA1JCoKhBELmI5pNaB6Fz0KKBAodDYPAgSUTmqYsAALx4m5nC6nW9nGq14KtaEUA9gR9PvuNCjQ9BgACNvcwNBtAcLiAA)\n\n\t```ts\n\tclass ArticleModel {\n\t\ttitle: string;\n\t\tcontent?: string;\n\n\t\tconstructor(title: string) {\n\t\t\tthis.title = title;\n\t\t}\n\t}\n\n\tclass InstanceCache<T extends (new (...args: any[]) => any)> {\n\t\tprivate ClassConstructor: T;\n\t\tprivate cache: Map<string, InstanceType<T>> = new Map();\n\n\t\tconstructor (ctr: T) {\n\t\t\tthis.ClassConstructor = ctr;\n\t\t}\n\n\t\tgetInstance (...args: ConstructorParameters<T>): InstanceType<T> {\n\t\t\tconst hash = this.calculateArgumentsHash(...args);\n\n\t\t\tconst existingInstance = this.cache.get(hash);\n\t\t\tif (existingInstance !== undefined) {\n\t\t\t\treturn existingInstance;\n\t\t\t}\n\n\t\t\treturn new this.ClassConstructor(...args);\n\t\t}\n\n\t\tprivate calculateArgumentsHash(...args: any[]): string {\n\t\t\t// Calculate hash.\n\t\t\treturn 'hash';\n\t\t}\n\t}\n\n\tconst articleCache = new InstanceCache(ArticleModel);\n\tconst amazonArticle = articleCache.getInstance('Amazon forests burining!');\n\t```\n\t</details>\n\n- [`ReturnType<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype) - Obtain the return type of a function type.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECSAmICmBlJAnAbgS2E6A3gFDTTwD2AcuQC4AW2AdgOYAUAlAFzSbnbyEAvkWFFQkGJSQB3GMVI1sNZNwg10TZgG4S0YOUY0kh1es07d+xmvQBXYDXLpWi5UlMaWAGj0GjJ6BtNdkJdBQYIADpXZGgAXmgYpB1ScOwoq38aeN9DYxoU6GFRKzVoJjUwRjwAYXJbPPRuAFkwAAcAHgAxBodsAx9GWwBbACMMAD4cxhloVraOCyYjdAAzMDxoOut1e0d0UNIZ6WhWSPOwdGYIbiqATwBtAF0uaHudUQB6ACpv6ABpJBINqJdAbADW0Do5BOw3u5R2VTwMHIq2gAANtjZ0bkbHsnFCwJh8ONjHp0EgwEZ4JFoN9PkRVr1FAZoMwkDRYIjqkgOrosepoEgAB7+eAwAV2BxOLy6ACCVxgIrFEoMeOl6AACpcwMMORgIB1JRMiBNWKVdhruJKfOdIpdrtwFddXlzKjyACp3Nq842HaDIbL6BrZBIVGhIpB1EMYSLsmjmtWW-YhAA+qegAAYLKQLQj3ZsEsdccmnGcLor2Dn8xGedHGpEIBzEzspfsfMHDNAANTQACMVaIljV5GQkRA5DYmIpVKQAgAJARO9le33BDXIyi0YuLW2nJFGLqkOvxFB0YPdBSaLZ0IwNzyPkO8-xkGgsLh8Al427a3hWAhXwwHA8EHT5PmgAB1bAQBAANJ24adKWpft72RaBUTgRBUCAj89HAM8xCTaBjggABRQx0DuHJv25P9dCkWRZVIAAiBjoFImpmjlFBgA0NpsjadByDacgIDAEAIAAQmYpjoGYgAZSBsmGPw6DtZiiFA8CoJguDmAQmoZ2QvtUKQLdoAYmBTwgdEiCAA)\n\n\t```ts\n\t/** Provides every element of the iterable `iter` into the `callback` function and stores the results in an array. */\n\tfunction mapIter<\n\t\t\tElem,\n\t\t\tFunc extends (elem: Elem) => any,\n\t\t\tRet extends ReturnType<Func>\n\t>(iter: Iterable<Elem>, callback: Func): Ret[] {\n\t\t\tconst mapped: Ret[] = [];\n\n\t\t\tfor (const elem of iter) {\n\t\t\t\t\tmapped.push(callback(elem));\n\t\t\t}\n\n\t\t\treturn mapped;\n\t}\n\n\tconst setObject: Set<string> = new Set();\n\tconst mapObject: Map<number, string> = new Map();\n\n\tmapIter(setObject, (value: string) => value.indexOf('Foo')); // number[]\n\n\tmapIter(mapObject, ([key, value]: [number, string]) => {\n\t\t\treturn key % 2 === 0 ? value : 'Odd';\n\t}); // string[]\n\t```\n\t</details>\n\n- [`InstanceType<T>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#instancetypetype) - Obtain the instance type of a constructor function type.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECSAmICmBlJAnAbgS2E6A3gFDTTwD2AcuQC4AW2AdgOYAUAlAFzSbnbyEAvkWFFQkGJSQB3GMVI1sNZNwg10TZgG4S0YOUY0kh1es07d+xmvQBXYDXLpWi5UlMaWAGj0GjJ6BtNdkJdBQYIADpXZGgAXmgYpB1ScOwoq38aeN9DYxoU6GFRKzVoJjUwRjwAYXJbPPRuAFkwAAcAHgAxBodsAx9GWwBbACMMAD4cxhloVraOCyYjdAAzMDxoOut1e0d0UNIZ6WhWSPOwdGYIbiqATwBtAF0uaHudUQB6ACpv6ABpJBINqJdAbADW0Do5BOw3u5R2VTwMHIq2gAANtjZ0bkbHsnFCwJh8ONjHp0EgwEZ4JFoN9PkRVr1FAZoMwkDRYIjqkgOrosepoEgAB7+eAwAV2BxOLy6ACCVxgIrFEoMeOl6AACpcwMMORgIB1JRMiBNWKVdhruJKfOdIpdrtwFddXlzKjyACp3Nq842HaDIbL6BrZBIVGhIpB1EMYSLsmjmtWW-YhAA+qegAAYLKQLQj3ZsEsdccmnGcLor2Dn8xGedHGpEIBzEzspfsfMHDNAANTQACMVaIljV5GQkRA5DYmIpVKQAgAJARO9le33BDXIyi0YuLW2nJFGLqkOvxFB0YPdBSaLZ0IwNzyPkO8-xkGgsLh8Al427a3hWAhXwwHA8EHT5PmgAB1bAQBAANJ24adKWpft72RaBUTgRBUCAj89HAM8xCTaBjggABRQx0DuHJv25P9dCkWRZVIAAiBjoFImpmjlFBgA0NpsjadByDacgIDAEAIAAQmYpjoGYgAZSBsmGPw6DtZiiFA8CoJguDmAQmoZ2QvtUKQLdoAYmBTwgdEiCAA)\n\n\t```ts\n\tclass IdleService {\n\t\t\tdoNothing (): void {}\n\t}\n\n\tclass News {\n\t\t\ttitle: string;\n\t\t\tcontent: string;\n\n\t\t\tconstructor(title: string, content: string) {\n\t\t\t\t\tthis.title = title;\n\t\t\t\t\tthis.content = content;\n\t\t\t}\n\t}\n\n\tconst instanceCounter: Map<Function, number> = new Map();\n\n\tinterface Constructor {\n\t\t\tnew(...args: any[]): any;\n\t}\n\n\t// Keep track how many instances of `Constr` constructor have been created.\n\tfunction getInstance<\n\t\t\tConstr extends Constructor,\n\t\t\tArgs extends ConstructorParameters<Constr>\n\t>(constructor: Constr, ...args: Args): InstanceType<Constr> {\n\t\t\tlet count = instanceCounter.get(constructor) || 0;\n\n\t\t\tconst instance = new constructor(...args);\n\n\t\t\tinstanceCounter.set(constructor, count + 1);\n\n\t\t\tconsole.log(`Created ${count + 1} instances of ${Constr.name} class`);\n\n\t\t\treturn instance;\n\t}\n\n\n\tconst idleService = getInstance(IdleService);\n\t// Will log: `Created 1 instances of IdleService class`\n\tconst newsEntry = getInstance(News, 'New ECMAScript proposals!', 'Last month...');\n\t// Will log: `Created 1 instances of News class`\n\t```\n\t</details>\n\n- [`Omit<T, K>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys) - Constructs a type by picking all properties from T and then removing K.\n\t<details>\n\t<summary>\n\t\t\tExample\n\t</summary>\n\n\t[Playground](https://typescript-play.js.org/?target=6#code/JYOwLgpgTgZghgYwgAgIImAWzgG2QbwChlks4BzCAVShwC5kBnMKUcgbmKYAcIFgIjBs1YgOXMpSFMWbANoBdTiW5woFddwAW0kfKWEAvoUIB6U8gDCUCHEiNkICAHdkYAJ69kz4GC3JcPG4oAHteKDABBxCYNAxsPFBIWEQUCAAPJG4wZABySUFcgJAAEzMLXNV1ck0dIuCw6EjBADpy5AB1FAQ4EGQAV0YUP2AHDy8wEOQbUugmBLwtEIA3OcmQnEjuZBgQqE7gAGtgZAhwKHdkHFGwNvGUdDIcAGUliIBJEF3kAF5kAHlML4ADyPBIAGjyBUYRQAPnkqho4NoYQA+TiEGD9EAISIhPozErQMG4AASK2gn2+AApek9pCSXm8wFSQooAJQMUkAFQAsgAZACiOAgmDOOSIJAQ+OYyGl4DgoDmf2QJRCCH6YvALQQNjsEGFovF1NyJWAy1y7OUyHMyE+yRAuFImG4Iq1YDswHxbRINjA-SgfXlHqVUE4xiAA)\n\n\t```ts\n\tinterface Animal {\n\t\t\timageUrl: string;\n\t\t\tspecies: string;\n\t\t\timages: string[];\n\t\t\tparagraphs: string[];\n\t}\n\n\t// Creates new type with all properties of the `Animal` interface\n\t// except 'images' and 'paragraphs' properties. We can use this\n\t// type to render small hover tooltip for a wiki entry list.\n\ttype AnimalShortInfo = Omit<Animal, 'images' | 'paragraphs'>;\n\n\tfunction renderAnimalHoverInfo (animals: AnimalShortInfo[]): HTMLElement {\n\t\t\tconst container = document.createElement('div');\n\t\t\t// Internal implementation.\n\t\t\treturn container;\n\t}\n\t```\n\t</details>\n\n- [`Uppercase<S extends string>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#uppercasestringtype) - Transforms every character in a string into uppercase.\n\t<details>\n\t<summary>\n\t\tExample\n\t</summary>\n\n\t```ts\n\ttype T = Uppercase<'hello'>; // 'HELLO'\n\n\ttype T2 = Uppercase<'foo' | 'bar'>; // 'FOO' | 'BAR'\n\n\ttype T3<S extends string> = Uppercase<`aB${S}`>;\n\ttype T4 = T3<'xYz'>; // 'ABXYZ'\n\n\ttype T5 = Uppercase<string>; // string\n\ttype T6 = Uppercase<any>; // any\n\ttype T7 = Uppercase<never>; // never\n\ttype T8 = Uppercase<42>; // Error, type 'number' does not satisfy the constraint 'string'\n\t```\n\t</details>\n\n- [`Lowercase<S extends string>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#lowercasestringtype) - Transforms every character in a string into lowercase.\n\t<details>\n\t<summary>\n\t\tExample\n\t</summary>\n\n\t```ts\n\ttype T = Lowercase<'HELLO'>; // 'hello'\n\n\ttype T2 = Lowercase<'FOO' | 'BAR'>; // 'foo' | 'bar'\n\n\ttype T3<S extends string> = Lowercase<`aB${S}`>;\n\ttype T4 = T3<'xYz'>; // 'abxyz'\n\n\ttype T5 = Lowercase<string>; // string\n\ttype T6 = Lowercase<any>; // any\n\ttype T7 = Lowercase<never>; // never\n\ttype T8 = Lowercase<42>; // Error, type 'number' does not satisfy the constraint 'string'\n\t```\n\t</details>\n\n- [`Capitalize<S extends string>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#capitalizestringtype) - Transforms the first character in a string into uppercase.\n\t<details>\n\t<summary>\n\t\tExample\n\t</summary>\n\n\t```ts\n\ttype T = Capitalize<'hello'>; // 'Hello'\n\n\ttype T2 = Capitalize<'foo' | 'bar'>; // 'Foo' | 'Bar'\n\n\ttype T3<S extends string> = Capitalize<`aB${S}`>;\n\ttype T4 = T3<'xYz'>; // 'ABxYz'\n\n\ttype T5 = Capitalize<string>; // string\n\ttype T6 = Capitalize<any>; // any\n\ttype T7 = Capitalize<never>; // never\n\ttype T8 = Capitalize<42>; // Error, type 'number' does not satisfy the constraint 'string'\n\t```\n\t</details>\n\n- [`Uncapitalize<S extends string>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#uncapitalizestringtype) - Transforms the first character in a string into lowercase.\n\t<details>\n\t<summary>\n\t\tExample\n\t</summary>\n\n\t```ts\n\ttype T = Uncapitalize<'Hello'>; // 'hello'\n\n\ttype T2 = Uncapitalize<'Foo' | 'Bar'>; // 'foo' | 'bar'\n\n\ttype T3<S extends string> = Uncapitalize<`AB${S}`>;\n\ttype T4 = T3<'xYz'>; // 'aBxYz'\n\n\ttype T5 = Uncapitalize<string>; // string\n\ttype T6 = Uncapitalize<any>; // any\n\ttype T7 = Uncapitalize<never>; // never\n\ttype T8 = Uncapitalize<42>; // Error, type 'number' does not satisfy the constraint 'string'\n\t```\n\t</details>\n\nYou can find some examples in the [TypeScript docs](https://www.typescriptlang.org/docs/handbook/utility-types.html).\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Jarek Radosz](https://github.com/CvX)\n- [Dimitri Benin](https://github.com/BendingBender)\n- [Pelle Wessman](https://github.com/voxpelli)\n- [Sébastien Mischler](https://github.com/skarab42)\n\n## License\n\nSPDX-License-Identifier: (MIT OR CC0-1.0)\n","readmeFilename":"readme.md"}
+{
+ "name": "type-fest",
+ "dist-tags": {
+ "latest": "0.20.2"
+ },
+ "versions": {
+ "0.20.2": {
+ "name": "type-fest",
+ "version": "0.20.2",
+ "description": "A collection of essential TypeScript types",
+ "license": "(MIT OR CC0-1.0)",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/type-fest.git"
+ },
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "//test": "xo && tsd && tsc",
+ "test": "xo && tsc"
+ },
+ "devDependencies": {
+ "@sindresorhus/tsconfig": "~0.7.0",
+ "tsd": "^0.13.1",
+ "typescript": "^4.1.2",
+ "xo": "^0.35.0"
+ },
+ "types": "./index.d.ts",
+ "typesVersions": {
+ ">=4.1": {
+ "*": [
+ "ts41/*"
+ ]
+ }
+ },
+ "xo": {
+ "rules": {
+ "@typescript-eslint/ban-types": "off",
+ "@typescript-eslint/indent": "off",
+ "node/no-unsupported-features/es-builtins": "off"
+ }
+ },
+ "gitHead": "0337bcdebdad653915d35bf39428abf702ae5de5",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/type-fest/issues"
+ },
+ "_id": "type-fest@0.20.2",
+ "_nodeVersion": "10.22.1",
+ "_npmVersion": "6.14.9",
+ "dist": {
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "shasum": "1bf207f4b28f91583666cb5fbd327887301cd5f4",
+ "tarball": "http://localhost:4260/type-fest/type-fest-0.20.2.tgz",
+ "fileCount": 42,
+ "unpackedSize": 110590
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "description": "A collection of essential TypeScript types",
+ "homepage": "https://github.com/sindresorhus/type-fest#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/type-fest.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/type-fest/issues"
+ },
+ "license": "(MIT OR CC0-1.0)",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/unique-filename/registry.json b/tests/registry/npm/unique-filename/registry.json
index 2256332a3..7821fb59c 100644
--- a/tests/registry/npm/unique-filename/registry.json
+++ b/tests/registry/npm/unique-filename/registry.json
@@ -1 +1,82 @@
-{"name":"unique-filename","description":"Generate a unique filename for use in temporary directories or caches.","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"name":"unique-filename","version":"3.0.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"unique-filename@3.0.0","bugs":{"url":"https://github.com/iarna/unique-filename/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"48ba7a5a16849f5080d26c760c86cf5cf05770ea","tarball":"http://localhost:4260/unique-filename/unique-filename-3.0.0.tgz","fileCount":4,"integrity":"sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==","signatures":[{"sig":"MEUCIQC7AsCFOeTGcFtlnipoV/Cz7Ipqw6YjUhL11AQ19OQAogIgJpCmdRGqvybP0RZ3EOsOKNoT1qXW1Pc44wYejZL/KUM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":3414,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjSaHcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq99BAAkitPZqFX+xTRAdYaiPc6gxswhetNXAA2qAEjkTlHWvlO4c+o\r\nzFi9EUNF/hH8ecrxT+Fo2vu7hyojkMAaHdhrAK43YuEcUzaTcJUyQJsv/psk\r\nb4lNsyt7oO11JPxJ4eUJ53iM2dbZDOD5GlBaI4v0mdN+IFDldAwqNK6+XaE2\r\n3B0Q+fFJ7oEH608To1WxOKzm/6/pvt5YyClM+6ZQnd60Mj6CEy72yrPhpfCZ\r\nnx3UJkS8RzF/QLcJMIrk5dc+xSu6B7m4XHSLGNuobs1u4viEYw8Cf7Svg99t\r\nsWoHbuPJBniC/jRwyj4c1S+SgyUo0Ov00Lwt7qh7wJQHgptKgE9MidrOAX0o\r\nIFZiR2v6VBIrXb4M7qJwwgbo2bw6pQcDtsNzJ2A1STNIwH71/4h4cH3OPLKg\r\n8QgzzTh+4y2Ll9Ys4WokrrgBb1h8Sm4yAu7Me1LWVCrAn2PgpzUFtGLHbDmj\r\nKAgbg26lGi6QTR6J7BD0f2LgzMLQ/BeDRZV69TyCofTjKSyll+/e7aUux8bs\r\nmRCjGR77+az/6fH85NdYUBv3VTGTPpBijFWrbJ7IZG3KlBQlRZgCR7n507iG\r\njDh15JJkcf29g/syvLxACIYXg5ynmR5jXv0opTHe/HWLkfKDUUBzJJTX6slx\r\ngxe9TBAJ707IvbqGHmjZXshHiBAXwslhXhc=\r\n=KEBJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"49d999ed740c2455755fd19f774571e81454a75e","scripts":{"lint":"eslint \"**/*.js\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/unique-filename.git","type":"git"},"_npmVersion":"8.19.2","description":"Generate a unique filename for use in temporary directories or caches.","directories":{},"templateOSS":{"version":"4.5.1","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"18.10.0","dependencies":{"unique-slug":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","@npmcli/template-oss":"4.5.1","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/unique-filename.git","type":"git"},"license":"ISC","homepage":"https://github.com/iarna/unique-filename","bugs":{"url":"https://github.com/iarna/unique-filename/issues"},"readme":"unique-filename\n===============\n\nGenerate a unique filename for use in temporary directories or caches.\n\n```js\nconst uniqueFilename = require('unique-filename')\n\n// returns something like: '/tmp/c5b28f47'\nconst randomTmpfile = uniqueFilename(os.tmpdir())\n\n// returns something like: '/tmp/my-test-51a7b48d'\nconst randomPrefixedTmpfile = uniqueFilename(os.tmpdir(), 'my-test')\n\n// returns something like: '/my-tmp-dir/testing-7ddd44c0'\nconst uniqueTmpfile = uniqueFilename('/my-tmp-dir', 'testing', '/my/thing/to/uniq/on')\n```\n\n### uniqueFilename(*dir*, *fileprefix*, *uniqstr*) → String\n\nReturns the full path of a unique filename that looks like:\n`dir/prefix-7ddd44c0`\nor `dir/7ddd44c0`\n\n*dir* – The path you want the filename in. `os.tmpdir()` is a good choice for this.\n\n*fileprefix* – A string to append prior to the unique part of the filename.\nThe parameter is required if *uniqstr* is also passed in but is otherwise\noptional and can be `undefined`/`null`/`''`. If present and not empty\nthen this string plus a hyphen are prepended to the unique part.\n\n*uniqstr* – Optional, if not passed the unique part of the resulting\nfilename will be random. If passed in it will be generated from this string\nin a reproducible way.\n","readmeFilename":"README.md"}
+{
+ "name": "unique-filename",
+ "description": "Generate a unique filename for use in temporary directories or caches.",
+ "dist-tags": {
+ "latest": "3.0.0"
+ },
+ "versions": {
+ "3.0.0": {
+ "name": "unique-filename",
+ "version": "3.0.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "unique-filename@3.0.0",
+ "bugs": {
+ "url": "https://github.com/iarna/unique-filename/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "48ba7a5a16849f5080d26c760c86cf5cf05770ea",
+ "tarball": "http://localhost:4260/unique-filename/unique-filename-3.0.0.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+ "unpackedSize": 3414
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "49d999ed740c2455755fd19f774571e81454a75e",
+ "scripts": {
+ "lint": "eslint \"**/*.js\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/unique-filename.git",
+ "type": "git"
+ },
+ "_npmVersion": "8.19.2",
+ "description": "Generate a unique filename for use in temporary directories or caches.",
+ "directories": {},
+ "templateOSS": {
+ "version": "4.5.1",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "18.10.0",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "@npmcli/template-oss": "4.5.1",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/unique-filename.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/iarna/unique-filename",
+ "bugs": {
+ "url": "https://github.com/iarna/unique-filename/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/unique-slug/registry.json b/tests/registry/npm/unique-slug/registry.json
index 083e39c6d..b32216a69 100644
--- a/tests/registry/npm/unique-slug/registry.json
+++ b/tests/registry/npm/unique-slug/registry.json
@@ -1 +1,82 @@
-{"name":"unique-slug","description":"Generate a unique character string suitible for use in files and URLs.","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"unique-slug","version":"4.0.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"unique-slug@4.0.0","bugs":{"url":"https://github.com/npm/unique-slug/issues"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"]},"dist":{"shasum":"6bae6bb16be91351badd24cdce741f892a6532e3","tarball":"http://localhost:4260/unique-slug/unique-slug-4.0.0.tgz","fileCount":4,"integrity":"sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==","signatures":[{"sig":"MEQCIG6BD0MotYNS6i3pkwGEeSMZaU2X16DakfGa/ZnAUEdCAiB/h46e6TvTZ+WjZI0Wt6g3e98NKalhZBI3dRf4P3bKdA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2579,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjSPIsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoFFhAAk1x5mPWEmFyOF6IQ0Di6272m1JkcIrLGXGwP2k0Wg0KAfDIG\r\nidIJs6fOSITYh0og+JCngXfb/8P9FMividcK9d7JoLmjx+KJ6nmtpVfk2fLL\r\nWxvtayWUUqpGYwYM83QXVnOhpfMBF/xjpXjXbsZ3sBuxVMUDDuSxsW1DGUot\r\nLVfqZzWZAs4p5wWPOpPL0WEJztBZFezJ6Awi0AxsFr+hNuS9+QoSwQ1nSewg\r\nbbwnIALgCkd9zwCWJvPJfJhXAB6+7oGwkOMJ/bWaB7fkdvsYzycVmdN+C+Nq\r\ns5iTZbWY6t6+6gP79IKiKT6uBUHJ2KMnaJ+uN+DL8he6rIZnogPJxr2lMz6s\r\nrzZ9opOnadQBfqH+t6GmMOshI6+YaQbv5wSQCLPf4tEUcdgbccput/hd9rLu\r\nYDfLJgcZ8tswnO1mKsVdMAfpSDmr/K7yjvFQ8EpIjxOER9UwiGmZ2N3u95T9\r\nOM9Rgm5oxonYaDQ35cAlSdLKXcQdb9mKiBQJoBFarw5J0Rqq/oP5x29BA2Qy\r\n82i32537IiNnuGLM1rRF8jJAIZk6O4DA+bDKlPwLKFQYGN4I521OD498EX3q\r\n5/+Gtg07miHCmlMx58xvPhacogVh0XlsE2ncqwOQnVJGt+UWCXR1749MDIdK\r\n7hnJOHZ8G68VN+tcmgJOFJgY886ceXCpRIo=\r\n=IwzH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","engines":{"node":"^14.17.0 || ^16.13.0 || >=18.0.0"},"gitHead":"a1e990fea3f416b231fd0ffebc9f55bfa7359fcc","scripts":{"lint":"eslint \"**/*.js\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/unique-slug.git","type":"git"},"_npmVersion":"8.19.2","description":"Generate a unique character string suitible for use in files and URLs.","directories":{},"templateOSS":{"version":"4.5.1","//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"18.10.0","dependencies":{"imurmurhash":"^0.1.4"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","@npmcli/template-oss":"4.5.1","@npmcli/eslint-config":"^3.1.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/unique-slug.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/unique-slug#readme","bugs":{"url":"https://github.com/npm/unique-slug/issues"},"readme":"unique-slug\n===========\n\nGenerate a unique character string suitible for use in files and URLs.\n\n```\nvar uniqueSlug = require('unique-slug')\n\nvar randomSlug = uniqueSlug()\nvar fileSlug = uniqueSlug('/etc/passwd')\n```\n\n### uniqueSlug(*str*) → String (8 chars)\n\nIf *str* is passed in then the return value will be its murmur hash in\nhex.\n\nIf *str* is not passed in, it will be 4 randomly generated bytes\nconverted into 8 hexadecimal characters.\n","readmeFilename":"README.md"}
+{
+ "name": "unique-slug",
+ "description": "Generate a unique character string suitible for use in files and URLs.",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "unique-slug",
+ "version": "4.0.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "unique-slug@4.0.0",
+ "bugs": {
+ "url": "https://github.com/npm/unique-slug/issues"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "dist": {
+ "shasum": "6bae6bb16be91351badd24cdce741f892a6532e3",
+ "tarball": "http://localhost:4260/unique-slug/unique-slug-4.0.0.tgz",
+ "fileCount": 4,
+ "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+ "unpackedSize": 2579
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "a1e990fea3f416b231fd0ffebc9f55bfa7359fcc",
+ "scripts": {
+ "lint": "eslint \"**/*.js\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/unique-slug.git",
+ "type": "git"
+ },
+ "_npmVersion": "8.19.2",
+ "description": "Generate a unique character string suitible for use in files and URLs.",
+ "directories": {},
+ "templateOSS": {
+ "version": "4.5.1",
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "18.10.0",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "@npmcli/template-oss": "4.5.1",
+ "@npmcli/eslint-config": "^3.1.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/unique-slug.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/unique-slug#readme",
+ "bugs": {
+ "url": "https://github.com/npm/unique-slug/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/universalify/registry.json b/tests/registry/npm/universalify/registry.json
index 6bfa6c6c2..c26a344e3 100644
--- a/tests/registry/npm/universalify/registry.json
+++ b/tests/registry/npm/universalify/registry.json
@@ -1 +1,66 @@
-{"name":"universalify","description":"Make a callback- or promise-based function support both promises and callbacks.","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"universalify","version":"2.0.0","description":"Make a callback- or promise-based function support both promises and callbacks.","bugs":{"url":"https://github.com/RyanZim/universalify/issues"},"license":"MIT","author":{"name":"Ryan Zimmerman","email":"opensrc@ryanzim.com"},"repository":{"type":"git","url":"git+https://github.com/RyanZim/universalify.git"},"scripts":{"test":"standard && nyc tape test/*.js | colortape"},"devDependencies":{"colortape":"^0.1.2","coveralls":"^3.0.1","nyc":"^15.0.0","standard":"^14.3.1","tape":"^5.0.1"},"engines":{"node":">= 10.0.0"},"gitHead":"a853a4aedc63c69fcdc62b77643d75b0d162a098","_id":"universalify@2.0.0","_nodeVersion":"14.0.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==","shasum":"75a4984efedc4b08975c5aeb73f530d02df25717","tarball":"http://localhost:4260/universalify/universalify-2.0.0.tgz","fileCount":4,"unpackedSize":4639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfHDUNCRA9TVsSAnZWagAAYNEP/RZVxoo7bLXWTTzcZmi6\nVwER5sd6QoPf/Q1mWa5sBFTIUFivbm/NNFZo891lRwAFovDcR14390HNF8yz\n7U+YtOOhBDV1NsLonz1OHvvde0ucqz+fcEG3zBI3MWOP/BNgAo1PXYINjKmi\nwGk+sSBzrM+ZFo6LNfhQJ9aK2LXxNjP7YhshBfQW5Y7cElnpzCRrvdx42fZR\nYXfn1Av1Y36woZ48PB9nfgLJiLRJEzr+BFbuGlwdd/FNzXAmoH5cEmZkPYeP\nXbqhswpWOHuee4RVRkSRsPMcbpo/WemxmHrMxuG49Hcqe6rXrUEWZVU7FgJt\n1U5KOT4W5IbSuqNIL222cyDV62Tw1yhc1Y4A5LhhggI6n0aRAiNFbn9YTJU1\nN0U2ARxHYfnwLI623nLluLZvYjDGyMO6XpiCOAp+T2scbtO/T7uudsd4FP6+\nAd3A7LPQsvXdlv9FtRN941tdkVQ9AN4ZYFtrv3+2m1NpkwUnqUGlRugJlUb5\n7bn6Dd1HLU92xnk0K84tb3nQ+fNjXA/fJmO0yDuSJRMhamJ1gyrY/W7rsh8C\nwWdHWQWxVfFSvvL4pA4ZZb9TaZhNIPwB0/NRTLay1HQKm4k0+U0dVGeyPkmh\n37LjowAQrzwA4rXTwDNiBPmNvTlT8xiPQifRjiNZb7ffNiPOtrxVoO15wBw6\n5Hym\r\n=lhr8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfzHvKe3Ujr8OkM/r7gRIC8lRqcO8zDF9nVeIBguVDxwIhAMVxBOPq6uoO7pcsx5yA7K5aiqunDvGAjtKmqxZR5LGB"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# universalify\n\n[![Travis branch](https://img.shields.io/travis/RyanZim/universalify/master.svg)](https://travis-ci.org/RyanZim/universalify)\n![Coveralls github branch](https://img.shields.io/coveralls/github/RyanZim/universalify/master.svg)\n![npm](https://img.shields.io/npm/dm/universalify.svg)\n![npm](https://img.shields.io/npm/l/universalify.svg)\n\nMake a callback- or promise-based function support both promises and callbacks.\n\nUses the native promise implementation.\n\n## Installation\n\n```bash\nnpm install universalify\n```\n\n## API\n\n### `universalify.fromCallback(fn)`\n\nTakes a callback-based function to universalify, and returns the universalified function.\n\nFunction must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once.\n\n```js\nfunction callbackFn (n, cb) {\n setTimeout(() => cb(null, n), 15)\n}\n\nconst fn = universalify.fromCallback(callbackFn)\n\n// Works with Promises:\nfn('Hello World!')\n.then(result => console.log(result)) // -> Hello World!\n.catch(error => console.error(error))\n\n// Works with Callbacks:\nfn('Hi!', (error, result) => {\n if (error) return console.error(error)\n console.log(result)\n // -> Hi!\n})\n```\n\n### `universalify.fromPromise(fn)`\n\nTakes a promise-based function to universalify, and returns the universalified function.\n\nFunction must return a valid JS promise. `universalify` does not ensure that a valid promise is returned.\n\n```js\nfunction promiseFn (n) {\n return new Promise(resolve => {\n setTimeout(() => resolve(n), 15)\n })\n}\n\nconst fn = universalify.fromPromise(promiseFn)\n\n// Works with Promises:\nfn('Hello World!')\n.then(result => console.log(result)) // -> Hello World!\n.catch(error => console.error(error))\n\n// Works with Callbacks:\nfn('Hi!', (error, result) => {\n if (error) return console.error(error)\n console.log(result)\n // -> Hi!\n})\n```\n\n## License\n\nMIT\n","homepage":"https://github.com/RyanZim/universalify#readme","repository":{"type":"git","url":"git+https://github.com/RyanZim/universalify.git"},"author":{"name":"Ryan Zimmerman","email":"opensrc@ryanzim.com"},"bugs":{"url":"https://github.com/RyanZim/universalify/issues"},"license":"MIT","readmeFilename":"README.md"}
+{
+ "name": "universalify",
+ "description": "Make a callback- or promise-based function support both promises and callbacks.",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "universalify",
+ "version": "2.0.0",
+ "description": "Make a callback- or promise-based function support both promises and callbacks.",
+ "bugs": {
+ "url": "https://github.com/RyanZim/universalify/issues"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Ryan Zimmerman",
+ "email": "opensrc@ryanzim.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RyanZim/universalify.git"
+ },
+ "scripts": {
+ "test": "standard && nyc tape test/*.js | colortape"
+ },
+ "devDependencies": {
+ "colortape": "^0.1.2",
+ "coveralls": "^3.0.1",
+ "nyc": "^15.0.0",
+ "standard": "^14.3.1",
+ "tape": "^5.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "gitHead": "a853a4aedc63c69fcdc62b77643d75b0d162a098",
+ "_id": "universalify@2.0.0",
+ "_nodeVersion": "14.0.0",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "shasum": "75a4984efedc4b08975c5aeb73f530d02df25717",
+ "tarball": "http://localhost:4260/universalify/universalify-2.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 4639
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/RyanZim/universalify#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RyanZim/universalify.git"
+ },
+ "author": {
+ "name": "Ryan Zimmerman",
+ "email": "opensrc@ryanzim.com"
+ },
+ "bugs": {
+ "url": "https://github.com/RyanZim/universalify/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/update-browserslist-db/registry.json b/tests/registry/npm/update-browserslist-db/registry.json
index 57ee8cea7..6d2301324 100644
--- a/tests/registry/npm/update-browserslist-db/registry.json
+++ b/tests/registry/npm/update-browserslist-db/registry.json
@@ -1 +1,40 @@
-{"name":"update-browserslist-db","dist-tags":{"latest":"1.0.10"},"versions":{"1.0.10":{"name":"update-browserslist-db","version":"1.0.10","dependencies":{"escalade":"^3.1.1","picocolors":"^1.0.0"},"peerDependencies":{"browserslist":">= 4.21.0"},"bin":{"browserslist-lint":"cli.js"},"dist":{"integrity":"sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==","shasum":"0f54b876545726f17d00cd9a2561e6dade943ff3","tarball":"http://localhost:4260/update-browserslist-db/update-browserslist-db-1.0.10.tgz","fileCount":8,"unpackedSize":13581,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE0WA8i81fDJ2wiJD0Gbj31BrBAQ8LpRdLGjJ4Jt0GdGAiEA69VYu+dpFQdGLqhfFMyfQB30n3nnHgP/pumK3ZKyx/Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPbgHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrh0w//Z6zXG/lgz/mxTTYkkCLJXjAWSbeCUyRimfYHZB5j09B9YAmR\r\nQEtb1h2X7OyECjspS8+ymYE+yD9Ciz56J7smZihLGvE8BTGEO8bT57v0AILl\r\n3K9dILXznHypnCSpZbI3yFvqWaPkCdjEcKZ+ioi2/xLbuEMtRi4P3M+Ud/Ue\r\nN6Dz4s6dqxkvmh86NthMVvlYEtk9gGSBJEI41yc6VV43CfzR176zYOb3h40E\r\nq+x15wj1kvjvTOOa9PrbK2rcPS/8fGXvG039+p4F0nSiATRwV3mQVRH7enQO\r\nuVkE8EuDh91+UyhLiXkn51M5QZGT8iWVTh2GxAkljENmsupQjgUhglOwJ6A8\r\ntbyV2jBPxsoNAWgMBQT1ms3NI9H9nyYYbRoVujXgsfgRbnGbcZhUpJJL62Hz\r\nQgn2iVpijbs0D8B29G9DpXJjFXdUA3zLyJ04zDXOgyppioIRM46vThJcE6KP\r\nVO3WsbjbrxzNYmbJr0sqmQ44YoQAF/zhcmVGiKtxAf06zl7mRqXet1tCagDp\r\nk59ZHbw9MV1esJU2HPm0azgFeTPbRG2B9zIE6wA9MXVwHW+pfquEmXmE2C9D\r\njklw9920lduIoI6DUZ8TPvQxfadEXjwyOROq0W0ePBfGpnJ0KurYkrsHXZvW\r\nMsUXEn3pX6OU4pZwVQ6SoRIYXC/EUGHApPE=\r\n=u80j\r\n-----END PGP SIGNATURE-----\r\n"},"funding":[{"type":"opencollective","url":"https://opencollective.com/browserslist"},{"type":"tidelift","url":"https://tidelift.com/funding/github/npm/browserslist"}]}},"modified":"2022-10-05T16:59:51.776Z"}
+{
+ "name": "update-browserslist-db",
+ "dist-tags": {
+ "latest": "1.0.10"
+ },
+ "versions": {
+ "1.0.10": {
+ "name": "update-browserslist-db",
+ "version": "1.0.10",
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "dist": {
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "shasum": "0f54b876545726f17d00cd9a2561e6dade943ff3",
+ "tarball": "http://localhost:4260/update-browserslist-db/update-browserslist-db-1.0.10.tgz",
+ "fileCount": 8,
+ "unpackedSize": 13581
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ]
+ }
+ },
+ "modified": "2022-10-05T16:59:51.776Z"
+}
diff --git a/tests/registry/npm/uri-js/registry.json b/tests/registry/npm/uri-js/registry.json
index d0b0fd71e..8f1d688e5 100644
--- a/tests/registry/npm/uri-js/registry.json
+++ b/tests/registry/npm/uri-js/registry.json
@@ -1 +1,82 @@
-{"name":"uri-js","description":"An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.","dist-tags":{"latest":"4.4.1"},"versions":{"4.4.1":{"name":"uri-js","version":"4.4.1","description":"An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.","main":"dist/es5/uri.all.js","types":"dist/es5/uri.all.d.ts","directories":{"test":"tests"},"scripts":{"build:esnext":"tsc","build:es5":"rollup -c && cp dist/esnext/uri.d.ts dist/es5/uri.all.d.ts && npm run build:es5:fix-sourcemap","build:es5:fix-sourcemap":"sorcery -i dist/es5/uri.all.js","build:es5:min":"uglifyjs dist/es5/uri.all.js --support-ie8 --output dist/es5/uri.all.min.js --in-source-map dist/es5/uri.all.js.map --source-map uri.all.min.js.map --comments --compress --mangle --pure-funcs merge subexp && mv uri.all.min.js.map dist/es5/ && cp dist/es5/uri.all.d.ts dist/es5/uri.all.min.d.ts","build":"npm run build:esnext && npm run build:es5 && npm run build:es5:min","clean":"rm -rf dist","test":"mocha -u mocha-qunit-ui dist/es5/uri.all.js tests/tests.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/garycourt/uri-js.git"},"author":{"name":"Gary Court","email":"gary.court@gmail.com"},"license":"BSD-2-Clause","bugs":{"url":"https://github.com/garycourt/uri-js/issues"},"devDependencies":{"babel-cli":"^6.26.0","babel-plugin-external-helpers":"^6.22.0","babel-preset-latest":"^6.24.1","mocha":"^8.2.1","mocha-qunit-ui":"^0.1.3","rollup":"^0.41.6","rollup-plugin-babel":"^2.7.1","rollup-plugin-node-resolve":"^2.0.0","sorcery":"^0.10.0","typescript":"^2.8.1","uglify-js":"^2.8.14"},"dependencies":{"punycode":"^2.1.0"},"gitHead":"9a328873a21262651c3790505b24c9e318a0e12d","_id":"uri-js@4.4.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==","shasum":"9b1a52595225859e55f669d928f88c6c57f2a77e","tarball":"http://localhost:4260/uri-js/uri-js-4.4.1.tgz","fileCount":46,"unpackedSize":469879,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf+k2hCRA9TVsSAnZWagAA34gQAIBCHrX9EiMnQ1y6Q/lA\nnH3L0pTQb47BwM+2z4HPTX/fzIMryYGjGTlr5M1e1ljQSiaIVUygAxqqD5Tg\nTJLguj9k4nhKsmsHFKmCzTkFK1R7foE/vhS+EZGWYc/bWkE6oAQ8+AX3Q53j\nP2HnbuK/kqWtfoskY43JiuRKS9AU39e03SnmZz3uUDCV/t+lF+cdBlzNAjG3\nesW3dV2ynyOBkouW7WolPYSULti6YXquvpgz1C2QGAkyxXKOJMf7jlYHN7wh\nId1MAR92XuzBgu2sYNzIxr6Qhd/Moi/1yb++otrm90OEC1wBgoXPbNsBzJSx\ndIwWbJ0DIjDnqAhVRzZ90MfC6qxRuCImpDd8feZ+nb343oUb8ofEME/hUG4Q\nPvAwKM8n+2BjNiwX2TyoGvAfuch6GwBrOUcMZM5SMW45ocEXZgHNPD2uIek9\nBMiaC1Ew9h97NDwi1SsB7HMBhUEQhT9cbz3ojeLE3GKfOmUBs4JdwbYk1n3+\nUfMhwoYvhqRugjUbFXpoBRbFBXWYPlEIR5GLcIozABblfuPLgmndZ0kefT6A\nW+WMbezye9qJPb2ARumFOfand+nHea4Grpa87cUzM/Pe+uzs7v9JflFdXDjP\nlymzW91jAE09aIh9rKaQHZCEZA/PeV66BzGPaoDb1sPS7AlMXEpLlzy5K/3B\nGWvW\r\n=SXo/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMs1qpyJpeN93ls+gFlrcOf7srUKNr2MjVpWe51VBgKAIhAJctn36ZpbANRujkBDQxFeKL1FoBpLuff6Dz7QOvxBh3"}]},"_hasShrinkwrap":false}},"readme":"# URI.js\n\nURI.js is an [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt) compliant, scheme extendable URI parsing/validating/resolving library for all JavaScript environments (browsers, Node.js, etc).\nIt is also compliant with the IRI ([RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)), IDNA ([RFC 5890](http://www.ietf.org/rfc/rfc5890.txt)), IPv6 Address ([RFC 5952](http://www.ietf.org/rfc/rfc5952.txt)), IPv6 Zone Identifier ([RFC 6874](http://www.ietf.org/rfc/rfc6874.txt)) specifications.\n\nURI.js has an extensive test suite, and works in all (Node.js, web) environments. It weighs in at 6.4kb (gzipped, 17kb deflated).\n\n## API\n\n### Parsing\n\n\tURI.parse(\"uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body\");\n\t//returns:\n\t//{\n\t// scheme : \"uri\",\n\t// userinfo : \"user:pass\",\n\t// host : \"example.com\",\n\t// port : 123,\n\t// path : \"/one/two.three\",\n\t// query : \"q1=a1&q2=a2\",\n\t// fragment : \"body\"\n\t//}\n\n### Serializing\n\n\tURI.serialize({scheme : \"http\", host : \"example.com\", fragment : \"footer\"}) === \"http://example.com/#footer\"\n\n### Resolving\n\n\tURI.resolve(\"uri://a/b/c/d?q\", \"../../g\") === \"uri://a/g\"\n\n### Normalizing\n\n\tURI.normalize(\"HTTP://ABC.com:80/%7Esmith/home.html\") === \"http://abc.com/~smith/home.html\"\n\n### Comparison\n\n\tURI.equal(\"example://a/b/c/%7Bfoo%7D\", \"eXAMPLE://a/./b/../b/%63/%7bfoo%7d\") === true\n\n### IP Support\n\n\t//IPv4 normalization\n\tURI.normalize(\"//192.068.001.000\") === \"//192.68.1.0\"\n\n\t//IPv6 normalization\n\tURI.normalize(\"//[2001:0:0DB8::0:0001]\") === \"//[2001:0:db8::1]\"\n\n\t//IPv6 zone identifier support\n\tURI.parse(\"//[2001:db8::7%25en1]\");\n\t//returns:\n\t//{\n\t// host : \"2001:db8::7%en1\"\n\t//}\n\n### IRI Support\n\n\t//convert IRI to URI\n\tURI.serialize(URI.parse(\"http://examplé.org/rosé\")) === \"http://xn--exampl-gva.org/ros%C3%A9\"\n\t//convert URI to IRI\n\tURI.serialize(URI.parse(\"http://xn--exampl-gva.org/ros%C3%A9\"), {iri:true}) === \"http://examplé.org/rosé\"\n\n### Options\n\nAll of the above functions can accept an additional options argument that is an object that can contain one or more of the following properties:\n\n*\t`scheme` (string)\n\n\tIndicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior.\n\n*\t`reference` (string)\n\n\tIf set to `\"suffix\"`, it indicates that the URI is in the suffix format, and the validator will use the option's `scheme` property to determine the URI's scheme.\n\n*\t`tolerant` (boolean, false)\n\n\tIf set to `true`, the parser will relax URI resolving rules.\n\n*\t`absolutePath` (boolean, false)\n\n\tIf set to `true`, the serializer will not resolve a relative `path` component.\n\n*\t`iri` (boolean, false)\n\n\tIf set to `true`, the serializer will unescape non-ASCII characters as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).\n\n*\t`unicodeSupport` (boolean, false)\n\n\tIf set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).\n\n*\t`domainHost` (boolean, false)\n\n\tIf set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt).\n\n## Scheme Extendable\n\nURI.js supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme) dependent processing rules. Currently, URI.js has built in support for the following schemes:\n\n*\thttp \\[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\\]\n*\thttps \\[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\\]\n*\tws \\[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\\]\n*\twss \\[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\\]\n*\tmailto \\[[RFC 6068](http://www.ietf.org/rfc/rfc6068.txt)\\]\n*\turn \\[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\\]\n*\turn:uuid \\[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\\]\n\n### HTTP/HTTPS Support\n\n\tURI.equal(\"HTTP://ABC.COM:80\", \"http://abc.com/\") === true\n\tURI.equal(\"https://abc.com\", \"HTTPS://ABC.COM:443/\") === true\n\n### WS/WSS Support\n\n\tURI.parse(\"wss://example.com/foo?bar=baz\");\n\t//returns:\n\t//{\n\t//\tscheme : \"wss\",\n\t//\thost: \"example.com\",\n\t//\tresourceName: \"/foo?bar=baz\",\n\t//\tsecure: true,\n\t//}\n\n\tURI.equal(\"WS://ABC.COM:80/chat#one\", \"ws://abc.com/chat\") === true\n\n### Mailto Support\n\n\tURI.parse(\"mailto:alpha@example.com,bravo@example.com?subject=SUBSCRIBE&body=Sign%20me%20up!\");\n\t//returns:\n\t//{\n\t//\tscheme : \"mailto\",\n\t//\tto : [\"alpha@example.com\", \"bravo@example.com\"],\n\t//\tsubject : \"SUBSCRIBE\",\n\t//\tbody : \"Sign me up!\"\n\t//}\n\n\tURI.serialize({\n\t\tscheme : \"mailto\",\n\t\tto : [\"alpha@example.com\"],\n\t\tsubject : \"REMOVE\",\n\t\tbody : \"Please remove me\",\n\t\theaders : {\n\t\t\tcc : \"charlie@example.com\"\n\t\t}\n\t}) === \"mailto:alpha@example.com?cc=charlie@example.com&subject=REMOVE&body=Please%20remove%20me\"\n\n### URN Support\n\n\tURI.parse(\"urn:example:foo\");\n\t//returns:\n\t//{\n\t//\tscheme : \"urn\",\n\t//\tnid : \"example\",\n\t//\tnss : \"foo\",\n\t//}\n\n#### URN UUID Support\n\n\tURI.parse(\"urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6\");\n\t//returns:\n\t//{\n\t//\tscheme : \"urn\",\n\t//\tnid : \"uuid\",\n\t//\tuuid : \"f81d4fae-7dec-11d0-a765-00a0c91e6bf6\",\n\t//}\n\n## Usage\n\nTo load in a browser, use the following tag:\n\n\t<script type=\"text/javascript\" src=\"uri-js/dist/es5/uri.all.min.js\"></script>\n\nTo load in a CommonJS/Module environment, first install with npm/yarn by running on the command line:\n\n\tnpm install uri-js\n\t# OR\n\tyarn add uri-js\n\nThen, in your code, load it using:\n\n\tconst URI = require(\"uri-js\");\n\nIf you are writing your code in ES6+ (ESNEXT) or TypeScript, you would load it using:\n\n\timport * as URI from \"uri-js\";\n\nOr you can load just what you need using named exports:\n\n\timport { parse, serialize, resolve, resolveComponents, normalize, equal, removeDotSegments, pctEncChar, pctDecChars, escapeComponent, unescapeComponent } from \"uri-js\";\n\n## Breaking changes\n\n### Breaking changes from 3.x\n\nURN parsing has been completely changed to better align with the specification. Scheme is now always `urn`, but has two new properties: `nid` which contains the Namspace Identifier, and `nss` which contains the Namespace Specific String. The `nss` property will be removed by higher order scheme handlers, such as the UUID URN scheme handler.\n\nThe UUID of a URN can now be found in the `uuid` property.\n\n### Breaking changes from 2.x\n\nURI validation has been removed as it was slow, exposed a vulnerabilty, and was generally not useful.\n\n### Breaking changes from 1.x\n\nThe `errors` array on parsed components is now an `error` string.\n","author":{"name":"Gary Court","email":"gary.court@gmail.com"},"homepage":"https://github.com/garycourt/uri-js","repository":{"type":"git","url":"git+ssh://git@github.com/garycourt/uri-js.git"},"bugs":{"url":"https://github.com/garycourt/uri-js/issues"},"license":"BSD-2-Clause","readmeFilename":"README.md"}
+{
+ "name": "uri-js",
+ "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.",
+ "dist-tags": {
+ "latest": "4.4.1"
+ },
+ "versions": {
+ "4.4.1": {
+ "name": "uri-js",
+ "version": "4.4.1",
+ "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.",
+ "main": "dist/es5/uri.all.js",
+ "types": "dist/es5/uri.all.d.ts",
+ "directories": {
+ "test": "tests"
+ },
+ "scripts": {
+ "build:esnext": "tsc",
+ "build:es5": "rollup -c && cp dist/esnext/uri.d.ts dist/es5/uri.all.d.ts && npm run build:es5:fix-sourcemap",
+ "build:es5:fix-sourcemap": "sorcery -i dist/es5/uri.all.js",
+ "build:es5:min": "uglifyjs dist/es5/uri.all.js --support-ie8 --output dist/es5/uri.all.min.js --in-source-map dist/es5/uri.all.js.map --source-map uri.all.min.js.map --comments --compress --mangle --pure-funcs merge subexp && mv uri.all.min.js.map dist/es5/ && cp dist/es5/uri.all.d.ts dist/es5/uri.all.min.d.ts",
+ "build": "npm run build:esnext && npm run build:es5 && npm run build:es5:min",
+ "clean": "rm -rf dist",
+ "test": "mocha -u mocha-qunit-ui dist/es5/uri.all.js tests/tests.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/garycourt/uri-js.git"
+ },
+ "author": {
+ "name": "Gary Court",
+ "email": "gary.court@gmail.com"
+ },
+ "license": "BSD-2-Clause",
+ "bugs": {
+ "url": "https://github.com/garycourt/uri-js/issues"
+ },
+ "devDependencies": {
+ "babel-cli": "^6.26.0",
+ "babel-plugin-external-helpers": "^6.22.0",
+ "babel-preset-latest": "^6.24.1",
+ "mocha": "^8.2.1",
+ "mocha-qunit-ui": "^0.1.3",
+ "rollup": "^0.41.6",
+ "rollup-plugin-babel": "^2.7.1",
+ "rollup-plugin-node-resolve": "^2.0.0",
+ "sorcery": "^0.10.0",
+ "typescript": "^2.8.1",
+ "uglify-js": "^2.8.14"
+ },
+ "dependencies": {
+ "punycode": "^2.1.0"
+ },
+ "gitHead": "9a328873a21262651c3790505b24c9e318a0e12d",
+ "_id": "uri-js@4.4.1",
+ "_nodeVersion": "12.18.3",
+ "_npmVersion": "6.14.6",
+ "dist": {
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "shasum": "9b1a52595225859e55f669d928f88c6c57f2a77e",
+ "tarball": "http://localhost:4260/uri-js/uri-js-4.4.1.tgz",
+ "fileCount": 46,
+ "unpackedSize": 469879
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Gary Court",
+ "email": "gary.court@gmail.com"
+ },
+ "homepage": "https://github.com/garycourt/uri-js",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/garycourt/uri-js.git"
+ },
+ "bugs": {
+ "url": "https://github.com/garycourt/uri-js/issues"
+ },
+ "license": "BSD-2-Clause",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/v8flags/registry.json b/tests/registry/npm/v8flags/registry.json
index 0fc1cc8e3..66e1dd52e 100644
--- a/tests/registry/npm/v8flags/registry.json
+++ b/tests/registry/npm/v8flags/registry.json
@@ -1 +1,84 @@
-{"name":"v8flags","description":"Get available v8 and Node.js flags.","dist-tags":{"latest":"4.0.1"},"versions":{"4.0.1":{"name":"v8flags","version":"4.0.1","description":"Get available v8 and Node.js flags.","author":{"name":"Gulp Team","email":"team@gulpjs.com","url":"https://gulpjs.com/"},"repository":{"type":"git","url":"git+https://github.com/gulpjs/v8flags.git"},"license":"MIT","engines":{"node":">= 10.13.0"},"main":"index.js","scripts":{"lint":"eslint .","pretest":"npm run lint","test":"nyc mocha --async-only"},"dependencies":{},"devDependencies":{"async":"^3.2.2","eslint":"^7.32.0","eslint-config-gulp":"^5.0.1","eslint-plugin-node":"^11.1.0","expect":"^27.3.1","mocha":"^8.4.0","nyc":"^15.1.0","proxyquire":"^2.1.3"},"nyc":{"reporter":["lcov","text-summary"]},"prettier":{"singleQuote":true},"_id":"v8flags@4.0.1","gitHead":"27a764557f20f90ea4b6ccd24eaacd9d0b6d3108","bugs":{"url":"https://github.com/gulpjs/v8flags/issues"},"_nodeVersion":"20.5.0","_npmVersion":"9.8.0","dist":{"integrity":"sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==","shasum":"98fe6c4308317c5f394d85a435eb192490f7e132","tarball":"http://localhost:4260/v8flags/v8flags-4.0.1.tgz","fileCount":5,"unpackedSize":9757,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIALVO7Jl3K1f93BllM4VAgxy/uwBX/P4FxO7D4TA0i0iAiACMIbiKyMSrFfsb7RDOB7+78Y9hOWNfJCc+Bv9Wedr4Q=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<p align=\"center\">\n <a href=\"http://gulpjs.com\">\n <img height=\"257\" width=\"114\" src=\"https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png\">\n </a>\n</p>\n\n# v8flags\n\n[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coveralls Status][coveralls-image]][coveralls-url]\n\nGet available v8 and Node.js flags.\n\n## Usage\n\n```js\nconst v8flags = require('v8flags');\n\nv8flags(function (err, results) {\n console.log(results);\n // [ '--use_strict',\n // '--es5_readonly',\n // '--es52_globals',\n // '--harmony_typeof',\n // '--harmony_scoping',\n // '--harmony_modules',\n // '--harmony_proxies',\n // '--harmony_collections',\n // '--harmony',\n // ...\n});\n```\n\n## API\n\n### `v8flags(cb)`\n\nFinds the available flags and calls the passed callback with any errors and an array of flag results.\n\n### `v8flags.configfile`\n\nThe name of the cache file for flags.\n\n### `v8flags.configPath`\n\nThe filepath location of the `configfile` above.\n\n## License\n\nMIT\n\n<!-- prettier-ignore-start -->\n[downloads-image]: https://img.shields.io/npm/dm/v8flags.svg?style=flat-square\n[npm-url]: https://www.npmjs.com/package/v8flags\n[npm-image]: https://img.shields.io/npm/v/v8flags.svg?style=flat-square\n\n[ci-url]: https://github.com/gulpjs/v8flags/actions?query=workflow:dev\n[ci-image]: https://img.shields.io/github/actions/workflow/status/gulpjs/v8flags/dev.yml?branch=master&style=flat-square\n\n[coveralls-url]: https://coveralls.io/r/gulpjs/v8flags\n[coveralls-image]: https://img.shields.io/coveralls/gulpjs/v8flags/master.svg?style=flat-square\n<!-- prettier-ignore-end -->\n","homepage":"https://github.com/gulpjs/v8flags#readme","repository":{"type":"git","url":"git+https://github.com/gulpjs/v8flags.git"},"author":{"name":"Gulp Team","email":"team@gulpjs.com","url":"https://gulpjs.com/"},"bugs":{"url":"https://github.com/gulpjs/v8flags/issues"},"readmeFilename":"README.md","license":"MIT"}
+{
+ "name": "v8flags",
+ "description": "Get available v8 and Node.js flags.",
+ "dist-tags": {
+ "latest": "4.0.1"
+ },
+ "versions": {
+ "4.0.1": {
+ "name": "v8flags",
+ "version": "4.0.1",
+ "description": "Get available v8 and Node.js flags.",
+ "author": {
+ "name": "Gulp Team",
+ "email": "team@gulpjs.com",
+ "url": "https://gulpjs.com/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/gulpjs/v8flags.git"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "main": "index.js",
+ "scripts": {
+ "lint": "eslint .",
+ "pretest": "npm run lint",
+ "test": "nyc mocha --async-only"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "async": "^3.2.2",
+ "eslint": "^7.32.0",
+ "eslint-config-gulp": "^5.0.1",
+ "eslint-plugin-node": "^11.1.0",
+ "expect": "^27.3.1",
+ "mocha": "^8.4.0",
+ "nyc": "^15.1.0",
+ "proxyquire": "^2.1.3"
+ },
+ "nyc": {
+ "reporter": [
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "prettier": {
+ "singleQuote": true
+ },
+ "_id": "v8flags@4.0.1",
+ "gitHead": "27a764557f20f90ea4b6ccd24eaacd9d0b6d3108",
+ "bugs": {
+ "url": "https://github.com/gulpjs/v8flags/issues"
+ },
+ "_nodeVersion": "20.5.0",
+ "_npmVersion": "9.8.0",
+ "dist": {
+ "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==",
+ "shasum": "98fe6c4308317c5f394d85a435eb192490f7e132",
+ "tarball": "http://localhost:4260/v8flags/v8flags-4.0.1.tgz",
+ "fileCount": 5,
+ "unpackedSize": 9757
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/gulpjs/v8flags#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/gulpjs/v8flags.git"
+ },
+ "author": {
+ "name": "Gulp Team",
+ "email": "team@gulpjs.com",
+ "url": "https://gulpjs.com/"
+ },
+ "bugs": {
+ "url": "https://github.com/gulpjs/v8flags/issues"
+ },
+ "readmeFilename": "README.md",
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/vue/registry.json b/tests/registry/npm/vue/registry.json
index 4ef357872..827538ed3 100644
--- a/tests/registry/npm/vue/registry.json
+++ b/tests/registry/npm/vue/registry.json
@@ -1 +1,98 @@
-{"name":"vue","description":"The progressive JavaScript framework for building modern web UI.","dist-tags":{"latest":"3.2.38"},"versions":{"3.2.38":{"name":"vue","version":"3.2.38","description":"The progressive JavaScript framework for building modern web UI.","main":"index.js","module":"dist/vue.runtime.esm-bundler.js","types":"dist/vue.d.ts","unpkg":"dist/vue.global.js","jsdelivr":"dist/vue.global.js","exports":{".":{"import":{"node":"./index.mjs","default":"./dist/vue.runtime.esm-bundler.js"},"require":"./index.js","types":"./dist/vue.d.ts"},"./server-renderer":{"import":"./server-renderer/index.mjs","require":"./server-renderer/index.js","types":"./server-renderer/index.d.ts"},"./compiler-sfc":{"import":"./compiler-sfc/index.mjs","require":"./compiler-sfc/index.js","types":"./compiler-sfc/index.d.ts"},"./dist/*":"./dist/*","./package.json":"./package.json","./macros":"./macros.d.ts","./macros-global":"./macros-global.d.ts","./ref-macros":"./ref-macros.d.ts"},"buildOptions":{"name":"Vue","formats":["esm-bundler","esm-bundler-runtime","cjs","global","global-runtime","esm-browser","esm-browser-runtime"]},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git"},"author":{"name":"Evan You"},"license":"MIT","bugs":{"url":"https://github.com/vuejs/core/issues"},"dependencies":{"@vue/shared":"3.2.38","@vue/compiler-dom":"3.2.38","@vue/runtime-dom":"3.2.38","@vue/compiler-sfc":"3.2.38","@vue/server-renderer":"3.2.38"},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"vue@3.2.38","dist":{"shasum":"cda3a414631745b194971219318a792dbbccdec0","integrity":"sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==","tarball":"http://localhost:4260/vue/vue-3.2.38.tgz","fileCount":33,"unpackedSize":2582962,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICYw8bB/a7dGz+BNmfIIbfc+57bnB3UcsOm7fwDRt+7NAiAPRRFQQne8YCpPLdOdIlCfYkB3oLKQKH459Ve/R+cm2Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcQOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRIg/+L4A2XyATarFXsUmo2z9UeBsnKbWmuzSy3sU1f0ICIh29M0bt\r\nClntjkenhrvqzmm+mL2dhzGnoAM5pKNj7C07bCHMIt836OPaqAG0jezhx+7p\r\nYGT4QxehYGHvsLUQ1bYaPt/ugUgKf8F41goAnRgGg7KemuKOs3cWAm4ACHVV\r\ndrSnyagg2nZsjuH8uLrlwy6QZeTy6S/fUVnMWBjMth79KdvhcSTE1EAiU0wE\r\nO+dk/4mvvpliw2sMAEsDF9v71nA8samN1ErUEQruRuGYluHVqlD4C7/+cUPO\r\n4lS46U+3YcjnsMM8qpZiUAiAtrA4U2h7i40apTub7tJPnmQOzxb4Kvlgqurj\r\nE8Wh+eAhTqNH9c9Qqjm38h+eIe4vo9WhoPTanii5KCBT6jZ8PgN+jV/+upYe\r\nHFPcfe9XOZj4Y9qz32OjRaTDm9Atcep9S6dHfwZCZ9eYTbjPkJIuMfz0j4dC\r\n4TIBQNqDFuknlXraFPYjd1j7aJ/9GYitObsGw9WbzapUHkaJYD0Dn3TFlmUF\r\nB6zCGMpNmur9Xie9WXVJy20tb4max6BUyXeU0KLvjq46lM5hlCIXDDsclNwa\r\nYJ1Bi/Xu8ZLQXmGHlu2XTPHPlAwi7N8Z3NiphvIDZKeB69LPnK2mw4Yn2Byv\r\nOMTSOiru/rgsq04m/py/rKh0Olhwiv+Iatk=\r\n=YsSk\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# vue\n\n## Which dist file to use?\n\n### From CDN or without a Bundler\n\n- **`vue(.runtime).global(.prod).js`**:\n - For direct use via `<script src=\"...\">` in the browser. Exposes the `Vue` global.\n - Note that global builds are not [UMD](https://github.com/umdjs/umd) builds. They are built as [IIFEs](https://developer.mozilla.org/en-US/docs/Glossary/IIFE) and is only meant for direct use via `<script src=\"...\">`.\n - In-browser template compilation:\n - **`vue.global.js`** is the \"full\" build that includes both the compiler and the runtime so it supports compiling templates on the fly.\n - **`vue.runtime.global.js`** contains only the runtime and requires templates to be pre-compiled during a build step.\n - Inlines all Vue core internal packages - i.e. it's a single file with no dependencies on other files. This means you **must** import everything from this file and this file only to ensure you are getting the same instance of code.\n - Contains hard-coded prod/dev branches, and the prod build is pre-minified. Use the `*.prod.js` files for production.\n\n- **`vue(.runtime).esm-browser(.prod).js`**:\n - For usage via native ES modules imports (in browser via `<script type=\"module\">`.\n - Shares the same runtime compilation, dependency inlining and hard-coded prod/dev behavior with the global build.\n\n### With a Bundler\n\n- **`vue(.runtime).esm-bundler.js`**:\n\n - For use with bundlers like `webpack`, `rollup` and `parcel`.\n - Leaves prod/dev branches with `process.env.NODE_ENV` guards (must be replaced by bundler)\n - Does not ship minified builds (to be done together with the rest of the code after bundling)\n - Imports dependencies (e.g. `@vue/runtime-core`, `@vue/runtime-compiler`)\n - Imported dependencies are also `esm-bundler` builds and will in turn import their dependencies (e.g. `@vue/runtime-core` imports `@vue/reactivity`)\n - This means you **can** install/import these deps individually without ending up with different instances of these dependencies, but you must make sure they all resolve to the same version.\n - In-browser template compilation:\n - **`vue.runtime.esm-bundler.js` (default)** is runtime only, and requires all templates to be pre-compiled. This is the default entry for bundlers (via `module` field in `package.json`) because when using a bundler templates are typically pre-compiled (e.g. in `*.vue` files).\n - **`vue.esm-bundler.js`**: includes the runtime compiler. Use this if you are using a bundler but still want runtime template compilation (e.g. in-DOM templates or templates via inline JavaScript strings). You will need to configure your bundler to alias `vue` to this file.\n\n#### Bundler Build Feature Flags\n\nStarting with 3.0.0-rc.3, `esm-bundler` builds now exposes global feature flags that can be overwritten at compile time:\n\n- `__VUE_OPTIONS_API__` (enable/disable Options API support, default: `true`)\n- `__VUE_PROD_DEVTOOLS__` (enable/disable devtools support in production, default: `false`)\n\nThe build will work without configuring these flags, however it is **strongly recommended** to properly configure them in order to get proper tree-shaking in the final bundle. To configure these flags:\n\n- webpack: use [DefinePlugin](https://webpack.js.org/plugins/define-plugin/)\n- Rollup: use [@rollup/plugin-replace](https://github.com/rollup/plugins/tree/master/packages/replace)\n- Vite: configured by default, but can be overwritten using the [`define` option](https://github.com/vitejs/vite/blob/a4133c073e640b17276b2de6e91a6857bdf382e1/src/node/config.ts#L72-L76)\n\nNote: the replacement value **must be boolean literals** and cannot be strings, otherwise the bundler/minifier will not be able to properly evaluate the conditions.\n\n### For Server-Side Rendering\n\n- **`vue.cjs(.prod).js`**:\n - For use in Node.js server-side rendering via `require()`.\n - If you bundle your app with webpack with `target: 'node'` and properly externalize `vue`, this is the build that will be loaded.\n - The dev/prod files are pre-built, but the appropriate file is automatically required based on `process.env.NODE_ENV`.\n","author":{"name":"Evan You"},"repository":{"type":"git","url":"git+https://github.com/vuejs/core.git"},"readmeFilename":"README.md","homepage":"https://github.com/vuejs/core/tree/main/packages/vue#readme","bugs":{"url":"https://github.com/vuejs/core/issues"},"license":"MIT"}
+{
+ "name": "vue",
+ "description": "The progressive JavaScript framework for building modern web UI.",
+ "dist-tags": {
+ "latest": "3.2.38"
+ },
+ "versions": {
+ "3.2.38": {
+ "name": "vue",
+ "version": "3.2.38",
+ "description": "The progressive JavaScript framework for building modern web UI.",
+ "main": "index.js",
+ "module": "dist/vue.runtime.esm-bundler.js",
+ "types": "dist/vue.d.ts",
+ "unpkg": "dist/vue.global.js",
+ "jsdelivr": "dist/vue.global.js",
+ "exports": {
+ ".": {
+ "import": {
+ "node": "./index.mjs",
+ "default": "./dist/vue.runtime.esm-bundler.js"
+ },
+ "require": "./index.js",
+ "types": "./dist/vue.d.ts"
+ },
+ "./server-renderer": {
+ "import": "./server-renderer/index.mjs",
+ "require": "./server-renderer/index.js",
+ "types": "./server-renderer/index.d.ts"
+ },
+ "./compiler-sfc": {
+ "import": "./compiler-sfc/index.mjs",
+ "require": "./compiler-sfc/index.js",
+ "types": "./compiler-sfc/index.d.ts"
+ },
+ "./dist/*": "./dist/*",
+ "./package.json": "./package.json",
+ "./macros": "./macros.d.ts",
+ "./macros-global": "./macros-global.d.ts",
+ "./ref-macros": "./ref-macros.d.ts"
+ },
+ "buildOptions": {
+ "name": "Vue",
+ "formats": [
+ "esm-bundler",
+ "esm-bundler-runtime",
+ "cjs",
+ "global",
+ "global-runtime",
+ "esm-browser",
+ "esm-browser-runtime"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git"
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "dependencies": {
+ "@vue/shared": "3.2.38",
+ "@vue/compiler-dom": "3.2.38",
+ "@vue/runtime-dom": "3.2.38",
+ "@vue/compiler-sfc": "3.2.38",
+ "@vue/server-renderer": "3.2.38"
+ },
+ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
+ "_id": "vue@3.2.38",
+ "dist": {
+ "shasum": "cda3a414631745b194971219318a792dbbccdec0",
+ "integrity": "sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==",
+ "tarball": "http://localhost:4260/vue/vue-3.2.38.tgz",
+ "fileCount": 33,
+ "unpackedSize": 2582962
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Evan You"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vuejs/core.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/vuejs/core/tree/main/packages/vue#readme",
+ "bugs": {
+ "url": "https://github.com/vuejs/core/issues"
+ },
+ "license": "MIT"
+}
diff --git a/tests/registry/npm/which-module/registry.json b/tests/registry/npm/which-module/registry.json
index 6de46b125..762e068c4 100644
--- a/tests/registry/npm/which-module/registry.json
+++ b/tests/registry/npm/which-module/registry.json
@@ -1 +1,66 @@
-{"name":"which-module","description":"Find the module object for something that was require()d","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"which-module","version":"2.0.0","description":"Find the module object for something that was require()d","main":"index.js","scripts":{"pretest":"standard","test":"nyc ava","coverage":"nyc report --reporter=text-lcov | coveralls","release":"standard-version"},"files":["index.js"],"repository":{"type":"git","url":"git+https://github.com/nexdrew/which-module.git"},"author":{"name":"nexdrew"},"license":"ISC","bugs":{"url":"https://github.com/nexdrew/which-module/issues"},"devDependencies":{"ava":"^0.19.1","coveralls":"^2.13.1","nyc":"^10.3.0","standard":"^10.0.2","standard-version":"^4.0.0"},"gitHead":"7f78f42d0761133263c3947a3b24dde324a467ce","_id":"which-module@2.0.0","_shasum":"d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","dist":{"shasum":"d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a","tarball":"http://localhost:4260/which-module/which-module-2.0.0.tgz","integrity":"sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC53OPKZYZEE0kq+DSThbHCGmj9pK3ydC0qIfmE6vmSkQIhAMuI0FnrJwWYGDqZGh7/upXLNzuN3E3Zj872XxGix75U"}]}}},"readme":"# which-module\n\n> Find the module object for something that was require()d\n\n[![Build Status](https://travis-ci.org/nexdrew/which-module.svg?branch=master)](https://travis-ci.org/nexdrew/which-module)\n[![Coverage Status](https://coveralls.io/repos/github/nexdrew/which-module/badge.svg?branch=master)](https://coveralls.io/github/nexdrew/which-module?branch=master)\n[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)\n\nFind the `module` object in `require.cache` for something that was `require()`d\nor `import`ed - essentially a reverse `require()` lookup.\n\nUseful for libs that want to e.g. lookup a filename for a module or submodule\nthat it did not `require()` itself.\n\n## Install and Usage\n\n```\nnpm install --save which-module\n```\n\n```js\nconst whichModule = require('which-module')\n\nconsole.log(whichModule(require('something')))\n// Module {\n// id: '/path/to/project/node_modules/something/index.js',\n// exports: [Function],\n// parent: ...,\n// filename: '/path/to/project/node_modules/something/index.js',\n// loaded: true,\n// children: [],\n// paths: [ '/path/to/project/node_modules/something/node_modules',\n// '/path/to/project/node_modules',\n// '/path/to/node_modules',\n// '/path/node_modules',\n// '/node_modules' ] }\n```\n\n## API\n\n### `whichModule(exported)`\n\nReturn the [`module` object](https://nodejs.org/api/modules.html#modules_the_module_object),\nif any, that represents the given argument in the `require.cache`.\n\n`exported` can be anything that was previously `require()`d or `import`ed as a\nmodule, submodule, or dependency - which means `exported` is identical to the\n`module.exports` returned by this method.\n\nIf `exported` did not come from the `exports` of a `module` in `require.cache`,\nthen this method returns `null`.\n\n## License\n\nISC © Contributors\n","homepage":"https://github.com/nexdrew/which-module#readme","repository":{"type":"git","url":"git+https://github.com/nexdrew/which-module.git"},"author":{"name":"nexdrew"},"bugs":{"url":"https://github.com/nexdrew/which-module/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "which-module",
+ "description": "Find the module object for something that was require()d",
+ "dist-tags": {
+ "latest": "2.0.0"
+ },
+ "versions": {
+ "2.0.0": {
+ "name": "which-module",
+ "version": "2.0.0",
+ "description": "Find the module object for something that was require()d",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "standard",
+ "test": "nyc ava",
+ "coverage": "nyc report --reporter=text-lcov | coveralls",
+ "release": "standard-version"
+ },
+ "files": [
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/nexdrew/which-module.git"
+ },
+ "author": {
+ "name": "nexdrew"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/nexdrew/which-module/issues"
+ },
+ "devDependencies": {
+ "ava": "^0.19.1",
+ "coveralls": "^2.13.1",
+ "nyc": "^10.3.0",
+ "standard": "^10.0.2",
+ "standard-version": "^4.0.0"
+ },
+ "gitHead": "7f78f42d0761133263c3947a3b24dde324a467ce",
+ "_id": "which-module@2.0.0",
+ "_shasum": "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a",
+ "_from": ".",
+ "_npmVersion": "4.2.0",
+ "_nodeVersion": "7.9.0",
+ "dist": {
+ "shasum": "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a",
+ "tarball": "http://localhost:4260/which-module/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+ }
+ }
+ },
+ "homepage": "https://github.com/nexdrew/which-module#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/nexdrew/which-module.git"
+ },
+ "author": {
+ "name": "nexdrew"
+ },
+ "bugs": {
+ "url": "https://github.com/nexdrew/which-module/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/which/registry.json b/tests/registry/npm/which/registry.json
index b3285014b..855222fd3 100644
--- a/tests/registry/npm/which/registry.json
+++ b/tests/registry/npm/which/registry.json
@@ -1 +1,158 @@
-{"name":"which","description":"Like which(1) unix command. Find the first instance of an executable in the PATH.","dist-tags":{"latest":"4.0.0"},"versions":{"2.0.2":{"name":"which","version":"2.0.2","author":{"url":"http://blog.izs.me","name":"Isaac Z. Schlueter","email":"i@izs.me"},"license":"ISC","_id":"which@2.0.2","bugs":{"url":"https://github.com/isaacs/node-which/issues"},"bin":{"node-which":"./bin/node-which"},"tap":{"check-coverage":true},"dist":{"shasum":"7c6a8dd0a636a0327e10b59c9286eee93f3f51b1","tarball":"http://localhost:4260/which/which-2.0.2.tgz","fileCount":6,"integrity":"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==","signatures":[{"sig":"MEYCIQDyPP0ND3fboT3W2mBlojUZmkvbY2KjDxGtB8vG07fjWAIhAPYfINxHQt1SI7Ic6dhnGscWdcYwLfGhKRrIcS6tW8Js","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":9975,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3BQjCRA9TVsSAnZWagAAROcQAKSZ8CI1Iv2+wYWgfiWF\nhBylRFmu7Deko4CMQd7U0q2ALJhejNZ3Ld+OTGDPTsL08FOfjMlyyBS5UIAa\nCjBJXWJlqGHEEhnJhZrOzYnUioSJg/uZVevKJdLsO46pAYAOZFUdt29o66pT\nruKcq2LuGNeZx/hv4iah5arJ94p96skBe/J8H7HzJ5ka3FHfF22l6Uy3wkJE\n4R78ldIoRTkWjmOYOdHc+MLn+VFcqIQArUh7DF1PIYvhCigQDs//0IxVft5h\nSk9fKmoHH+Dg27cq/apCSdz/S2QjTRCE58sRE9BmluWl3HMCcGz4kicAu6yg\nRkBlB6Qs5jDWtftA2dYpNEQqc50lsiI2l5ZDyp2xdbT/YLr1jrc/vpg1zTSQ\nL+qH2geftMEQazcIYqEHIwaPtZOu0UCr6wDRlKMMd9FQM6Iq4ERUHcdzDSzX\nGXxDqkGCkVRhT9KTz/VQvMmGx9cNCfeF2AafJw/NUvyYA48/CTCovHSzxUpE\nc/n4WmnZZ2OsWnTsJeFeEG7avXFUPYRByObGSeLg59zuzsW4WcDm7TgNMgmJ\nKUlXea2WFQA4nuvGh3E/FJQhTOwN+pvPK4Wh9BCmgUMkT0QDSUAAJUjfFxpF\nE3akdS+Y+NPQkBk8rCwbUlbuvKTqNFgSABmVZ6djvIyiGsol2ze7i708ZX5c\nXfF1\r\n=W89C\r\n-----END PGP SIGNATURE-----\r\n"},"main":"which.js","engines":{"node":">= 8"},"gitHead":"6a822d836de79f92fb3170f685a6e283fbfeff87","scripts":{"test":"tap","changelog":"git add CHANGELOG.md","prepublish":"npm run changelog","preversion":"npm test","postpublish":"git push origin --follow-tags","postversion":"npm publish","prechangelog":"bash gen-changelog.sh","postchangelog":"git commit -m 'update changelog - '${npm_package_version}"},"repository":{"url":"git://github.com/isaacs/node-which.git","type":"git"},"_npmVersion":"6.13.1","description":"Like which(1) unix command. Find the first instance of an executable in the PATH.","directories":{},"_nodeVersion":"12.12.0","dependencies":{"isexe":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^14.6.9","mkdirp":"^0.5.0","rimraf":"^2.6.2"}},"4.0.0":{"name":"which","version":"4.0.0","author":{"name":"GitHub Inc."},"license":"ISC","_id":"which@4.0.0","bugs":{"url":"https://github.com/npm/node-which/issues"},"bin":{"node-which":"bin/which.js"},"tap":{"nyc-arg":["--exclude","tap-snapshots/**"],"check-coverage":true},"dist":{"shasum":"cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a","tarball":"http://localhost:4260/which/which-4.0.0.tgz","fileCount":5,"integrity":"sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==","signatures":[{"sig":"MEYCIQDxKC/VdlmpCGbE2hcOXKsSAUD3InV9ZHni303CQiEJxAIhAPugO1gz+W1lYM2gG1nszdjZhbwB6huvWYVVqEu0BRyH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"http://localhost:4260/attestations/which@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7505},"main":"lib/index.js","engines":{"node":"^16.13.0 || >=18.0.0"},"gitHead":"3038155822c2e6f38694843ede2ca03ee841a2e8","scripts":{"lint":"eslint \"**/*.js\"","snap":"tap","test":"tap","lintfix":"npm run lint -- --fix","postlint":"template-oss-check","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force"},"repository":{"url":"git+https://github.com/npm/node-which.git","type":"git"},"_npmVersion":"9.8.1","description":"Like which(1) unix command. Find the first instance of an executable in the PATH.","directories":{},"templateOSS":{"publish":"true","version":"4.18.0","ciVersions":["16.13.0","16.x","18.0.0","18.x"],"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten."},"_nodeVersion":"18.17.1","dependencies":{"isexe":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tap":"^16.3.0","@npmcli/template-oss":"4.18.0","@npmcli/eslint-config":"^4.0.0"}}},"author":{"name":"GitHub Inc."},"repository":{"url":"git+https://github.com/npm/node-which.git","type":"git"},"license":"ISC","homepage":"https://github.com/npm/node-which#readme","bugs":{"url":"https://github.com/npm/node-which/issues"},"readme":"# which\n\nLike the unix `which` utility.\n\nFinds the first instance of a specified executable in the PATH\nenvironment variable. Does not cache the results, so `hash -r` is not\nneeded when the PATH changes.\n\n## USAGE\n\n```javascript\nconst which = require('which')\n\n// async usage\n// rejects if not found\nconst resolved = await which('node')\n\n// if nothrow option is used, returns null if not found\nconst resolvedOrNull = await which('node', { nothrow: true })\n\n// sync usage\n// throws if not found\nconst resolved = which.sync('node')\n\n// if nothrow option is used, returns null if not found\nconst resolvedOrNull = which.sync('node', { nothrow: true })\n\n// Pass options to override the PATH and PATHEXT environment vars.\nawait which('node', { path: someOtherPath, pathExt: somePathExt })\n```\n\n## CLI USAGE\n\nJust like the BSD `which(1)` binary but using `node-which`.\n\n```\nusage: node-which [-as] program ...\n```\n\nYou can learn more about why the binary is `node-which` and not `which` \n[here](https://github.com/npm/node-which/pull/67)\n\n## OPTIONS\n\nYou may pass an options object as the second argument.\n\n- `path`: Use instead of the `PATH` environment variable.\n- `pathExt`: Use instead of the `PATHEXT` environment variable.\n- `all`: Return all matches, instead of just the first one. Note that\n this means the function returns an array of strings instead of a\n single string.\n","readmeFilename":"README.md"}
+{
+ "name": "which",
+ "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "2.0.2": {
+ "name": "which",
+ "version": "2.0.2",
+ "author": {
+ "url": "http://blog.izs.me",
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "license": "ISC",
+ "_id": "which@2.0.2",
+ "bugs": {
+ "url": "https://github.com/isaacs/node-which/issues"
+ },
+ "bin": {
+ "node-which": "./bin/node-which"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "dist": {
+ "shasum": "7c6a8dd0a636a0327e10b59c9286eee93f3f51b1",
+ "tarball": "http://localhost:4260/which/which-2.0.2.tgz",
+ "fileCount": 6,
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "unpackedSize": 9975
+ },
+ "main": "which.js",
+ "engines": {
+ "node": ">= 8"
+ },
+ "gitHead": "6a822d836de79f92fb3170f685a6e283fbfeff87",
+ "scripts": {
+ "test": "tap",
+ "changelog": "git add CHANGELOG.md",
+ "prepublish": "npm run changelog",
+ "preversion": "npm test",
+ "postpublish": "git push origin --follow-tags",
+ "postversion": "npm publish",
+ "prechangelog": "bash gen-changelog.sh",
+ "postchangelog": "git commit -m 'update changelog - '${npm_package_version}"
+ },
+ "repository": {
+ "url": "git://github.com/isaacs/node-which.git",
+ "type": "git"
+ },
+ "_npmVersion": "6.13.1",
+ "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
+ "directories": {},
+ "_nodeVersion": "12.12.0",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^14.6.9",
+ "mkdirp": "^0.5.0",
+ "rimraf": "^2.6.2"
+ }
+ },
+ "4.0.0": {
+ "name": "which",
+ "version": "4.0.0",
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "license": "ISC",
+ "_id": "which@4.0.0",
+ "bugs": {
+ "url": "https://github.com/npm/node-which/issues"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "tap": {
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ],
+ "check-coverage": true
+ },
+ "dist": {
+ "shasum": "cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a",
+ "tarball": "http://localhost:4260/which/which-4.0.0.tgz",
+ "fileCount": 5,
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "attestations": {
+ "url": "http://localhost:4260/attestations/which@4.0.0",
+ "provenance": {
+ "predicateType": "https://slsa.dev/provenance/v1"
+ }
+ },
+ "unpackedSize": 7505
+ },
+ "main": "lib/index.js",
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ },
+ "gitHead": "3038155822c2e6f38694843ede2ca03ee841a2e8",
+ "scripts": {
+ "lint": "eslint \"**/*.js\"",
+ "snap": "tap",
+ "test": "tap",
+ "lintfix": "npm run lint -- --fix",
+ "postlint": "template-oss-check",
+ "posttest": "npm run lint",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/node-which.git",
+ "type": "git"
+ },
+ "_npmVersion": "9.8.1",
+ "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
+ "directories": {},
+ "templateOSS": {
+ "publish": "true",
+ "version": "4.18.0",
+ "ciVersions": [
+ "16.13.0",
+ "16.x",
+ "18.0.0",
+ "18.x"
+ ],
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten."
+ },
+ "_nodeVersion": "18.17.1",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "_hasShrinkwrap": false,
+ "devDependencies": {
+ "tap": "^16.3.0",
+ "@npmcli/template-oss": "4.18.0",
+ "@npmcli/eslint-config": "^4.0.0"
+ }
+ }
+ },
+ "author": {
+ "name": "GitHub Inc."
+ },
+ "repository": {
+ "url": "git+https://github.com/npm/node-which.git",
+ "type": "git"
+ },
+ "license": "ISC",
+ "homepage": "https://github.com/npm/node-which#readme",
+ "bugs": {
+ "url": "https://github.com/npm/node-which/issues"
+ },
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/wrap-ansi/registry.json b/tests/registry/npm/wrap-ansi/registry.json
index bb3a6bda7..f64be8385 100644
--- a/tests/registry/npm/wrap-ansi/registry.json
+++ b/tests/registry/npm/wrap-ansi/registry.json
@@ -1 +1,183 @@
-{"name":"wrap-ansi","description":"Wordwrap a string with ANSI escape codes","dist-tags":{"latest":"8.1.0"},"versions":{"6.2.0":{"name":"wrap-ansi","version":"6.2.0","description":"Wordwrap a string with ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/wrap-ansi.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"sindresorhus.com"},"engines":{"node":">=8"},"scripts":{"test":"xo && nyc ava"},"dependencies":{"ansi-styles":"^4.0.0","string-width":"^4.1.0","strip-ansi":"^6.0.0"},"devDependencies":{"ava":"^2.1.0","chalk":"^2.4.2","coveralls":"^3.0.3","has-ansi":"^3.0.0","nyc":"^14.1.1","xo":"^0.24.0"},"gitHead":"a28eb7d6cdbf91bccb56d04d095ca9463c15d3db","bugs":{"url":"https://github.com/chalk/wrap-ansi/issues"},"_id":"wrap-ansi@6.2.0","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==","shasum":"e9393ba07102e6c91a3b221478f0257cd2856e53","tarball":"http://localhost:4260/wrap-ansi/wrap-ansi-6.2.0.tgz","fileCount":4,"unpackedSize":9500,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdyYdxCRA9TVsSAnZWagAA2dsQAIzMpppxZ5UnooIOBZqe\nHRhqc79iACxFpe+EFGO2Ft3Zba0Ccte4oQzRPUQ+r3iA/o0nDgLvaHMaSnTw\nK073n6Ak7y50s3jyhlEJIRUm9paQlrgc70odMBbU3jq1NshGK9g4ERdp1sfj\n8EohNgBs87ZTUc+P6jJ7KcqAswKxUwDmfB0G+0jPw+bko/aDJBv5Yv7bwHby\nfDSC1ONZySASjq/vf24TeqE44cvk7nH2A3b57x85ha5htcWUM+LdjDZg+QQe\nwvN/udVaKVZTQMwT1IIzf5SE8FZ3OEyCj6WnksQhHHOHmCWC70QSqQqh6eye\nWm8QZ+ZZh+s1d88Zf3iZvhyK0R16SNHznfILad19m9c89EEV6RsfFG4xnurs\nsEr3goedqs2ZDL057fLrtMnHf8ZXUXfuP5eI5TAaO6OtEJ3rEDNau9IlK5Nd\nXnxxJNHaGyDi9kPZAWz7ESyKu6uDiMlFSDn3mS10FPU5hRRkkHvaDEQYTEp3\nJk6QNOk/AlNubQVE/BzwBPLwgEhsDxUvEuUnyTGpmtPz6FPmBuhZJJ0CZIPB\nG1cZ7Bt/+WZkDRKzvqld81tJm4rBo68B+DmhJCsgDD+9Zkax+j6vJeDqt++y\nGJdaTsk/GvSwSHIW5dUi12utdn4Jy6RgPyJIxDb8TcFVI2Dm+JPuAiNJ0cQn\nBt9z\r\n=hCBi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBo3DJI+PdNrF7RgmAf56UxJWAD2qFlXFjEPQ0O5V/6wAiBP8UrlLK7UcyawI9lH3EiEvMkPVSAEMlg5XUyR0X4aBw=="}]},"directories":{},"_hasShrinkwrap":false},"7.0.0":{"name":"wrap-ansi","version":"7.0.0","description":"Wordwrap a string with ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/wrap-ansi.git"},"funding":"https://github.com/chalk/wrap-ansi?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"engines":{"node":">=10"},"scripts":{"test":"xo && nyc ava"},"dependencies":{"ansi-styles":"^4.0.0","string-width":"^4.1.0","strip-ansi":"^6.0.0"},"devDependencies":{"ava":"^2.1.0","chalk":"^4.0.0","coveralls":"^3.0.3","has-ansi":"^4.0.0","nyc":"^15.0.1","xo":"^0.29.1"},"gitHead":"c81bf7d6d0a9c1a49f7ce6413fbc8fbcf9938330","bugs":{"url":"https://github.com/chalk/wrap-ansi/issues"},"_id":"wrap-ansi@7.0.0","_nodeVersion":"10.20.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==","shasum":"67e145cff510a6a6984bdf1152911d69d2eb9e43","tarball":"http://localhost:4260/wrap-ansi/wrap-ansi-7.0.0.tgz","fileCount":4,"unpackedSize":10648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeoHaECRA9TVsSAnZWagAAK24P/jwyeF34W9cqIv/B3ksz\n92WOZxBeOfH13jbFs4Ha3FhMDAtvLeTJeomi6vcxSMEm2QwClv4xWQB8zHom\nqOXcdDIZ0vOXXZIEtkdpRsYu+jYh5sH/Wqp7CZMtYbMuAPZb2JmmbW+8YL5H\nSOX9I1J8VUGZ0Nsz12tEYbWDaeeK1ALa6qp88TfiUtOGr8T+GhI1kIH9zSEq\nper8hpXgbaX14k+sAey2iVY4zZmfPQbKEbcpPUKLX3QHVYuRVWcI/eFgET9C\nyA39dJDetiFDdPrSKps8/5YA+jNbYWyip+ljT8/Em2PF5JJlOuAii+42EKyM\nUwxii3cKKQ4Q5Zuh5j2RnFutBOFdCLOQfYZAoJEeuxd2UQPZrTEOGD5mXbng\n7g3wf33Syyr+SVbHnRCI8NNrRu1agm4m/uIpugTuvPo1cg4I+hNshRGX1+1D\n5DJKE9KSpz5M67B6mZfsJfLC5ksGtrNBDFvjNAoqo69oSNaGfFJZNC0iXHE6\nIYkRDb/aN4w6JmnaO6vFIx4+5HozLd3iDLKzlDYmTloJNjN1r9kcdMnQUoAG\n5IGC8lGYuTQYyhemyJ92e+OaZQBXaPxBa64Atvj9psPTFko5m18FOqh0HMbp\nreGEUF3K+5wyUv+1C97ZAHbxJ5ZJ3s/qCeIzzWcxuEiqAAAiDxpPmOj9WXan\nRWNd\r\n=dAFV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKo7j2UdQx54mSbTdaaej2HDd+7W+ESXd3KKVPvJfvJAIhAMJ7QP5IP0+ZduLVTIUpiMK2pHSoyirpMJPR7ttSpH2z"}]},"directories":{},"_hasShrinkwrap":false},"8.1.0":{"name":"wrap-ansi","version":"8.1.0","description":"Wordwrap a string with ANSI escape codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/chalk/wrap-ansi.git"},"funding":"https://github.com/chalk/wrap-ansi?sponsor=1","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":{"types":"./index.d.ts","default":"./index.js"},"engines":{"node":">=12"},"scripts":{"test":"xo && nyc ava && tsd"},"dependencies":{"ansi-styles":"^6.1.0","string-width":"^5.0.1","strip-ansi":"^7.0.1"},"devDependencies":{"ava":"^3.15.0","chalk":"^4.1.2","coveralls":"^3.1.1","has-ansi":"^5.0.1","nyc":"^15.1.0","tsd":"^0.25.0","xo":"^0.44.0"},"types":"./index.d.ts","gitHead":"115090266b0ebb1797032582de78d617575778ab","bugs":{"url":"https://github.com/chalk/wrap-ansi/issues"},"_id":"wrap-ansi@8.1.0","_nodeVersion":"14.21.1","_npmVersion":"9.2.0","dist":{"integrity":"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==","shasum":"56dc22368ee570face1b49819975d9b9a5ead214","tarball":"http://localhost:4260/wrap-ansi/wrap-ansi-8.1.0.tgz","fileCount":5,"unpackedSize":11777,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCTLHPWZRhU1psYEAvTz2AEDNsMLsR+G9tplhjk3/R3BAIgNOJvHTwK2n7NB5EqKVWO2XlPckE0YuQWw6rMaitomrA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzl3EACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpO/A//bYXkxwhhxDVoigdWOaNHiKW+majk5idpXfyGE5PoWIgsqFut\r\nP0aBrryVq2ghKQeknXKuOvpqP2Hp0sJSM6MoLDye3gfk+HNlyJzVdHalk6N8\r\n0DifL08xKkdsbtG0+anIaaI1PVoyL5S8I5FkLZrl+/SKenE5FnlT91rdJi2P\r\n+LiGCRYmA/t+8NbnCvy898l0ZOzQlfM9tdni7V/Sbn8Qgr2lUXJTEqhausHI\r\nIYBTWyW5MWIh4/pfVfFHDDMcdXBKvQ4VRhZC+aPQUjVCGPvW5CWZnP3OPm8a\r\nNfJIO35tUkGN002iswqVdTexuRp5nioJoqRmk2FLC5dnuiKi6Nb0BMB3yy+L\r\nJJXOY+0jF0G3JFFLm82UTCEVFX79uYflr+qaOyRI2GvJzWL9Xjva4VbKbBs5\r\n9o2NoZAbc4sgMlFvUU+xKav3rH+76mQJeJdL+eCKwZkeQomOnrhxrLv5Kc4j\r\nEN1g/vcLEJG/A8u6yWXpxl+/vZYWv6KeNnGhwLF5ffDY0ox1yOb2kHmH73bN\r\nmgavI+Qq7CP3bZFfTM5uJxk9L7ZocdlziHdRE+WllVG3199KvO63RKohUtNb\r\nvJs9XFEHlevDhHne+D0R7oRhN2j9ivImAyrz49hqE7o2UTldVv3qgFY0boeT\r\niPTeVHWKSmTLDzMTbyHNWObQWegh6j8+g9I=\r\n=Y4Bg\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_hasShrinkwrap":false}},"readme":"# wrap-ansi\n\n> Wordwrap a string with [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles)\n\n## Install\n\n```sh\nnpm install wrap-ansi\n```\n\n## Usage\n\n```js\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nconst input = 'The quick brown ' + chalk.red('fox jumped over ') +\n\t'the lazy ' + chalk.green('dog and then ran away with the unicorn.');\n\nconsole.log(wrapAnsi(input, 20));\n```\n\n<img width=\"331\" src=\"screenshot.png\">\n\n## API\n\n### wrapAnsi(string, columns, options?)\n\nWrap words to the specified column width.\n\n#### string\n\nType: `string`\n\nA string with ANSI escape codes, like one styled by [`chalk`](https://github.com/chalk/chalk).\n\nNewline characters will be normalized to `\\n`.\n\n#### columns\n\nType: `number`\n\nThe number of columns to wrap the text to.\n\n#### options\n\nType: `object`\n\n##### hard\n\nType: `boolean`\\\nDefault: `false`\n\nBy default the wrap is soft, meaning long words may extend past the column width. Setting this to `true` will make it hard wrap at the column width.\n\n##### wordWrap\n\nType: `boolean`\\\nDefault: `true`\n\nBy default, an attempt is made to split words at spaces, ensuring that they don't extend past the configured columns. If wordWrap is `false`, each column will instead be completely filled splitting words as necessary.\n\n##### trim\n\nType: `boolean`\\\nDefault: `true`\n\nWhitespace on all lines is removed by default. Set this option to `false` if you don't want to trim.\n\n## Related\n\n- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes\n- [cli-truncate](https://github.com/sindresorhus/cli-truncate) - Truncate a string to a specific width in the terminal\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n- [jsesc](https://github.com/mathiasbynens/jsesc) - Generate ASCII-only output from Unicode strings. Useful for creating test fixtures.\n","homepage":"https://github.com/chalk/wrap-ansi#readme","repository":{"type":"git","url":"git+https://github.com/chalk/wrap-ansi.git"},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"bugs":{"url":"https://github.com/chalk/wrap-ansi/issues"},"license":"MIT","readmeFilename":"readme.md"}
+{
+ "name": "wrap-ansi",
+ "description": "Wordwrap a string with ANSI escape codes",
+ "dist-tags": {
+ "latest": "8.1.0"
+ },
+ "versions": {
+ "6.2.0": {
+ "name": "wrap-ansi",
+ "version": "6.2.0",
+ "description": "Wordwrap a string with ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/wrap-ansi.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && nyc ava"
+ },
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.1.0",
+ "chalk": "^2.4.2",
+ "coveralls": "^3.0.3",
+ "has-ansi": "^3.0.0",
+ "nyc": "^14.1.1",
+ "xo": "^0.24.0"
+ },
+ "gitHead": "a28eb7d6cdbf91bccb56d04d095ca9463c15d3db",
+ "bugs": {
+ "url": "https://github.com/chalk/wrap-ansi/issues"
+ },
+ "_id": "wrap-ansi@6.2.0",
+ "_nodeVersion": "12.13.0",
+ "_npmVersion": "6.12.0",
+ "dist": {
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "shasum": "e9393ba07102e6c91a3b221478f0257cd2856e53",
+ "tarball": "http://localhost:4260/wrap-ansi/wrap-ansi-6.2.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 9500
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "7.0.0": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "description": "Wordwrap a string with ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/wrap-ansi.git"
+ },
+ "funding": "https://github.com/chalk/wrap-ansi?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && nyc ava"
+ },
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.1.0",
+ "chalk": "^4.0.0",
+ "coveralls": "^3.0.3",
+ "has-ansi": "^4.0.0",
+ "nyc": "^15.0.1",
+ "xo": "^0.29.1"
+ },
+ "gitHead": "c81bf7d6d0a9c1a49f7ce6413fbc8fbcf9938330",
+ "bugs": {
+ "url": "https://github.com/chalk/wrap-ansi/issues"
+ },
+ "_id": "wrap-ansi@7.0.0",
+ "_nodeVersion": "10.20.1",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "shasum": "67e145cff510a6a6984bdf1152911d69d2eb9e43",
+ "tarball": "http://localhost:4260/wrap-ansi/wrap-ansi-7.0.0.tgz",
+ "fileCount": 4,
+ "unpackedSize": 10648
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ },
+ "8.1.0": {
+ "name": "wrap-ansi",
+ "version": "8.1.0",
+ "description": "Wordwrap a string with ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/wrap-ansi.git"
+ },
+ "funding": "https://github.com/chalk/wrap-ansi?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "type": "module",
+ "exports": {
+ "types": "./index.d.ts",
+ "default": "./index.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "scripts": {
+ "test": "xo && nyc ava && tsd"
+ },
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "devDependencies": {
+ "ava": "^3.15.0",
+ "chalk": "^4.1.2",
+ "coveralls": "^3.1.1",
+ "has-ansi": "^5.0.1",
+ "nyc": "^15.1.0",
+ "tsd": "^0.25.0",
+ "xo": "^0.44.0"
+ },
+ "types": "./index.d.ts",
+ "gitHead": "115090266b0ebb1797032582de78d617575778ab",
+ "bugs": {
+ "url": "https://github.com/chalk/wrap-ansi/issues"
+ },
+ "_id": "wrap-ansi@8.1.0",
+ "_nodeVersion": "14.21.1",
+ "_npmVersion": "9.2.0",
+ "dist": {
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "shasum": "56dc22368ee570face1b49819975d9b9a5ead214",
+ "tarball": "http://localhost:4260/wrap-ansi/wrap-ansi-8.1.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 11777
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/chalk/wrap-ansi#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/wrap-ansi.git"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chalk/wrap-ansi/issues"
+ },
+ "license": "MIT",
+ "readmeFilename": "readme.md"
+}
diff --git a/tests/registry/npm/y18n/registry.json b/tests/registry/npm/y18n/registry.json
index 61a88b5df..dcb5f0f07 100644
--- a/tests/registry/npm/y18n/registry.json
+++ b/tests/registry/npm/y18n/registry.json
@@ -1 +1,72 @@
-{"name":"y18n","description":"the bare-bones internationalization library used by yargs","dist-tags":{"latest":"4.0.3","latest-4":"4.0.3"},"versions":{"4.0.3":{"name":"y18n","version":"4.0.3","description":"the bare-bones internationalization library used by yargs","main":"index.js","scripts":{"pretest":"standard","test":"nyc mocha","coverage":"nyc report --reporter=text-lcov | coveralls","release":"standard-version"},"repository":{"type":"git","url":"git+ssh://git@github.com/yargs/y18n.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","bugs":{"url":"https://github.com/yargs/y18n/issues"},"devDependencies":{"chai":"^4.0.1","coveralls":"^3.0.0","mocha":"^4.0.1","nyc":"^11.0.1","rimraf":"^2.5.0","standard":"^10.0.0-beta.0","standard-version":"^4.2.0"},"readme":"# y18n\n\n[![Build Status][travis-image]][travis-url]\n[![Coverage Status][coveralls-image]][coveralls-url]\n[![NPM version][npm-image]][npm-url]\n[![js-standard-style][standard-image]][standard-url]\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\nThe bare-bones internationalization library used by yargs.\n\nInspired by [i18n](https://www.npmjs.com/package/i18n).\n\n## Examples\n\n_simple string translation:_\n\n```js\nvar __ = require('y18n').__\n\nconsole.log(__('my awesome string %s', 'foo'))\n```\n\noutput:\n\n`my awesome string foo`\n\n_using tagged template literals_\n\n```js\nvar __ = require('y18n').__\nvar str = 'foo'\n\nconsole.log(__`my awesome string ${str}`)\n```\n\noutput:\n\n`my awesome string foo`\n\n_pluralization support:_\n\n```js\nvar __n = require('y18n').__n\n\nconsole.log(__n('one fish %s', '%d fishes %s', 2, 'foo'))\n```\n\noutput:\n\n`2 fishes foo`\n\n## JSON Language Files\n\nThe JSON language files should be stored in a `./locales` folder.\nFile names correspond to locales, e.g., `en.json`, `pirate.json`.\n\nWhen strings are observed for the first time they will be\nadded to the JSON file corresponding to the current locale.\n\n## Methods\n\n### require('y18n')(config)\n\nCreate an instance of y18n with the config provided, options include:\n\n* `directory`: the locale directory, default `./locales`.\n* `updateFiles`: should newly observed strings be updated in file, default `true`.\n* `locale`: what locale should be used.\n* `fallbackToLanguage`: should fallback to a language-only file (e.g. `en.json`)\n be allowed if a file matching the locale does not exist (e.g. `en_US.json`),\n default `true`.\n\n### y18n.\\_\\_(str, arg, arg, arg)\n\nPrint a localized string, `%s` will be replaced with `arg`s.\n\nThis function can also be used as a tag for a template literal. You can use it\nlike this: <code>__&#96;hello ${'world'}&#96;</code>. This will be equivalent to\n`__('hello %s', 'world')`.\n\n### y18n.\\_\\_n(singularString, pluralString, count, arg, arg, arg)\n\nPrint a localized string with appropriate pluralization. If `%d` is provided\nin the string, the `count` will replace this placeholder.\n\n### y18n.setLocale(str)\n\nSet the current locale being used.\n\n### y18n.getLocale()\n\nWhat locale is currently being used?\n\n### y18n.updateLocale(obj)\n\nUpdate the current locale with the key value pairs in `obj`.\n\n## License\n\nISC\n\n[travis-url]: https://travis-ci.org/yargs/y18n\n[travis-image]: https://img.shields.io/travis/yargs/y18n.svg\n[coveralls-url]: https://coveralls.io/github/yargs/y18n\n[coveralls-image]: https://img.shields.io/coveralls/yargs/y18n.svg\n[npm-url]: https://npmjs.org/package/y18n\n[npm-image]: https://img.shields.io/npm/v/y18n.svg\n[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg\n[standard-url]: https://github.com/feross/standard\n","readmeFilename":"README.md","gitHead":"0aa97c508ea31efadd2a27f98fed6873eefc963e","_id":"y18n@4.0.3","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==","shasum":"b5f259c82cd6e336921efd7bfd8bf560de9eeedf","tarball":"http://localhost:4260/y18n/y18n-4.0.3.tgz","fileCount":5,"unpackedSize":10991,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgbfRkCRA9TVsSAnZWagAA14wP/iqe8XL9SWtCbOGAoOAZ\nkbCD5JlnBrfniybyuX+UaPG136jHEgEYRfaH4KGH6tWtpLmCcL0haK8ZsACk\nqLQP/G5w4b+QWpLAX2wBzQRMxOeQAyIfFuuwoRoyoAv+8oyFezX0/QAIRxu6\ng5O8c0pWtQRMN7hqV2RsbAL9CokxDuUEFjephKLvo9Fn9X4A3TuBuSzfvUbo\n5CuIeKRnsI7Ucp+nzrZ93PaqBRJhibsXSx44SL3oCfm44+vZCZyvBYuhYr5F\ngR46eCldtVEj9NEiR+/7jYPHi2Ijq7F8Ll9s3hqVujfAq9S+aIZ1lAktJB3M\nOVACLqQFd9ZGyd3Jlx0//SiwFA/U5UbHm4YmuqjpFOcvwJBwboi9ERdDXnb4\nyvup++XQWk0+OYEKgohtCevwkffHp9Tyz48nz5KEGwhlo/T1J7k0RFnKdA/Y\nwbSzh+JfcQKmuVF136L30hD+iP6oQgYPBwMFTpIuz7dlSkob32FMO9aAY0IQ\nOyDeF5exM5DTLOhq0dcZ4SUKK/aJ0u7td9qaaZWxctPZv8RgCRDkKPRPVKIr\neHfzvbCPSvbJbeY7ogCqowSt7OSMGcd6MS+zEUU5r6OX3ePX4oZPeAlwVAyo\nQ8WNDkD+1D061NCuDyatdyyr62qx1bNZwsEoS7p+y6EeEEFcyK0yWTkb1Ii0\nrCkB\r\n=siRq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnkHHWjnL+X5hHbt7TnnNsW9bcnUjymQjk6IXCEasnKwIhAK4hlGypSf7vIAiZFz8Hv0h+v3IxRqN4WzjTi6whxXyY"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# y18n\n\n[![NPM version][npm-image]][npm-url]\n[![js-standard-style][standard-image]][standard-url]\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\nThe bare-bones internationalization library used by yargs.\n\nInspired by [i18n](https://www.npmjs.com/package/i18n).\n\n## Examples\n\n_simple string translation:_\n\n```js\nconst __ = require('y18n')().__;\n\nconsole.log(__('my awesome string %s', 'foo'));\n```\n\noutput:\n\n`my awesome string foo`\n\n_using tagged template literals_\n\n```js\nconst __ = require('y18n')().__;\n\nconst str = 'foo';\n\nconsole.log(__`my awesome string ${str}`);\n```\n\noutput:\n\n`my awesome string foo`\n\n_pluralization support:_\n\n```js\nconst __n = require('y18n')().__n;\n\nconsole.log(__n('one fish %s', '%d fishes %s', 2, 'foo'));\n```\n\noutput:\n\n`2 fishes foo`\n\n## Deno Example\n\nAs of `v5` `y18n` supports [Deno](https://github.com/denoland/deno):\n\n```typescript\nimport y18n from \"https://deno.land/x/y18n/deno.ts\";\n\nconst __ = y18n({\n locale: 'pirate',\n directory: './test/locales'\n}).__\n\nconsole.info(__`Hi, ${'Ben'} ${'Coe'}!`)\n```\n\nYou will need to run with `--allow-read` to load alternative locales.\n\n## JSON Language Files\n\nThe JSON language files should be stored in a `./locales` folder.\nFile names correspond to locales, e.g., `en.json`, `pirate.json`.\n\nWhen strings are observed for the first time they will be\nadded to the JSON file corresponding to the current locale.\n\n## Methods\n\n### require('y18n')(config)\n\nCreate an instance of y18n with the config provided, options include:\n\n* `directory`: the locale directory, default `./locales`.\n* `updateFiles`: should newly observed strings be updated in file, default `true`.\n* `locale`: what locale should be used.\n* `fallbackToLanguage`: should fallback to a language-only file (e.g. `en.json`)\n be allowed if a file matching the locale does not exist (e.g. `en_US.json`),\n default `true`.\n\n### y18n.\\_\\_(str, arg, arg, arg)\n\nPrint a localized string, `%s` will be replaced with `arg`s.\n\nThis function can also be used as a tag for a template literal. You can use it\nlike this: <code>__&#96;hello ${'world'}&#96;</code>. This will be equivalent to\n`__('hello %s', 'world')`.\n\n### y18n.\\_\\_n(singularString, pluralString, count, arg, arg, arg)\n\nPrint a localized string with appropriate pluralization. If `%d` is provided\nin the string, the `count` will replace this placeholder.\n\n### y18n.setLocale(str)\n\nSet the current locale being used.\n\n### y18n.getLocale()\n\nWhat locale is currently being used?\n\n### y18n.updateLocale(obj)\n\nUpdate the current locale with the key value pairs in `obj`.\n\n## Supported Node.js Versions\n\nLibraries in this ecosystem make a best effort to track\n[Node.js' release schedule](https://nodejs.org/en/about/releases/). Here's [a\npost on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a).\n\n## License\n\nISC\n\n[npm-url]: https://npmjs.org/package/y18n\n[npm-image]: https://img.shields.io/npm/v/y18n.svg\n[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg\n[standard-url]: https://github.com/feross/standard\n","homepage":"https://github.com/yargs/y18n","repository":{"type":"git","url":"git+https://github.com/yargs/y18n.git"},"author":{"name":"Ben Coe","email":"bencoe@gmail.com"},"bugs":{"url":"https://github.com/yargs/y18n/issues"},"license":"ISC","readmeFilename":"README.md"}
+{
+ "name": "y18n",
+ "description": "the bare-bones internationalization library used by yargs",
+ "dist-tags": {
+ "latest": "4.0.3",
+ "latest-4": "4.0.3"
+ },
+ "versions": {
+ "4.0.3": {
+ "name": "y18n",
+ "version": "4.0.3",
+ "description": "the bare-bones internationalization library used by yargs",
+ "main": "index.js",
+ "scripts": {
+ "pretest": "standard",
+ "test": "nyc mocha",
+ "coverage": "nyc report --reporter=text-lcov | coveralls",
+ "release": "standard-version"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/yargs/y18n.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/yargs/y18n/issues"
+ },
+ "devDependencies": {
+ "chai": "^4.0.1",
+ "coveralls": "^3.0.0",
+ "mocha": "^4.0.1",
+ "nyc": "^11.0.1",
+ "rimraf": "^2.5.0",
+ "standard": "^10.0.0-beta.0",
+ "standard-version": "^4.2.0"
+ },
+ "readme": "# y18n\n\n[![Build Status][travis-image]][travis-url]\n[![Coverage Status][coveralls-image]][coveralls-url]\n[![NPM version][npm-image]][npm-url]\n[![js-standard-style][standard-image]][standard-url]\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\nThe bare-bones internationalization library used by yargs.\n\nInspired by [i18n](https://www.npmjs.com/package/i18n).\n\n## Examples\n\n_simple string translation:_\n\n```js\nvar __ = require('y18n').__\n\nconsole.log(__('my awesome string %s', 'foo'))\n```\n\noutput:\n\n`my awesome string foo`\n\n_using tagged template literals_\n\n```js\nvar __ = require('y18n').__\nvar str = 'foo'\n\nconsole.log(__`my awesome string ${str}`)\n```\n\noutput:\n\n`my awesome string foo`\n\n_pluralization support:_\n\n```js\nvar __n = require('y18n').__n\n\nconsole.log(__n('one fish %s', '%d fishes %s', 2, 'foo'))\n```\n\noutput:\n\n`2 fishes foo`\n\n## JSON Language Files\n\nThe JSON language files should be stored in a `./locales` folder.\nFile names correspond to locales, e.g., `en.json`, `pirate.json`.\n\nWhen strings are observed for the first time they will be\nadded to the JSON file corresponding to the current locale.\n\n## Methods\n\n### require('y18n')(config)\n\nCreate an instance of y18n with the config provided, options include:\n\n* `directory`: the locale directory, default `./locales`.\n* `updateFiles`: should newly observed strings be updated in file, default `true`.\n* `locale`: what locale should be used.\n* `fallbackToLanguage`: should fallback to a language-only file (e.g. `en.json`)\n be allowed if a file matching the locale does not exist (e.g. `en_US.json`),\n default `true`.\n\n### y18n.\\_\\_(str, arg, arg, arg)\n\nPrint a localized string, `%s` will be replaced with `arg`s.\n\nThis function can also be used as a tag for a template literal. You can use it\nlike this: <code>__&#96;hello ${'world'}&#96;</code>. This will be equivalent to\n`__('hello %s', 'world')`.\n\n### y18n.\\_\\_n(singularString, pluralString, count, arg, arg, arg)\n\nPrint a localized string with appropriate pluralization. If `%d` is provided\nin the string, the `count` will replace this placeholder.\n\n### y18n.setLocale(str)\n\nSet the current locale being used.\n\n### y18n.getLocale()\n\nWhat locale is currently being used?\n\n### y18n.updateLocale(obj)\n\nUpdate the current locale with the key value pairs in `obj`.\n\n## License\n\nISC\n\n[travis-url]: https://travis-ci.org/yargs/y18n\n[travis-image]: https://img.shields.io/travis/yargs/y18n.svg\n[coveralls-url]: https://coveralls.io/github/yargs/y18n\n[coveralls-image]: https://img.shields.io/coveralls/yargs/y18n.svg\n[npm-url]: https://npmjs.org/package/y18n\n[npm-image]: https://img.shields.io/npm/v/y18n.svg\n[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg\n[standard-url]: https://github.com/feross/standard\n",
+ "readmeFilename": "README.md",
+ "gitHead": "0aa97c508ea31efadd2a27f98fed6873eefc963e",
+ "_id": "y18n@4.0.3",
+ "_nodeVersion": "12.21.0",
+ "_npmVersion": "6.14.11",
+ "dist": {
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "shasum": "b5f259c82cd6e336921efd7bfd8bf560de9eeedf",
+ "tarball": "http://localhost:4260/y18n/y18n-4.0.3.tgz",
+ "fileCount": 5,
+ "unpackedSize": 10991
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/yargs/y18n",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/y18n.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "bencoe@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/y18n/issues"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/yallist/registry.json b/tests/registry/npm/yallist/registry.json
index 98b5313c1..02e10e5ae 100644
--- a/tests/registry/npm/yallist/registry.json
+++ b/tests/registry/npm/yallist/registry.json
@@ -1 +1,68 @@
-{"name":"yallist","description":"Yet Another Linked List","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"name":"yallist","version":"4.0.0","description":"Yet Another Linked List","main":"yallist.js","directories":{"test":"test"},"dependencies":{},"devDependencies":{"tap":"^12.1.0"},"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+https://github.com/isaacs/yallist.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"ISC","gitHead":"1649cc57394b5affeca2c573943ebe3ed7d39119","bugs":{"url":"https://github.com/isaacs/yallist/issues"},"_id":"yallist@4.0.0","_nodeVersion":"12.8.1","_npmVersion":"6.12.0-next.0","dist":{"integrity":"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==","shasum":"9bb92790d9c0effec63be73519e11a35019a3a72","tarball":"http://localhost:4260/yallist/yallist-4.0.0.tgz","fileCount":5,"unpackedSize":14752,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkmCpCRA9TVsSAnZWagAAkVgP/3zxsW6EFohtKYJOFO0J\nlkdsbK2ee8965Oy4UNyD9F+d13p47zFmrNztw+zVS+gEt9AkSpjwMomHdQAV\nJ9NBsGaG7ppjaeNNfp8CwGO2El0rILWeEr4YdhoL6wfnxa/yuQ6HeuJty097\nOZ/FP3CXPCxj8Jlos0NwjLig/Yemtt1PNNlufcDhcKX+wzftExCMir+lBBna\nq5NpnUnOQnr3+QUFqeRHXWgPh4nJLGd9NuAmu/HcrlCnu1FEd3nWrmKtEvVg\n3GZn8lK8FLteiAxS4rHaQb8QX0W9r/RGLxuvla/KXq9LfxucTStI5pLhTj3A\nZlOxZDI/v+0wXAfr3+Bcsq5sJefk0+N5h0sWc9+hl+L2yvbMiZr2e8Z67msS\n9Hl8uwvjMwtEOCTMIyBdvBVy0OCzvEHjm+2tYwd/e3VTTWzEc9zIdUirWVU/\nqcCgSMnN+8MjV+8KLdLHVjDuxQSHFlm0LcmaU5ILlKX57rKFVOVWt8ZJ3wep\nuAzfUOkmrwWR+lN58w/MIbhdwqHcMpLmgXBJEHEtbfh7Qk6yK+A/Q237YBNq\nYIIB24k7z0vcAPN82s3LxxfLxbQBzFB1mwT8NcKQCG5XJbef8V3LLJeD78iZ\n1NvS7tl8VpSUg5Vc3C5OJvmbxbFiVPZXio/nFnwwR2jNe6ukFJ/YKlSo5MrA\ny6Ty\r\n=3Dpm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYUnufgWErBDMXe8KslrNmcyrPV1kGU2qlaK4ZeXoazwIhAKBpS5djrxLEclmS9SbzcNwhJJW8F7NXnArMOSGiGSCv"}]},"_hasShrinkwrap":false}},"readme":"# yallist\n\nYet Another Linked List\n\nThere are many doubly-linked list implementations like it, but this\none is mine.\n\nFor when an array would be too big, and a Map can't be iterated in\nreverse order.\n\n## basic usage\n\n```js\nimport { Yallist } from 'yallist'\nvar myList = new Yallist([1, 2, 3])\nmyList.push('foo')\nmyList.unshift('bar')\n// of course pop() and shift() are there, too\nconsole.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo']\nmyList.forEach(function (k) {\n // walk the list head to tail\n})\nmyList.forEachReverse(function (k, index, list) {\n // walk the list tail to head\n})\nvar myDoubledList = myList.map(function (k) {\n return k + k\n})\n// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo']\n// mapReverse is also a thing\nvar myDoubledListReverse = myList.mapReverse(function (k) {\n return k + k\n}) // ['foofoo', 6, 4, 2, 'barbar']\n\nvar reduced = myList.reduce(function (set, entry) {\n set += entry\n return set\n}, 'start')\nconsole.log(reduced) // 'startfoo123bar'\n```\n\n## api\n\nThe whole API is considered \"public\".\n\nFunctions with the same name as an Array method work more or less the\nsame way.\n\nThere's reverse versions of most things because that's the point.\n\n### Yallist\n\nDefault export, the class that holds and manages a list.\n\nCall it with either a forEach-able (like an array) or a set of\narguments, to initialize the list.\n\nThe Array-ish methods all act like you'd expect. No magic length,\nthough, so if you change that it won't automatically prune or add\nempty spots.\n\n### Yallist.create(..)\n\nAlias for Yallist function. Some people like factories.\n\n#### yallist.head\n\nThe first node in the list\n\n#### yallist.tail\n\nThe last node in the list\n\n#### yallist.length\n\nThe number of nodes in the list. (Change this at your peril. It is\nnot magic like Array length.)\n\n#### yallist.toArray()\n\nConvert the list to an array.\n\n#### yallist.forEach(fn, [thisp])\n\nCall a function on each item in the list.\n\n#### yallist.forEachReverse(fn, [thisp])\n\nCall a function on each item in the list, in reverse order.\n\n#### yallist.get(n)\n\nGet the data at position `n` in the list. If you use this a lot,\nprobably better off just using an Array.\n\n#### yallist.getReverse(n)\n\nGet the data at position `n`, counting from the tail.\n\n#### yallist.map(fn, thisp)\n\nCreate a new Yallist with the result of calling the function on each\nitem.\n\n#### yallist.mapReverse(fn, thisp)\n\nSame as `map`, but in reverse.\n\n#### yallist.pop()\n\nGet the data from the list tail, and remove the tail from the list.\n\n#### yallist.push(item, ...)\n\nInsert one or more items to the tail of the list.\n\n#### yallist.reduce(fn, initialValue)\n\nLike Array.reduce.\n\n#### yallist.reduceReverse\n\nLike Array.reduce, but in reverse.\n\n#### yallist.reverse\n\nReverse the list in place.\n\n#### yallist.shift()\n\nGet the data from the list head, and remove the head from the list.\n\n#### yallist.slice([from], [to])\n\nJust like Array.slice, but returns a new Yallist.\n\n#### yallist.sliceReverse([from], [to])\n\nJust like yallist.slice, but the result is returned in reverse.\n\n#### yallist.splice(start, deleteCount, ...)\n\nLike Array.splice.\n\n#### yallist.toArray()\n\nCreate an array representation of the list.\n\n#### yallist.toArrayReverse()\n\nCreate a reversed array representation of the list.\n\n#### yallist.unshift(item, ...)\n\nInsert one or more items to the head of the list.\n\n#### yallist.unshiftNode(node)\n\nMove a Node object to the front of the list. (That is, pull it out of\nwherever it lives, and make it the new head.)\n\nIf the node belongs to a different list, then that list will remove it\nfirst.\n\n#### yallist.pushNode(node)\n\nMove a Node object to the end of the list. (That is, pull it out of\nwherever it lives, and make it the new tail.)\n\nIf the node belongs to a list already, then that list will remove it\nfirst.\n\n#### yallist.removeNode(node)\n\nRemove a node from the list, preserving referential integrity of head\nand tail and other nodes.\n\nWill throw an error if you try to have a list remove a node that\ndoesn't belong to it.\n\n### Yallist.Node\n\nThe class that holds the data and is actually the list.\n\nCall with `const n = new Node(value, previousNode, nextNode)`\n\nNote that if you do direct operations on Nodes themselves, it's very\neasy to get into weird states where the list is broken. Be careful :)\n\n#### node.next\n\nThe next node in the list.\n\n#### node.prev\n\nThe previous node in the list.\n\n#### node.value\n\nThe data the node contains.\n\n#### node.list\n\nThe list to which this node belongs. (Null if it does not belong to\nany list.)\n","homepage":"https://github.com/isaacs/yallist#readme","repository":{"type":"git","url":"git+https://github.com/isaacs/yallist.git"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"bugs":{"url":"https://github.com/isaacs/yallist/issues"},"license":"BlueOak-1.0.0","readmeFilename":"README.md"}
+{
+ "name": "yallist",
+ "description": "Yet Another Linked List",
+ "dist-tags": {
+ "latest": "4.0.0"
+ },
+ "versions": {
+ "4.0.0": {
+ "name": "yallist",
+ "version": "4.0.0",
+ "description": "Yet Another Linked List",
+ "main": "yallist.js",
+ "directories": {
+ "test": "test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "tap": "^12.1.0"
+ },
+ "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+https://github.com/isaacs/yallist.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "gitHead": "1649cc57394b5affeca2c573943ebe3ed7d39119",
+ "bugs": {
+ "url": "https://github.com/isaacs/yallist/issues"
+ },
+ "_id": "yallist@4.0.0",
+ "_nodeVersion": "12.8.1",
+ "_npmVersion": "6.12.0-next.0",
+ "dist": {
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "shasum": "9bb92790d9c0effec63be73519e11a35019a3a72",
+ "tarball": "http://localhost:4260/yallist/yallist-4.0.0.tgz",
+ "fileCount": 5,
+ "unpackedSize": 14752
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "homepage": "https://github.com/isaacs/yallist#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/yallist.git"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/yallist/issues"
+ },
+ "license": "BlueOak-1.0.0",
+ "readmeFilename": "README.md"
+}
diff --git a/tests/registry/npm/yargs-parser/registry.json b/tests/registry/npm/yargs-parser/registry.json
index 80df9ac1f..cf10f5e05 100644
--- a/tests/registry/npm/yargs-parser/registry.json
+++ b/tests/registry/npm/yargs-parser/registry.json
@@ -1 +1,72 @@
-{"name":"yargs-parser","description":"the mighty option parser used by yargs","dist-tags":{"latest":"18.1.3"},"versions":{"18.1.3":{"name":"yargs-parser","version":"18.1.3","description":"the mighty option parser used by yargs","main":"index.js","scripts":{"fix":"standard --fix","test":"c8 --reporter=text --reporter=html mocha test/*.js","posttest":"standard","coverage":"c8 report --check-coverage check-coverage --lines=100 --branches=97 --statements=100"},"repository":{"type":"git","url":"git+https://github.com/yargs/yargs-parser.git"},"author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","devDependencies":{"c8":"^7.0.1","chai":"^4.2.0","mocha":"^7.0.0","standard":"^14.3.1"},"dependencies":{"camelcase":"^5.0.0","decamelize":"^1.2.0"},"engines":{"node":">=6"},"bugs":{"url":"https://github.com/yargs/yargs-parser/issues"},"_id":"yargs-parser@18.1.3","_nodeVersion":"10.19.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==","shasum":"be68c4975c6b2abf469236b0c870362fab09a7b0","tarball":"http://localhost:4260/yargs-parser/yargs-parser-18.1.3.tgz","fileCount":6,"unpackedSize":71482,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemLxeCRA9TVsSAnZWagAAT1gP/0A7aL9K40jHeMWV2Vn/\nFQDWGlY48+bHPahfORZND1moiouemlkEzHR23f2T5yuW6x49Zb+lQnRXbfdH\nOsSod2RjtG2lqvJ6ULGjGad7cEn9AaIkb9u3/x2u03oLHGVT/6wpP4HIsZJ7\nnI085HPN4hVksM1qqnU/cjHvzul9Ul4VLwQhb8DH/ofCpbohPKP7icND0jYr\nQHIy5Vec3EUKjG7+B3jD2NVewtb/HmsyiN24wbjaLqvaJ9McaeYd+oe2VIOn\n0DdDkMwqukkJc7vVzhMk8wOGSQGak6OOWstk0firuqaPNFrdG5/kCeYfUOON\nQzxjK0TzOxZRUutnOp0QiTaWan2ChVPaTGR7ssLMOL+7vep9CIoeZlm8539y\n+kuEPVpe+4GJBc5TCObrBLU7bVDx7ozvGI7MpXQRY3czloQcO5lbmR1r749p\nNmzvAt2ErfIiV1E5eIo8Q+5HVBKbTViUPtBx0rKNYhd98XbNvfPsB2GKMgyI\nB2fHV8dig9t5gUY1Y8Q8mCV5vd7EWjd+OyB1Gfja4bvL8fuP327NCInWh9+c\n1F0glN/3wsDYhV/m0/Z0fptQ05IOeM5TNGCS496osap9sZkrlU4XX9rBDmeh\nIsogwKlrixNPax+W+y7Wznn7UUB7+63mDJ+Fjv/1FuxXb+l0oe9bbNvLvlMS\nR9En\r\n=DwLX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE3TX4aYklJ3eu0lTOvNyYQ7eH9k/ATQNLbe6CebxSjhAiBkc2NSzUAVUzcd4ODEfrzOgpwuNFeZwMhWEEKbP9K3sw=="}]},"directories":{},"_hasShrinkwrap":false}},"readme":"# yargs-parser\n\n![ci](https://github.com/yargs/yargs-parser/workflows/ci/badge.svg)\n[![NPM version](https://img.shields.io/npm/v/yargs-parser.svg)](https://www.npmjs.com/package/yargs-parser)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n![nycrc config on GitHub](https://img.shields.io/nycrc/yargs/yargs-parser)\n\nThe mighty option parser used by [yargs](https://github.com/yargs/yargs).\n\nvisit the [yargs website](http://yargs.js.org/) for more examples, and thorough usage instructions.\n\n<img width=\"250\" src=\"https://raw.githubusercontent.com/yargs/yargs-parser/main/yargs-logo.png\">\n\n## Example\n\n```sh\nnpm i yargs-parser --save\n```\n\n```js\nconst argv = require('yargs-parser')(process.argv.slice(2))\nconsole.log(argv)\n```\n\n```console\n$ node example.js --foo=33 --bar hello\n{ _: [], foo: 33, bar: 'hello' }\n```\n\n_or parse a string!_\n\n```js\nconst argv = require('yargs-parser')('--foo=99 --bar=33')\nconsole.log(argv)\n```\n\n```console\n{ _: [], foo: 99, bar: 33 }\n```\n\nConvert an array of mixed types before passing to `yargs-parser`:\n\n```js\nconst parse = require('yargs-parser')\nparse(['-f', 11, '--zoom', 55].join(' ')) // <-- array to string\nparse(['-f', 11, '--zoom', 55].map(String)) // <-- array of strings\n```\n\n## Deno Example\n\nAs of `v19` `yargs-parser` supports [Deno](https://github.com/denoland/deno):\n\n```typescript\nimport parser from \"https://deno.land/x/yargs_parser/deno.ts\";\n\nconst argv = parser('--foo=99 --bar=9987930', {\n string: ['bar']\n})\nconsole.log(argv)\n```\n\n## ESM Example\n\nAs of `v19` `yargs-parser` supports ESM (_both in Node.js and in the browser_):\n\n**Node.js:**\n\n```js\nimport parser from 'yargs-parser'\n\nconst argv = parser('--foo=99 --bar=9987930', {\n string: ['bar']\n})\nconsole.log(argv)\n```\n\n**Browsers:**\n\n```html\n<!doctype html>\n<body>\n <script type=\"module\">\n import parser from \"https://unpkg.com/yargs-parser@19.0.0/browser.js\";\n\n const argv = parser('--foo=99 --bar=9987930', {\n string: ['bar']\n })\n console.log(argv)\n </script>\n</body>\n```\n\n## API\n\n### parser(args, opts={})\n\nParses command line arguments returning a simple mapping of keys and values.\n\n**expects:**\n\n* `args`: a string or array of strings representing the options to parse.\n* `opts`: provide a set of hints indicating how `args` should be parsed:\n * `opts.alias`: an object representing the set of aliases for a key: `{alias: {foo: ['f']}}`.\n * `opts.array`: indicate that keys should be parsed as an array: `{array: ['foo', 'bar']}`.<br>\n Indicate that keys should be parsed as an array and coerced to booleans / numbers:<br>\n `{array: [{ key: 'foo', boolean: true }, {key: 'bar', number: true}]}`.\n * `opts.boolean`: arguments should be parsed as booleans: `{boolean: ['x', 'y']}`.\n * `opts.coerce`: provide a custom synchronous function that returns a coerced value from the argument provided\n (or throws an error). For arrays the function is called only once for the entire array:<br>\n `{coerce: {foo: function (arg) {return modifiedArg}}}`.\n * `opts.config`: indicate a key that represents a path to a configuration file (this file will be loaded and parsed).\n * `opts.configObjects`: configuration objects to parse, their properties will be set as arguments:<br>\n `{configObjects: [{'x': 5, 'y': 33}, {'z': 44}]}`.\n * `opts.configuration`: provide configuration options to the yargs-parser (see: [configuration](#configuration)).\n * `opts.count`: indicate a key that should be used as a counter, e.g., `-vvv` = `{v: 3}`.\n * `opts.default`: provide default values for keys: `{default: {x: 33, y: 'hello world!'}}`.\n * `opts.envPrefix`: environment variables (`process.env`) with the prefix provided should be parsed.\n * `opts.narg`: specify that a key requires `n` arguments: `{narg: {x: 2}}`.\n * `opts.normalize`: `path.normalize()` will be applied to values set to this key.\n * `opts.number`: keys should be treated as numbers.\n * `opts.string`: keys should be treated as strings (even if they resemble a number `-x 33`).\n\n**returns:**\n\n* `obj`: an object representing the parsed value of `args`\n * `key/value`: key value pairs for each argument and their aliases.\n * `_`: an array representing the positional arguments.\n * [optional] `--`: an array with arguments after the end-of-options flag `--`.\n\n### require('yargs-parser').detailed(args, opts={})\n\nParses a command line string, returning detailed information required by the\nyargs engine.\n\n**expects:**\n\n* `args`: a string or array of strings representing options to parse.\n* `opts`: provide a set of hints indicating how `args`, inputs are identical to `require('yargs-parser')(args, opts={})`.\n\n**returns:**\n\n* `argv`: an object representing the parsed value of `args`\n * `key/value`: key value pairs for each argument and their aliases.\n * `_`: an array representing the positional arguments.\n * [optional] `--`: an array with arguments after the end-of-options flag `--`.\n* `error`: populated with an error object if an exception occurred during parsing.\n* `aliases`: the inferred list of aliases built by combining lists in `opts.alias`.\n* `newAliases`: any new aliases added via camel-case expansion:\n * `boolean`: `{ fooBar: true }`\n* `defaulted`: any new argument created by `opts.default`, no aliases included.\n * `boolean`: `{ foo: true }`\n* `configuration`: given by default settings and `opts.configuration`.\n\n<a name=\"configuration\"></a>\n\n### Configuration\n\nThe yargs-parser applies several automated transformations on the keys provided\nin `args`. These features can be turned on and off using the `configuration` field\nof `opts`.\n\n```js\nvar parsed = parser(['--no-dice'], {\n configuration: {\n 'boolean-negation': false\n }\n})\n```\n\n### short option groups\n\n* default: `true`.\n* key: `short-option-groups`.\n\nShould a group of short-options be treated as boolean flags?\n\n```console\n$ node example.js -abc\n{ _: [], a: true, b: true, c: true }\n```\n\n_if disabled:_\n\n```console\n$ node example.js -abc\n{ _: [], abc: true }\n```\n\n### camel-case expansion\n\n* default: `true`.\n* key: `camel-case-expansion`.\n\nShould hyphenated arguments be expanded into camel-case aliases?\n\n```console\n$ node example.js --foo-bar\n{ _: [], 'foo-bar': true, fooBar: true }\n```\n\n_if disabled:_\n\n```console\n$ node example.js --foo-bar\n{ _: [], 'foo-bar': true }\n```\n\n### dot-notation\n\n* default: `true`\n* key: `dot-notation`\n\nShould keys that contain `.` be treated as objects?\n\n```console\n$ node example.js --foo.bar\n{ _: [], foo: { bar: true } }\n```\n\n_if disabled:_\n\n```console\n$ node example.js --foo.bar\n{ _: [], \"foo.bar\": true }\n```\n\n### parse numbers\n\n* default: `true`\n* key: `parse-numbers`\n\nShould keys that look like numbers be treated as such?\n\n```console\n$ node example.js --foo=99.3\n{ _: [], foo: 99.3 }\n```\n\n_if disabled:_\n\n```console\n$ node example.js --foo=99.3\n{ _: [], foo: \"99.3\" }\n```\n\n### parse positional numbers\n\n* default: `true`\n* key: `parse-positional-numbers`\n\nShould positional keys that look like numbers be treated as such.\n\n```console\n$ node example.js 99.3\n{ _: [99.3] }\n```\n\n_if disabled:_\n\n```console\n$ node example.js 99.3\n{ _: ['99.3'] }\n```\n\n### boolean negation\n\n* default: `true`\n* key: `boolean-negation`\n\nShould variables prefixed with `--no` be treated as negations?\n\n```console\n$ node example.js --no-foo\n{ _: [], foo: false }\n```\n\n_if disabled:_\n\n```console\n$ node example.js --no-foo\n{ _: [], \"no-foo\": true }\n```\n\n### combine arrays\n\n* default: `false`\n* key: `combine-arrays`\n\nShould arrays be combined when provided by both command line arguments and\na configuration file.\n\n### duplicate arguments array\n\n* default: `true`\n* key: `duplicate-arguments-array`\n\nShould arguments be coerced into an array when duplicated:\n\n```console\n$ node example.js -x 1 -x 2\n{ _: [], x: [1, 2] }\n```\n\n_if disabled:_\n\n```console\n$ node example.js -x 1 -x 2\n{ _: [], x: 2 }\n```\n\n### flatten duplicate arrays\n\n* default: `true`\n* key: `flatten-duplicate-arrays`\n\nShould array arguments be coerced into a single array when duplicated:\n\n```console\n$ node example.js -x 1 2 -x 3 4\n{ _: [], x: [1, 2, 3, 4] }\n```\n\n_if disabled:_\n\n```console\n$ node example.js -x 1 2 -x 3 4\n{ _: [], x: [[1, 2], [3, 4]] }\n```\n\n### greedy arrays\n\n* default: `true`\n* key: `greedy-arrays`\n\nShould arrays consume more than one positional argument following their flag.\n\n```console\n$ node example --arr 1 2\n{ _: [], arr: [1, 2] }\n```\n\n_if disabled:_\n\n```console\n$ node example --arr 1 2\n{ _: [2], arr: [1] }\n```\n\n**Note: in `v18.0.0` we are considering defaulting greedy arrays to `false`.**\n\n### nargs eats options\n\n* default: `false`\n* key: `nargs-eats-options`\n\nShould nargs consume dash options as well as positional arguments.\n\n### negation prefix\n\n* default: `no-`\n* key: `negation-prefix`\n\nThe prefix to use for negated boolean variables.\n\n```console\n$ node example.js --no-foo\n{ _: [], foo: false }\n```\n\n_if set to `quux`:_\n\n```console\n$ node example.js --quuxfoo\n{ _: [], foo: false }\n```\n\n### populate --\n\n* default: `false`.\n* key: `populate--`\n\nShould unparsed flags be stored in `--` or `_`.\n\n_If disabled:_\n\n```console\n$ node example.js a -b -- x y\n{ _: [ 'a', 'x', 'y' ], b: true }\n```\n\n_If enabled:_\n\n```console\n$ node example.js a -b -- x y\n{ _: [ 'a' ], '--': [ 'x', 'y' ], b: true }\n```\n\n### set placeholder key\n\n* default: `false`.\n* key: `set-placeholder-key`.\n\nShould a placeholder be added for keys not set via the corresponding CLI argument?\n\n_If disabled:_\n\n```console\n$ node example.js -a 1 -c 2\n{ _: [], a: 1, c: 2 }\n```\n\n_If enabled:_\n\n```console\n$ node example.js -a 1 -c 2\n{ _: [], a: 1, b: undefined, c: 2 }\n```\n\n### halt at non-option\n\n* default: `false`.\n* key: `halt-at-non-option`.\n\nShould parsing stop at the first positional argument? This is similar to how e.g. `ssh` parses its command line.\n\n_If disabled:_\n\n```console\n$ node example.js -a run b -x y\n{ _: [ 'b' ], a: 'run', x: 'y' }\n```\n\n_If enabled:_\n\n```console\n$ node example.js -a run b -x y\n{ _: [ 'b', '-x', 'y' ], a: 'run' }\n```\n\n### strip aliased\n\n* default: `false`\n* key: `strip-aliased`\n\nShould aliases be removed before returning results?\n\n_If disabled:_\n\n```console\n$ node example.js --test-field 1\n{ _: [], 'test-field': 1, testField: 1, 'test-alias': 1, testAlias: 1 }\n```\n\n_If enabled:_\n\n```console\n$ node example.js --test-field 1\n{ _: [], 'test-field': 1, testField: 1 }\n```\n\n### strip dashed\n\n* default: `false`\n* key: `strip-dashed`\n\nShould dashed keys be removed before returning results? This option has no effect if\n`camel-case-expansion` is disabled.\n\n_If disabled:_\n\n```console\n$ node example.js --test-field 1\n{ _: [], 'test-field': 1, testField: 1 }\n```\n\n_If enabled:_\n\n```console\n$ node example.js --test-field 1\n{ _: [], testField: 1 }\n```\n\n### unknown options as args\n\n* default: `false`\n* key: `unknown-options-as-args`\n\nShould unknown options be treated like regular arguments? An unknown option is one that is not\nconfigured in `opts`.\n\n_If disabled_\n\n```console\n$ node example.js --unknown-option --known-option 2 --string-option --unknown-option2\n{ _: [], unknownOption: true, knownOption: 2, stringOption: '', unknownOption2: true }\n```\n\n_If enabled_\n\n```console\n$ node example.js --unknown-option --known-option 2 --string-option --unknown-option2\n{ _: ['--unknown-option'], knownOption: 2, stringOption: '--unknown-option2' }\n```\n\n## Supported Node.js Versions\n\nLibraries in this ecosystem make a best effort to track\n[Node.js' release schedule](https://nodejs.org/en/about/releases/). Here's [a\npost on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a).\n\n## Special Thanks\n\nThe yargs project evolves from optimist and minimist. It owes its\nexistence to a lot of James Halliday's hard work. Thanks [substack](https://github.com/substack) **beep** **boop** \\o/\n\n## License\n\nISC\n","author":{"name":"Ben Coe","email":"ben@npmjs.com"},"license":"ISC","readmeFilename":"README.md","homepage":"https://github.com/yargs/yargs-parser#readme","repository":{"type":"git","url":"git+https://github.com/yargs/yargs-parser.git"},"bugs":{"url":"https://github.com/yargs/yargs-parser/issues"}}
+{
+ "name": "yargs-parser",
+ "description": "the mighty option parser used by yargs",
+ "dist-tags": {
+ "latest": "18.1.3"
+ },
+ "versions": {
+ "18.1.3": {
+ "name": "yargs-parser",
+ "version": "18.1.3",
+ "description": "the mighty option parser used by yargs",
+ "main": "index.js",
+ "scripts": {
+ "fix": "standard --fix",
+ "test": "c8 --reporter=text --reporter=html mocha test/*.js",
+ "posttest": "standard",
+ "coverage": "c8 report --check-coverage check-coverage --lines=100 --branches=97 --statements=100"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/yargs-parser.git"
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "c8": "^7.0.1",
+ "chai": "^4.2.0",
+ "mocha": "^7.0.0",
+ "standard": "^14.3.1"
+ },
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/yargs-parser/issues"
+ },
+ "_id": "yargs-parser@18.1.3",
+ "_nodeVersion": "10.19.0",
+ "_npmVersion": "6.13.4",
+ "dist": {
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "shasum": "be68c4975c6b2abf469236b0c870362fab09a7b0",
+ "tarball": "http://localhost:4260/yargs-parser/yargs-parser-18.1.3.tgz",
+ "fileCount": 6,
+ "unpackedSize": 71482
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "author": {
+ "name": "Ben Coe",
+ "email": "ben@npmjs.com"
+ },
+ "license": "ISC",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/yargs/yargs-parser#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/yargs-parser.git"
+ },
+ "bugs": {
+ "url": "https://github.com/yargs/yargs-parser/issues"
+ }
+}
diff --git a/tests/registry/npm/yargs/registry.json b/tests/registry/npm/yargs/registry.json
index d4f717382..1d9797fd3 100644
--- a/tests/registry/npm/yargs/registry.json
+++ b/tests/registry/npm/yargs/registry.json
@@ -1 +1,104 @@
-{"name":"yargs","description":"yargs the modern, pirate-themed, successor to optimist.","dist-tags":{"latest":"15.4.1"},"versions":{"15.4.1":{"name":"yargs","version":"15.4.1","description":"yargs the modern, pirate-themed, successor to optimist.","main":"./index.js","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"},"devDependencies":{"@types/chai":"^4.2.11","@types/decamelize":"^1.2.0","@types/mocha":"^7.0.2","@types/node":"^10.0.3","@typescript-eslint/eslint-plugin":"^3.0.0","@typescript-eslint/parser":"^3.0.0","c8":"^7.0.0","chai":"^4.2.0","chalk":"^4.0.0","coveralls":"^3.0.9","cpr":"^3.0.1","cross-spawn":"^7.0.0","es6-promise":"^4.2.5","eslint":"^6.8.0","eslint-plugin-import":"^2.20.1","eslint-plugin-node":"^11.0.0","gts":"^2.0.0-alpha.4","hashish":"0.0.4","mocha":"^7.0.0","rimraf":"^3.0.2","standardx":"^5.0.0","typescript":"^3.7.0","which":"^2.0.0","yargs-test-extends":"^1.0.1"},"scripts":{"fix":"standardx --fix && standardx --fix **/*.ts","posttest":"npm run check","test":"c8 mocha --require ./test/before.js --timeout=12000 --check-leaks","coverage":"c8 report --check-coverage","check":"standardx && standardx **/*.ts","compile":"rimraf build && tsc","prepare":"npm run compile","pretest":"npm run compile -- -p tsconfig.test.json"},"repository":{"type":"git","url":"git+https://github.com/yargs/yargs.git"},"standardx":{"ignore":["build","**/example/**"]},"license":"MIT","engines":{"node":">=8"},"gitHead":"0b519a4672c8493d72838292ed0d60b63b88f33e","bugs":{"url":"https://github.com/yargs/yargs/issues"},"_id":"yargs@15.4.1","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==","shasum":"0d87a16de01aee9d8bec2bfbf74f67851730f4f8","tarball":"http://localhost:4260/yargs/yargs-15.4.1.tgz","fileCount":62,"unpackedSize":230562,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCO7ACRA9TVsSAnZWagAAFNwP+gJWn0U7ipXQ2EmdrbTP\nL//Ag226k17jQL/06WdfxQI7vgpUkcRHRuq2ktej6mJwk9lD/ejKh8RJQJNm\nmq2trjQNAaLnbQdVcoz23uWZRGrIE5WEjJxAulXSKG7X3kKGbVZ2YUUfqPk4\nEuyMomEoEJi5+voL4gB9I63znQNi4AeOOaT+6/D+GfVs1NdF2G0gAWbWTQ9x\n7/OXQFzslYycoRdNIAye49ZEiTXrkoTm9pTafETb/c1gTyXjAPMWlkH6T0jE\nVCmhDO8XqJhhomcL+184DzgGYi10geqC00Je6wDcZn10culZayCxLzEywsdV\ndUiu4YY7YZmlBoa6JoapZi/PG2OxbCEmMd16VipMeMjo493V86SV+KCeIFQf\nEdrXxzHUJdBiWGqqLGHO65sdQxiGPMWEL1nIQlmzyUoza816lhvHo28F3Rth\nCBBuvD8wmkiZbWGQyBmFUZKomvu/04Qp2wXee5OszJ2ZnxqNYbgoooZGX+J8\njRsK7NcxQkPZ3G7DXM3gdhOEilxECBzZv2DEBJuvetCeML7qjL9ztOs7VZSr\nQIj1qQgMT9evv9ANlsQzUJcOAMEVarJRZ0mhXwKzWqpKKBgrDBNu98i+j8rX\nRiqT7te7ASTNsYg/SRc7bQArodgT7GUeWrMpkgCFWHqpEySk2b1YSPE+/lQv\nL11f\r\n=VoM2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCN/KNryqwe9hB1Eteck09nGx8PqC9O9p2irdQYdJeZXwIhANI38fKhI0wlMm35Bg5l2gR753CFhHfIcznqnC1Gfsci"}]},"directories":{},"_hasShrinkwrap":false}},"readme":"<p align=\"center\">\n <img width=\"250\" src=\"https://raw.githubusercontent.com/yargs/yargs/main/yargs-logo.png\">\n</p>\n<h1 align=\"center\"> Yargs </h1>\n<p align=\"center\">\n <b >Yargs be a node.js library fer hearties tryin' ter parse optstrings</b>\n</p>\n\n<br>\n\n![ci](https://github.com/yargs/yargs/workflows/ci/badge.svg)\n[![NPM version][npm-image]][npm-url]\n[![js-standard-style][standard-image]][standard-url]\n[![Coverage][coverage-image]][coverage-url]\n[![Conventional Commits][conventional-commits-image]][conventional-commits-url]\n[![Slack][slack-image]][slack-url]\n\n## Description\nYargs helps you build interactive command line tools, by parsing arguments and generating an elegant user interface.\n\nIt gives you:\n\n* commands and (grouped) options (`my-program.js serve --port=5000`).\n* a dynamically generated help menu based on your arguments:\n\n```\nmocha [spec..]\n\nRun tests with Mocha\n\nCommands\n mocha inspect [spec..] Run tests with Mocha [default]\n mocha init <path> create a client-side Mocha setup at <path>\n\nRules & Behavior\n --allow-uncaught Allow uncaught errors to propagate [boolean]\n --async-only, -A Require all tests to use a callback (async) or\n return a Promise [boolean]\n```\n\n* bash-completion shortcuts for commands and options.\n* and [tons more](/docs/api.md).\n\n## Installation\n\nStable version:\n```bash\nnpm i yargs\n```\n\nBleeding edge version with the most recent features:\n```bash\nnpm i yargs@next\n```\n\n## Usage\n\n### Simple Example\n\n```javascript\n#!/usr/bin/env node\nconst yargs = require('yargs/yargs')\nconst { hideBin } = require('yargs/helpers')\nconst argv = yargs(hideBin(process.argv)).argv\n\nif (argv.ships > 3 && argv.distance < 53.5) {\n console.log('Plunder more riffiwobbles!')\n} else {\n console.log('Retreat from the xupptumblers!')\n}\n```\n\n```bash\n$ ./plunder.js --ships=4 --distance=22\nPlunder more riffiwobbles!\n\n$ ./plunder.js --ships 12 --distance 98.7\nRetreat from the xupptumblers!\n```\n\n> Note: `hideBin` is a shorthand for [`process.argv.slice(2)`](https://nodejs.org/en/knowledge/command-line/how-to-parse-command-line-arguments/). It has the benefit that it takes into account variations in some environments, e.g., [Electron](https://github.com/electron/electron/issues/4690).\n\n### Complex Example\n\n```javascript\n#!/usr/bin/env node\nconst yargs = require('yargs/yargs')\nconst { hideBin } = require('yargs/helpers')\n\nyargs(hideBin(process.argv))\n .command('serve [port]', 'start the server', (yargs) => {\n return yargs\n .positional('port', {\n describe: 'port to bind on',\n default: 5000\n })\n }, (argv) => {\n if (argv.verbose) console.info(`start server on :${argv.port}`)\n serve(argv.port)\n })\n .option('verbose', {\n alias: 'v',\n type: 'boolean',\n description: 'Run with verbose logging'\n })\n .parse()\n```\n\nRun the example above with `--help` to see the help for the application.\n\n## Supported Platforms\n\n### TypeScript\n\nyargs has type definitions at [@types/yargs][type-definitions].\n\n```\nnpm i @types/yargs --save-dev\n```\n\nSee usage examples in [docs](/docs/typescript.md).\n\n### Deno\n\nAs of `v16`, `yargs` supports [Deno](https://github.com/denoland/deno):\n\n```typescript\nimport yargs from 'https://deno.land/x/yargs/deno.ts'\nimport { Arguments } from 'https://deno.land/x/yargs/deno-types.ts'\n\nyargs(Deno.args)\n .command('download <files...>', 'download a list of files', (yargs: any) => {\n return yargs.positional('files', {\n describe: 'a list of files to do something with'\n })\n }, (argv: Arguments) => {\n console.info(argv)\n })\n .strictCommands()\n .demandCommand(1)\n .parse()\n```\n\n### ESM\n\nAs of `v16`,`yargs` supports ESM imports:\n\n```js\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\n\nyargs(hideBin(process.argv))\n .command('curl <url>', 'fetch the contents of the URL', () => {}, (argv) => {\n console.info(argv)\n })\n .demandCommand(1)\n .parse()\n```\n\n### Usage in Browser\n\nSee examples of using yargs in the browser in [docs](/docs/browser.md).\n\n## Community\n\nHaving problems? want to contribute? join our [community slack](http://devtoolscommunity.herokuapp.com).\n\n## Documentation\n\n### Table of Contents\n\n* [Yargs' API](/docs/api.md)\n* [Examples](/docs/examples.md)\n* [Parsing Tricks](/docs/tricks.md)\n * [Stop the Parser](/docs/tricks.md#stop)\n * [Negating Boolean Arguments](/docs/tricks.md#negate)\n * [Numbers](/docs/tricks.md#numbers)\n * [Arrays](/docs/tricks.md#arrays)\n * [Objects](/docs/tricks.md#objects)\n * [Quotes](/docs/tricks.md#quotes)\n* [Advanced Topics](/docs/advanced.md)\n * [Composing Your App Using Commands](/docs/advanced.md#commands)\n * [Building Configurable CLI Apps](/docs/advanced.md#configuration)\n * [Customizing Yargs' Parser](/docs/advanced.md#customizing)\n * [Bundling yargs](/docs/bundling.md)\n* [Contributing](/contributing.md)\n\n## Supported Node.js Versions\n\nLibraries in this ecosystem make a best effort to track\n[Node.js' release schedule](https://nodejs.org/en/about/releases/). Here's [a\npost on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a).\n\n[npm-url]: https://www.npmjs.com/package/yargs\n[npm-image]: https://img.shields.io/npm/v/yargs.svg\n[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg\n[standard-url]: http://standardjs.com/\n[conventional-commits-image]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg\n[conventional-commits-url]: https://conventionalcommits.org/\n[slack-image]: http://devtoolscommunity.herokuapp.com/badge.svg\n[slack-url]: http://devtoolscommunity.herokuapp.com\n[type-definitions]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs\n[coverage-image]: https://img.shields.io/nycrc/yargs/yargs\n[coverage-url]: https://github.com/yargs/yargs/blob/main/.nycrc\n","repository":{"type":"git","url":"git+https://github.com/yargs/yargs.git"},"readmeFilename":"README.md","homepage":"https://yargs.js.org/","bugs":{"url":"https://github.com/yargs/yargs/issues"},"license":"MIT"}
+{
+ "name": "yargs",
+ "description": "yargs the modern, pirate-themed, successor to optimist.",
+ "dist-tags": {
+ "latest": "15.4.1"
+ },
+ "versions": {
+ "15.4.1": {
+ "name": "yargs",
+ "version": "15.4.1",
+ "description": "yargs the modern, pirate-themed, successor to optimist.",
+ "main": "./index.js",
+ "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"
+ },
+ "devDependencies": {
+ "@types/chai": "^4.2.11",
+ "@types/decamelize": "^1.2.0",
+ "@types/mocha": "^7.0.2",
+ "@types/node": "^10.0.3",
+ "@typescript-eslint/eslint-plugin": "^3.0.0",
+ "@typescript-eslint/parser": "^3.0.0",
+ "c8": "^7.0.0",
+ "chai": "^4.2.0",
+ "chalk": "^4.0.0",
+ "coveralls": "^3.0.9",
+ "cpr": "^3.0.1",
+ "cross-spawn": "^7.0.0",
+ "es6-promise": "^4.2.5",
+ "eslint": "^6.8.0",
+ "eslint-plugin-import": "^2.20.1",
+ "eslint-plugin-node": "^11.0.0",
+ "gts": "^2.0.0-alpha.4",
+ "hashish": "0.0.4",
+ "mocha": "^7.0.0",
+ "rimraf": "^3.0.2",
+ "standardx": "^5.0.0",
+ "typescript": "^3.7.0",
+ "which": "^2.0.0",
+ "yargs-test-extends": "^1.0.1"
+ },
+ "scripts": {
+ "fix": "standardx --fix && standardx --fix **/*.ts",
+ "posttest": "npm run check",
+ "test": "c8 mocha --require ./test/before.js --timeout=12000 --check-leaks",
+ "coverage": "c8 report --check-coverage",
+ "check": "standardx && standardx **/*.ts",
+ "compile": "rimraf build && tsc",
+ "prepare": "npm run compile",
+ "pretest": "npm run compile -- -p tsconfig.test.json"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/yargs.git"
+ },
+ "standardx": {
+ "ignore": [
+ "build",
+ "**/example/**"
+ ]
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "gitHead": "0b519a4672c8493d72838292ed0d60b63b88f33e",
+ "bugs": {
+ "url": "https://github.com/yargs/yargs/issues"
+ },
+ "_id": "yargs@15.4.1",
+ "_nodeVersion": "12.16.3",
+ "_npmVersion": "6.14.4",
+ "dist": {
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "shasum": "0d87a16de01aee9d8bec2bfbf74f67851730f4f8",
+ "tarball": "http://localhost:4260/yargs/yargs-15.4.1.tgz",
+ "fileCount": 62,
+ "unpackedSize": 230562
+ },
+ "directories": {},
+ "_hasShrinkwrap": false
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/yargs/yargs.git"
+ },
+ "readmeFilename": "README.md",
+ "homepage": "https://yargs.js.org/",
+ "bugs": {
+ "url": "https://github.com/yargs/yargs/issues"
+ },
+ "license": "MIT"
+}