diff --git a/deps/npm/.npmignore b/deps/npm/.npmignore index 9d02b99f91b39a..ae91e6482791fa 100644 --- a/deps/npm/.npmignore +++ b/deps/npm/.npmignore @@ -27,6 +27,10 @@ docs/nav.yml docs/config.json docs/dockhand.js docs/template.html +docs/package.json +docs/node_modules +# docs source files are required by `npm help-search` do not exclude those +!docs/content/ # don't ignore .npmignore files # these are used in some tests. diff --git a/deps/npm/AUTHORS b/deps/npm/AUTHORS index 723042e7799046..a8dfd8b6be682a 100644 --- a/deps/npm/AUTHORS +++ b/deps/npm/AUTHORS @@ -777,3 +777,9 @@ wangsai Luke Hefson mrmlnc Juan Picado +Kevin Cormier +Nariyasu Heseri +rethab +Spencer Wilson <5624115+spencerwilson@users.noreply.github.com> +Daniel Park +Daniel Park diff --git a/deps/npm/CHANGELOG.md b/deps/npm/CHANGELOG.md index 6f9c2d48d3e397..027731cbe2cf73 100644 --- a/deps/npm/CHANGELOG.md +++ b/deps/npm/CHANGELOG.md @@ -1,3 +1,154 @@ +## v7.16.0 (2021-06-03) + +## FEATURES + +* [`e92b5f2ba`](https://github.com/npm/cli/commit/e92b5f2ba07746ae07646566f3dc73c9e004a2fc) + `npm-registry-fetch@11.0.0` + * feat: improved logging of cache status + +## BUG FIXES + +* [`e864bd3ce`](https://github.com/npm/cli/commit/e864bd3ce8e8467e0f8ebb499dc2daf06143bc33) + [#3345](https://github.com/npm/cli/issues/3345) + fix(update-notifier): do not update notify when installing npm@spec + ([@isaacs](https://github.com/isaacs)) +* [`aafe23572`](https://github.com/npm/cli/commit/aafe2357279230e333d3342752a28fce6b9cd152) + [#3348](https://github.com/npm/cli/issues/3348) + fix(update-notifier): parallelize check for updates + ([@isaacs](https://github.com/isaacs)) + +## DOCUMENTATION + +* [`bc9c57dda`](https://github.com/npm/cli/commit/bc9c57dda7cf3abcdee17550205daf1a82e90438) + [#3353](https://github.com/npm/cli/issues/3353) + fix(docs): remove documentation for '--scripts-prepend-node-path' as it was removed in npm@7 + ([@gimli01](https://github.com/gimli01)) +* [`ca2822110`](https://github.com/npm/cli/commit/ca28221103aa0e9ccba7043ac515a541b625c53a) + [#3360](https://github.com/npm/cli/issues/3360) + fix(docs): link foreground-scripts w/ loglevel + ([@wraithgar](https://github.com/wraithgar)) +* [`fb630b5a9`](https://github.com/npm/cli/commit/fb630b5a9af86c71602803297634ec291eeedee0) + [#3342](https://github.com/npm/cli/issues/3342) + chore(docs): manage docs as a workspace + ([@ruyadorno](https://github.com/ruyadorno)) + +## DEPENDENCIES + +* [`54de5c6a4`](https://github.com/npm/cli/commit/54de5c6a4cd593bbbe364132f3f7348586441b31) + `npm-package-arg@8.1.4`: + * fix: trim whitespace from fetchSpec + * fix: handle file: when root directory begins with a special character +* [`e92b5f2ba`](https://github.com/npm/cli/commit/e92b5f2ba07746ae07646566f3dc73c9e004a2fc) + `make-fetch-happen@9.0.1` + * breaking: complete refactor of caching. drops warning headers, + prevents cache indexes from growing for every request, correctly + handles varied requests to the same url, and now caches redirects. + * fix: support url-encoded proxy authorization + * fix: do not lazy-load proxy agents or agentkeepalive. fixes the + intermittent failures to update npm on slower connections. + `npm-registry-fetch@11.0.0` + * breaking: drop handling of deprecated warning headers + * docs: fix header type for npm-command + * docs: update registry param + * feat: improved logging of cache status +* [`23c50a45f`](https://github.com/npm/cli/commit/23c50a45f59ea3ed4c36f35df15e54adc5603034) + `make-fetch-happen@9.0.2`: + * fix: work around negotiator's lazy loading + +## AUTOMATION + +* [`c4ef78b08`](https://github.com/npm/cli/commit/c4ef78b08e6859fc191cabbe58c8d88c070e0612) + [#3344](https://github.com/npm/cli/issues/3344) + fix(automation): update incorrect variable name in create-cli-deps-pr workflow + ([@gimli01](https://github.com/gimli01)) + +## v7.15.1 (2021-05-31) + +### BUG FIXES + +* [`598a17a26`](https://github.com/npm/cli/commit/598a17a2671c9e3bc204dddd6488169c9a72c6a1) + [#3329](https://github.com/npm/cli/issues/3329) + fix(libnpmexec): don't detach output from npm + ([@wraithgar](https://github.com/wraithgar)) + +### DEPENDENCIES + +* [`c4fc03e9e`](https://github.com/npm/cli/commit/c4fc03e9eb3a6386e8feacb67c19f0a1578dfe38) + `@npmcli/arborist@2.6.1` + * fixes reifying deps with mismatching version ranges between + actual and virtual trees +* [`9159fa62a`](https://github.com/npm/cli/commit/9159fa62a10dee09daef178fc7be161a02824004) + `libnpmexec@1.2.0` + +## v7.15.0 (2021-05-27) + +### FEATURES + +* [`399ff8cbc`](https://github.com/npm/cli/commit/399ff8cbccd5198f637518ccafa86c43bab47a4a) + [#3312](https://github.com/npm/cli/issues/3312) + feat(link): add workspace support + ([@isaacs](https://github.com/isaacs)) + +### BUG FIXES + +* [`46a9bcbcb`](https://github.com/npm/cli/commit/46a9bcbcb0bb2435dca6f45a61b8631f580c7f06) + [#3282](https://github.com/npm/cli/issues/3282) + fix(docs): proper postinstall script file name + ([@KevinFCormier](https://github.com/KevinFCormier)) +* [`83590d40f`](https://github.com/npm/cli/commit/83590d40f94347f21714dbd158b9ddcad9c82de9) + [#3272](https://github.com/npm/cli/issues/3272) + fix(ls): show relative paths from root + ([@isaacs](https://github.com/isaacs)) +* [`a574b518a`](https://github.com/npm/cli/commit/a574b518ae5b8f0664ed388cf1be6288d8c2e68d) + [#3304](https://github.com/npm/cli/issues/3304) + fix(completion): restore IFS even if `npm completion` returns error + ([@NariyasuHeseri](https://github.com/NariyasuHeseri)) +* [`554e8a5cd`](https://github.com/npm/cli/commit/554e8a5cd7034052a59a9ada31e4b8f73712211a) + [#3311](https://github.com/npm/cli/issues/3311) + set audit exit code properly + ([@isaacs](https://github.com/isaacs)) +* [`4a4fbe33c`](https://github.com/npm/cli/commit/4a4fbe33c51413adcd558b4af6f1e204b1b87e41) + [#3268](https://github.com/npm/cli/issues/3268) + [#3285](https://github.com/npm/cli/issues/3285) + fix(publish): skip private workspaces + ([@ruyadorno](https://github.com/ruyadorno)) + +### DOCUMENTATION + +* [`3c53d631f`](https://github.com/npm/cli/commit/3c53d631f557cf2484e2f6a6172c44e36aea4817) + [#3307](https://github.com/npm/cli/issues/3307) + fix(docs): typo in package-lock.json docs + ([@rethab](https://github.com/rethab)) +* [`96367f93f`](https://github.com/npm/cli/commit/96367f93f46c24494d084c8b8d34e4de9cd375da) + rebuild npm-pack doc + ([@isaacs](https://github.com/isaacs)) +* [`64b13dd10`](https://github.com/npm/cli/commit/64b13dd1082b6ca7eac4e8e329bfdd8cd8daf157) + [#3313](https://github.com/npm/cli/issues/3313) + Drop stale Python 3<->node-gyp remark + ([@spencerwilson](https://github.com/spencerwilson)) + +### DEPENDENCIES + +* [`7b56bfdf3`](https://github.com/npm/cli/commit/7b56bfdf3f2ac67a926fc7893b883a16b46eb3fd) + `cacache@15.2.0`: + * feat: allow fully deleting indices + * feat: add a validateEntry option to compact + * chore: lint + * chore: use standard npm style release scripts +* [`dbbc151a3`](https://github.com/npm/cli/commit/dbbc151a3bcf89e2627dc267063edd185ead1cb8) + `npm-audit-report@2.1.5`: + * fix(exit-code): account for null auditLevel default (#46) +* [`5b2604507`](https://github.com/npm/cli/commit/5b26045076477d3d350f539e60adf48a80376fda) + chore(package-lock): update devDependencies + ([@Gar](https://github.com/Gar)) + +### AUTOMATION + +* [`3d5df0082`](https://github.com/npm/cli/commit/3d5df0082ae904dacdea8644286e8362d4a2ed50) + [#3294](https://github.com/npm/cli/issues/3294) + chore(ci): move node release PR workflow to cli repo + ([@gimli01](https://github.com/gimli01)) + ## v7.14.0 (2021-05-20) ### FEATURES diff --git a/deps/npm/docs/content/commands/npm-link.md b/deps/npm/docs/content/commands/npm-link.md index e48be396ade1b1..b1c6066768a99e 100644 --- a/deps/npm/docs/content/commands/npm-link.md +++ b/deps/npm/docs/content/commands/npm-link.md @@ -99,6 +99,16 @@ relevant metadata by running `npm install --package-lock-only`. If you _want_ to save the `file:` reference in your `package.json` and `package-lock.json` files, you can use `npm link --save` to do so. +### Workspace Usage + +`npm link --workspace ` will link the relevant package as a +dependency of the specified workspace(s). Note that It may actually be +linked into the parent project's `node_modules` folder, if there are no +conflicting dependencies. + +`npm link --workspace ` will create a global link to the specified +workspace(s). + ### Configuration @@ -261,6 +271,38 @@ commands that modify your local installation, eg, `install`, `update`, Note: This is NOT honored by other network related commands, eg `dist-tags`, `owner`, etc. +#### `workspace` + +* Default: +* Type: String (can be set multiple times) + +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. + +Valid values for the `workspace` config are either: + +* Workspace names +* Path to a workspace directory +* Path to a parent workspace directory (will result to selecting all of the + nested workspaces) + +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. + +This value is not exported to the environment for child processes. + +#### `workspaces` + +* Default: false +* Type: Boolean + +Enable running a command in the context of **all** the configured +workspaces. + +This value is not exported to the environment for child processes. + ### See Also diff --git a/deps/npm/docs/content/commands/npm-pack.md b/deps/npm/docs/content/commands/npm-pack.md index ff90bd74472b41..04a22a5d854b45 100644 --- a/deps/npm/docs/content/commands/npm-pack.md +++ b/deps/npm/docs/content/commands/npm-pack.md @@ -27,6 +27,15 @@ commands that modify your local installation, eg, `install`, `update`, Note: This is NOT honored by other network related commands, eg `dist-tags`, `owner`, etc. +#### `json` + +* Default: false +* Type: Boolean + +Whether or not to output JSON data, rather than the normal output. + +Not supported by all npm commands. + #### `workspace` * Default: diff --git a/deps/npm/docs/content/commands/npm-run-script.md b/deps/npm/docs/content/commands/npm-run-script.md index 1d11a74faa2448..5e3828c40717dd 100644 --- a/deps/npm/docs/content/commands/npm-run-script.md +++ b/deps/npm/docs/content/commands/npm-run-script.md @@ -70,11 +70,7 @@ can use the `INIT_CWD` environment variable, which holds the full path you were in when you ran `npm run`. `npm run` sets the `NODE` environment variable to the `node` executable -with which `npm` is executed. Also, if the `--scripts-prepend-node-path` is -passed, the directory within which `node` resides is added to the `PATH`. -If `--scripts-prepend-node-path=auto` is passed (which has been the default -in `npm` v3), this is only performed when that `node` executable is not -found in the `PATH`. +with which `npm` is executed. If you try to run a script without having a `node_modules` directory and it fails, you will be given a warning to run `npm install`, just in case you've @@ -138,7 +134,6 @@ npm test -w a -w b This last command will run `test` in both `./packages/a` and `./packages/b` packages. - ### Configuration diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index 2d86aa62c00807..7ff1cc490707ee 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -62,10 +62,8 @@ requires compiling of C++ Code, npm will use [node-gyp](https://github.com/nodejs/node-gyp) for that task. For a Unix system, [node-gyp](https://github.com/nodejs/node-gyp) needs Python, make and a buildchain like GCC. On Windows, -Python and Microsoft Visual Studio C++ are needed. Python 3 is -not supported by [node-gyp](https://github.com/nodejs/node-gyp). -For more information visit -[the node-gyp repository](https://github.com/nodejs/node-gyp) and +Python and Microsoft Visual Studio C++ are needed. For more information +visit [the node-gyp repository](https://github.com/nodejs/node-gyp) and the [node-gyp Wiki](https://github.com/nodejs/node-gyp/wiki). ### Directories diff --git a/deps/npm/docs/content/configuring-npm/package-lock-json.md b/deps/npm/docs/content/configuring-npm/package-lock-json.md index 4d994bbc8c0a28..9b126867b80fad 100644 --- a/deps/npm/docs/content/configuring-npm/package-lock-json.md +++ b/deps/npm/docs/content/configuring-npm/package-lock-json.md @@ -36,8 +36,8 @@ various purposes: Both of these files have the same format, and perform similar functions in the root of a project. -The difference is that `package-lock.json` is that it cannot be published, -and it will be ignored if found in any place other than the root project. +The difference is that `package-lock.json` cannot be published, and it will +be ignored if found in any place other than the root project. In contrast, [npm-shrinkwrap.json](/configuring-npm/npm-shrinkwrap-json) allows publication, and defines the dependency tree from the point encountered. diff --git a/deps/npm/docs/content/using-npm/config.md b/deps/npm/docs/content/using-npm/config.md index 25b4d424e82ff4..44b79a801f15ec 100644 --- a/deps/npm/docs/content/using-npm/config.md +++ b/deps/npm/docs/content/using-npm/config.md @@ -776,6 +776,8 @@ What level of logs to report. On failure, *all* logs are written to Any logs of a higher level than the setting are shown. The default is "notice". +See also the `foreground-scripts` config. + #### `logs-max` * Default: 10 diff --git a/deps/npm/docs/content/using-npm/scripts.md b/deps/npm/docs/content/using-npm/scripts.md index 82cde7d79094d4..3869334f6cc5ae 100644 --- a/deps/npm/docs/content/using-npm/scripts.md +++ b/deps/npm/docs/content/using-npm/scripts.md @@ -304,7 +304,7 @@ For example, if your package.json contains this: { "scripts" : { "install" : "scripts/install.js", - "postinstall" : "scripts/postinstall.js", + "postinstall" : "scripts/install.js", "uninstall" : "scripts/uninstall.js" } } diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index b897405030256c..d558cb9d0a535b 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -141,7 +141,7 @@

npm-link

Table of contents

- +

Synopsis

@@ -209,6 +209,13 @@

Caveat

relevant metadata by running npm install <dep> --package-lock-only.

If you want to save the file: reference in your package.json and package-lock.json files, you can use npm link <dep> --save to do so.

+

Workspace Usage

+

npm link <pkg> --workspace <name> will link the relevant package as a +dependency of the specified workspace(s). Note that It may actually be +linked into the parent project’s node_modules folder, if there are no +conflicting dependencies.

+

npm link --workspace <name> will create a global link to the specified +workspace(s).

Configuration

@@ -347,6 +354,33 @@

dry-run

dedupe, uninstall, as well as pack and publish.

Note: This is NOT honored by other network related commands, eg dist-tags, owner, etc.

+

workspace

+
    +
  • Default:
  • +
  • Type: String (can be set multiple times)
  • +
+

Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

+

Valid values for the workspace config are either:

+
    +
  • Workspace names
  • +
  • Path to a workspace directory
  • +
  • Path to a parent workspace directory (will result to selecting all of the +nested workspaces)
  • +
+

When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

+

This value is not exported to the environment for child processes.

+

workspaces

+
    +
  • Default: false
  • +
  • Type: Boolean
  • +
+

Enable running a command in the context of all the configured +workspaces.

+

This value is not exported to the environment for child processes.

See Also

    diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 29530b05d1f2df..2839aa1e4146cf 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -159,7 +159,7 @@

    Description

    the results to only the paths to the packages named. Note that nested packages will also show the paths to the specified packages. For example, running npm ls promzard in npm’s source tree will show:

    -
    npm@7.14.0 /path/to/npm
    +
    npm@7.16.0 /path/to/npm
     └─┬ init-package-json@0.0.4
       └── promzard@0.1.5
     
    diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index 77535523cdb755..4380ff99b415c9 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -141,7 +141,7 @@

    npm-pack

    Table of contents

    - +

    Synopsis

    @@ -161,6 +161,13 @@

    dry-run

    dedupe, uninstall, as well as pack and publish.

    Note: This is NOT honored by other network related commands, eg dist-tags, owner, etc.

    +

    json

    +
      +
    • Default: false
    • +
    • Type: Boolean
    • +
    +

    Whether or not to output JSON data, rather than the normal output.

    +

    Not supported by all npm commands.

    workspace

    • Default:
    • diff --git a/deps/npm/docs/output/commands/npm-run-script.html b/deps/npm/docs/output/commands/npm-run-script.html index 54afe9f2404915..cbae66c2801866 100644 --- a/deps/npm/docs/output/commands/npm-run-script.html +++ b/deps/npm/docs/output/commands/npm-run-script.html @@ -190,11 +190,7 @@

      Description

      can use the INIT_CWD environment variable, which holds the full path you were in when you ran npm run.

      npm run sets the NODE environment variable to the node executable -with which npm is executed. Also, if the --scripts-prepend-node-path is -passed, the directory within which node resides is added to the PATH. -If --scripts-prepend-node-path=auto is passed (which has been the default -in npm v3), this is only performed when that node executable is not -found in the PATH.

      +with which npm is executed.

      If you try to run a script without having a node_modules directory and it fails, you will be given a warning to run npm install, just in case you’ve forgotten.

      diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 454fabf303f62c..8f4609dbce041f 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -148,7 +148,7 @@

      Table of contents

      npm <command> [args]
       

      Version

      -

      7.14.0

      +

      7.16.0

      Description

      npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency @@ -183,10 +183,8 @@

      Dependencies

      node-gyp for that task. For a Unix system, node-gyp needs Python, make and a buildchain like GCC. On Windows, -Python and Microsoft Visual Studio C++ are needed. Python 3 is -not supported by node-gyp. -For more information visit -the node-gyp repository and +Python and Microsoft Visual Studio C++ are needed. For more information +visit the node-gyp repository and the node-gyp Wiki.

      Directories

      See folders to learn about where npm puts diff --git a/deps/npm/docs/output/configuring-npm/package-lock-json.html b/deps/npm/docs/output/configuring-npm/package-lock-json.html index ce5e6525d9aab8..1e14f242bd6ee4 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -178,8 +178,8 @@

      Table of contents

      package-lock.json vs npm-shrinkwrap.json

      Both of these files have the same format, and perform similar functions in the root of a project.

      -

      The difference is that package-lock.json is that it cannot be published, -and it will be ignored if found in any place other than the root project.

      +

      The difference is that package-lock.json cannot be published, and it will +be ignored if found in any place other than the root project.

      In contrast, npm-shrinkwrap.json allows publication, and defines the dependency tree from the point encountered. This is not recommended unless deploying a CLI tool or otherwise using the diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 7e722bdc187903..e11eb0eec4af07 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -793,6 +793,7 @@

      loglevel

      npm-debug.log in the current working directory.

      Any logs of a higher level than the setting are shown. The default is “notice”.

      +

      See also the foreground-scripts config.

      logs-max

      • Default: 10
      • diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index dde9b1b75d7194..2c3bb9460fea44 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -406,7 +406,7 @@

        Examples

        {
           "scripts" : {
             "install" : "scripts/install.js",
        -    "postinstall" : "scripts/postinstall.js",
        +    "postinstall" : "scripts/install.js",
             "uninstall" : "scripts/uninstall.js"
           }
         }
        diff --git a/deps/npm/lib/base-command.js b/deps/npm/lib/base-command.js
        index e1efcff5832b3c..843fb2d4b13586 100644
        --- a/deps/npm/lib/base-command.js
        +++ b/deps/npm/lib/base-command.js
        @@ -7,6 +7,7 @@ class BaseCommand {
             this.wrapWidth = 80
             this.npm = npm
             this.workspaces = null
        +    this.workspacePaths = null
           }
         
           get name () {
        diff --git a/deps/npm/lib/cli.js b/deps/npm/lib/cli.js
        index f42132f9443900..d4a67645858aef 100644
        --- a/deps/npm/lib/cli.js
        +++ b/deps/npm/lib/cli.js
        @@ -53,7 +53,7 @@ module.exports = (process) => {
               npm.config.set('usage', false, 'cli')
             }
         
        -    npm.updateNotification = await updateNotifier(npm)
        +    updateNotifier(npm)
         
             const cmd = npm.argv.shift()
             const impl = npm.commands[cmd]
        diff --git a/deps/npm/lib/diff.js b/deps/npm/lib/diff.js
        index 1eaceb4f2f61f5..58834ca9c26746 100644
        --- a/deps/npm/lib/diff.js
        +++ b/deps/npm/lib/diff.js
        @@ -8,7 +8,7 @@ const npmlog = require('npmlog')
         const pacote = require('pacote')
         const pickManifest = require('npm-pick-manifest')
         
        -const readLocalPkg = require('./utils/read-local-package.js')
        +const readPackageName = require('./utils/read-package-name.js')
         const BaseCommand = require('./base-command.js')
         
         class Diff extends BaseCommand {
        @@ -97,7 +97,7 @@ class Diff extends BaseCommand {
             let noPackageJson
             let pkgName
             try {
        -      pkgName = await readLocalPkg(this.npm)
        +      pkgName = await readPackageName(this.npm.prefix)
             } catch (e) {
               npmlog.verbose('diff', 'could not read project dir package.json')
               noPackageJson = true
        @@ -120,7 +120,7 @@ class Diff extends BaseCommand {
             let noPackageJson
             let pkgName
             try {
        -      pkgName = await readLocalPkg(this.npm)
        +      pkgName = await readPackageName(this.npm.prefix)
             } catch (e) {
               npmlog.verbose('diff', 'could not read project dir package.json')
               noPackageJson = true
        @@ -238,7 +238,7 @@ class Diff extends BaseCommand {
             if (semverA && semverB) {
               let pkgName
               try {
        -        pkgName = await readLocalPkg(this.npm)
        +        pkgName = await readPackageName(this.npm.prefix)
               } catch (e) {
                 npmlog.verbose('diff', 'could not read project dir package.json')
               }
        diff --git a/deps/npm/lib/dist-tag.js b/deps/npm/lib/dist-tag.js
        index 64e8abc0137454..11b1ad931e18b9 100644
        --- a/deps/npm/lib/dist-tag.js
        +++ b/deps/npm/lib/dist-tag.js
        @@ -4,7 +4,7 @@ const regFetch = require('npm-registry-fetch')
         const semver = require('semver')
         
         const otplease = require('./utils/otplease.js')
        -const readLocalPkgName = require('./utils/read-local-package.js')
        +const readPackageName = require('./utils/read-package-name.js')
         const getWorkspaces = require('./workspaces/get-workspaces.js')
         const BaseCommand = require('./base-command.js')
         
        @@ -64,7 +64,7 @@ class DistTag extends BaseCommand {
               // should be listing the existing tags
               return this.list(cmdName, opts)
             } else
        -      throw this.usage
        +      throw this.usageError()
           }
         
           execWorkspaces (args, filters, cb) {
        @@ -102,7 +102,7 @@ class DistTag extends BaseCommand {
             log.verbose('dist-tag add', defaultTag, 'to', spec.name + '@' + version)
         
             if (!spec.name || !version || !defaultTag)
        -      throw this.usage
        +      throw this.usageError()
         
             const t = defaultTag.trim()
         
        @@ -135,7 +135,7 @@ class DistTag extends BaseCommand {
             log.verbose('dist-tag del', tag, 'from', spec.name)
         
             if (!spec.name)
        -      throw this.usage
        +      throw this.usageError()
         
             const tags = await this.fetchTags(spec, opts)
             if (!tags[tag]) {
        @@ -157,9 +157,11 @@ class DistTag extends BaseCommand {
         
           async list (spec, opts) {
             if (!spec) {
        -      const pkg = await readLocalPkgName(this.npm)
        +      if (this.npm.config.get('global'))
        +        throw this.usageError()
        +      const pkg = await readPackageName(this.npm.prefix)
               if (!pkg)
        -        throw this.usage
        +        throw this.usageError()
         
               return this.list(pkg, opts)
             }
        diff --git a/deps/npm/lib/exec.js b/deps/npm/lib/exec.js
        index f30746b8c50eda..8a87615d9749ee 100644
        --- a/deps/npm/lib/exec.js
        +++ b/deps/npm/lib/exec.js
        @@ -76,8 +76,8 @@ class Exec extends BaseCommand {
               localBin,
               log,
               globalBin,
        -      output,
             } = this.npm
        +    const output = (...outputArgs) => this.npm.output(...outputArgs)
             const scriptShell = this.npm.config.get('script-shell') || undefined
             const packages = this.npm.config.get('package')
             const yes = this.npm.config.get('yes')
        diff --git a/deps/npm/lib/init.js b/deps/npm/lib/init.js
        index bc809a15e49a9f..4dd091601e1915 100644
        --- a/deps/npm/lib/init.js
        +++ b/deps/npm/lib/init.js
        @@ -113,8 +113,13 @@ class Init extends BaseCommand {
               localBin,
               log,
               globalBin,
        -      output,
             } = this.npm
        +    // this function is definitely called.  But because of coverage map stuff
        +    // it ends up both uncovered, and the coverage report doesn't even mention.
        +    // the tests do assert that some output happens, so we know this line is
        +    // being hit.
        +    /* istanbul ignore next */
        +    const output = (...outputArgs) => this.npm.output(...outputArgs)
             const locationMsg = await getLocationMsg({ color, path })
             const runPath = path
             const scriptShell = this.npm.config.get('script-shell') || undefined
        diff --git a/deps/npm/lib/link.js b/deps/npm/lib/link.js
        index 60665a9964fab4..47fe4b17a272b9 100644
        --- a/deps/npm/lib/link.js
        +++ b/deps/npm/lib/link.js
        @@ -10,8 +10,8 @@ const semver = require('semver')
         
         const reifyFinish = require('./utils/reify-finish.js')
         
        -const BaseCommand = require('./base-command.js')
        -class Link extends BaseCommand {
        +const ArboristWorkspaceCmd = require('./workspaces/arborist-cmd.js')
        +class Link extends ArboristWorkspaceCmd {
           /* istanbul ignore next - see test/lib/load-all-commands.js */
           static get description () {
             return 'Symlink a package folder'
        @@ -46,6 +46,7 @@ class Link extends BaseCommand {
               'bin-links',
               'fund',
               'dry-run',
        +      ...super.params,
             ]
           }
         
        @@ -143,12 +144,16 @@ class Link extends BaseCommand {
               log: this.npm.log,
               add: names.map(l => `file:${resolve(globalTop, 'node_modules', l)}`),
               save,
        +      workspaces: this.workspaces,
             })
         
             await reifyFinish(this.npm, localArb)
           }
         
           async linkPkg () {
        +    const wsp = this.workspacePaths
        +    const paths = wsp && wsp.length ? wsp : [this.npm.prefix]
        +    const add = paths.map(path => `file:${path}`)
             const globalTop = resolve(this.npm.globalDir, '..')
             const arb = new Arborist({
               ...this.npm.flatOptions,
        @@ -157,7 +162,7 @@ class Link extends BaseCommand {
               global: true,
             })
             await arb.reify({
        -      add: [`file:${this.npm.prefix}`],
        +      add,
               log: this.npm.log,
             })
             await reifyFinish(this.npm, arb)
        diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js
        index 4e504912a01751..d92b73ddfcdbb1 100644
        --- a/deps/npm/lib/ls.js
        +++ b/deps/npm/lib/ls.js
        @@ -1,4 +1,5 @@
        -const { resolve } = require('path')
        +const { resolve, relative, sep } = require('path')
        +const relativePrefix = `.${sep}`
         const { EOL } = require('os')
         
         const archy = require('archy')
        @@ -298,6 +299,9 @@ const getHumanOutputItem = (node, { args, color, global, long }) => {
             ? chalk.yellow.bgBlack
             : chalk.red.bgBlack
           const missingMsg = `UNMET ${isOptional(node) ? 'OPTIONAL ' : ''}DEPENDENCY`
        +  const targetLocation = node.root
        +    ? relative(node.root.realpath, node.realpath)
        +    : node.targetLocation
           const label =
             (
               node[_missing]
        @@ -321,7 +325,7 @@ const getHumanOutputItem = (node, { args, color, global, long }) => {
                 : ''
             ) +
             (isGitNode(node) ? ` (${node.resolved})` : '') +
        -    (node.isLink ? ` -> ${node.realpath}` : '') +
        +    (node.isLink ? ` -> ${relativePrefix}${targetLocation}` : '') +
             (long ? `${EOL}${node.package.description || ''}` : '')
         
           return augmentItemWithIncludeMetadata(node, { label, nodes: [] })
        @@ -445,6 +449,9 @@ const augmentNodesWithMetadata = ({
           // revisit that node in tree traversal logic, so we make it so that
           // we have a diff obj for deduped nodes:
           if (seenNodes.has(node.path)) {
        +    const { realpath, root } = node
        +    const targetLocation = root ? relative(root.realpath, realpath)
        +      : node.targetLocation
             node = {
               name: node.name,
               version: node.version,
        @@ -453,6 +460,7 @@ const augmentNodesWithMetadata = ({
               path: node.path,
               isLink: node.isLink,
               realpath: node.realpath,
        +      targetLocation,
               [_type]: node[_type],
               [_invalid]: node[_invalid],
               [_missing]: node[_missing],
        diff --git a/deps/npm/lib/owner.js b/deps/npm/lib/owner.js
        index e57d2268d2619f..311b25064e6383 100644
        --- a/deps/npm/lib/owner.js
        +++ b/deps/npm/lib/owner.js
        @@ -4,7 +4,7 @@ const npmFetch = require('npm-registry-fetch')
         const pacote = require('pacote')
         
         const otplease = require('./utils/otplease.js')
        -const readLocalPkg = require('./utils/read-local-package.js')
        +const readLocalPkgName = require('./utils/read-package-name.js')
         const BaseCommand = require('./base-command.js')
         
         class Owner extends BaseCommand {
        @@ -47,7 +47,9 @@ class Owner extends BaseCommand {
         
             // reaches registry in order to autocomplete rm
             if (argv[2] === 'rm') {
        -      const pkgName = await readLocalPkg(this.npm)
        +      if (this.npm.config.get('global'))
        +        return []
        +      const pkgName = await readLocalPkgName(this.npm.prefix)
               if (!pkgName)
                 return []
         
        @@ -84,7 +86,10 @@ class Owner extends BaseCommand {
         
           async ls (pkg, opts) {
             if (!pkg) {
        -      const pkgName = await readLocalPkg(this.npm)
        +      if (this.npm.config.get('global'))
        +        throw this.usageError()
        +
        +      const pkgName = await readLocalPkgName(this.npm.prefix)
               if (!pkgName)
                 throw this.usageError()
         
        @@ -113,7 +118,9 @@ class Owner extends BaseCommand {
               throw this.usageError()
         
             if (!pkg) {
        -      const pkgName = await readLocalPkg(this.npm)
        +      if (this.npm.config.get('global'))
        +        throw this.usageError()
        +      const pkgName = await readLocalPkgName(this.npm.prefix)
               if (!pkgName)
                 throw this.usageError()
         
        @@ -131,7 +138,9 @@ class Owner extends BaseCommand {
               throw this.usageError()
         
             if (!pkg) {
        -      const pkgName = await readLocalPkg(this.npm)
        +      if (this.npm.config.get('global'))
        +        throw this.usageError()
        +      const pkgName = await readLocalPkgName(this.npm.prefix)
               if (!pkgName)
                 throw this.usageError()
         
        diff --git a/deps/npm/lib/publish.js b/deps/npm/lib/publish.js
        index 1693ea7d97c2a3..3cb8b0627e974b 100644
        --- a/deps/npm/lib/publish.js
        +++ b/deps/npm/lib/publish.js
        @@ -7,6 +7,7 @@ const runScript = require('@npmcli/run-script')
         const pacote = require('pacote')
         const npa = require('npm-package-arg')
         const npmFetch = require('npm-registry-fetch')
        +const chalk = require('chalk')
         
         const otplease = require('./utils/otplease.js')
         const { getContents, logTar } = require('./utils/tar.js')
        @@ -154,10 +155,29 @@ class Publish extends BaseCommand {
             const results = {}
             const json = this.npm.config.get('json')
             const silent = log.level === 'silent'
        +    const noop = a => a
        +    const color = this.npm.color ? chalk : { green: noop, bold: noop }
             const workspaces =
               await getWorkspaces(filters, { path: this.npm.localPrefix })
        +
             for (const [name, workspace] of workspaces.entries()) {
        -      const pkgContents = await this.publish([workspace])
        +      let pkgContents
        +      try {
        +        pkgContents = await this.publish([workspace])
        +      } catch (err) {
        +        if (err.code === 'EPRIVATE') {
        +          log.warn(
        +            'publish',
        +            `Skipping workspace ${
        +              color.green(name)
        +            }, marked as ${
        +              color.bold('private')
        +            }`
        +          )
        +          continue
        +        }
        +        throw err
        +      }
               // This needs to be in-line w/ the rest of the output that non-JSON
               // publish generates
               if (!silent && !json)
        diff --git a/deps/npm/lib/utils/completion.sh b/deps/npm/lib/utils/completion.sh
        index c549b31c964931..a3e5143991edd0 100755
        --- a/deps/npm/lib/utils/completion.sh
        +++ b/deps/npm/lib/utils/completion.sh
        @@ -18,11 +18,15 @@ if type complete &>/dev/null; then
             fi
         
             local si="$IFS"
        -    IFS=$'\n' COMPREPLY=($(COMP_CWORD="$cword" \
        +    if ! IFS=$'\n' COMPREPLY=($(COMP_CWORD="$cword" \
                                    COMP_LINE="$COMP_LINE" \
                                    COMP_POINT="$COMP_POINT" \
                                    npm completion -- "${words[@]}" \
        -                           2>/dev/null)) || return $?
        +                           2>/dev/null)); then
        +      local ret=$?
        +      IFS="$si"
        +      return $ret
        +    fi
             IFS="$si"
             if type __ltrim_colon_completions &>/dev/null; then
               __ltrim_colon_completions "${words[cword]}"
        @@ -49,11 +53,16 @@ elif type compctl &>/dev/null; then
             read -l line
             read -ln point
             si="$IFS"
        -    IFS=$'\n' reply=($(COMP_CWORD="$cword" \
        +    if ! IFS=$'\n' reply=($(COMP_CWORD="$cword" \
                                COMP_LINE="$line" \
                                COMP_POINT="$point" \
                                npm completion -- "${words[@]}" \
        -                       2>/dev/null)) || return $?
        +                       2>/dev/null)); then
        +
        +      local ret=$?
        +      IFS="$si"
        +      return $ret
        +    fi
             IFS="$si"
           }
           compctl -K _npm_completion npm
        diff --git a/deps/npm/lib/utils/config/definitions.js b/deps/npm/lib/utils/config/definitions.js
        index 22fff38787d7b3..ea9665b5431f51 100644
        --- a/deps/npm/lib/utils/config/definitions.js
        +++ b/deps/npm/lib/utils/config/definitions.js
        @@ -1128,6 +1128,8 @@ define('loglevel', {
         
             Any logs of a higher level than the setting are shown. The default is
             "notice".
        +
        +    See also the \`foreground-scripts\` config.
           `,
         })
         
        diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js
        index 1fc31df44ffb9b..da716679d27059 100644
        --- a/deps/npm/lib/utils/error-handler.js
        +++ b/deps/npm/lib/utils/error-handler.js
        @@ -119,7 +119,9 @@ const errorHandler = (er) => {
           if (cbCalled)
             er = er || new Error('Callback called more than once.')
         
        -  if (npm.updateNotification) {
        +  // only show the notification if it finished before the other stuff we
        +  // were doing.  no need to hang on `npm -v` or something.
        +  if (typeof npm.updateNotification === 'string') {
             const { level } = log
             log.level = log.levels.notice
             log.notice('', npm.updateNotification)
        diff --git a/deps/npm/lib/utils/read-local-package.js b/deps/npm/lib/utils/read-package-name.js
        similarity index 56%
        rename from deps/npm/lib/utils/read-local-package.js
        rename to deps/npm/lib/utils/read-package-name.js
        index 21506ca180a0f3..7ed15987767bb4 100644
        --- a/deps/npm/lib/utils/read-local-package.js
        +++ b/deps/npm/lib/utils/read-package-name.js
        @@ -1,10 +1,7 @@
         const { resolve } = require('path')
         const readJson = require('read-package-json-fast')
        -async function readLocalPackageName (npm) {
        -  if (npm.config.get('global'))
        -    return
        -
        -  const filepath = resolve(npm.prefix, 'package.json')
        +async function readLocalPackageName (prefix) {
        +  const filepath = resolve(prefix, 'package.json')
           const json = await readJson(filepath)
           return json.name
         }
        diff --git a/deps/npm/lib/utils/reify-output.js b/deps/npm/lib/utils/reify-output.js
        index ddad32121e8b45..bf3fa7fb2e13d8 100644
        --- a/deps/npm/lib/utils/reify-output.js
        +++ b/deps/npm/lib/utils/reify-output.js
        @@ -18,10 +18,6 @@ const auditError = require('./audit-error.js')
         
         // TODO: output JSON if flatOptions.json is true
         const reifyOutput = (npm, arb) => {
        -  // don't print any info in --silent mode
        -  if (log.levels[log.level] > log.levels.error)
        -    return
        -
           const { diff, actualTree } = arb
         
           // note: fails and crashes if we're running audit fix and there was an error
        @@ -29,6 +25,13 @@ const reifyOutput = (npm, arb) => {
           // stuff in that case!
           const auditReport = auditError(npm, arb.auditReport) ? null : arb.auditReport
         
        +  // don't print any info in --silent mode, but we still need to
        +  // set the exitCode properly from the audit report, if we have one.
        +  if (log.levels[log.level] > log.levels.error) {
        +    getAuditReport(npm, auditReport)
        +    return
        +  }
        +
           const summary = {
             added: 0,
             removed: 0,
        @@ -68,6 +71,8 @@ const reifyOutput = (npm, arb) => {
         
           if (npm.flatOptions.json) {
             if (auditReport) {
        +      // call this to set the exit code properly
        +      getAuditReport(npm, auditReport)
               summary.audit = npm.command === 'audit' ? auditReport
                 : auditReport.toJSON().metadata
             }
        @@ -83,11 +88,25 @@ const reifyOutput = (npm, arb) => {
         // at the end if there's still stuff, because it's silly for `npm audit`
         // to tell you to run `npm audit` for details.  otherwise, use the summary
         // report.  if we get here, we know it's not quiet or json.
        +// If the loglevel is set higher than 'error', then we just run the report
        +// to get the exitCode set appropriately.
         const printAuditReport = (npm, report) => {
        +  const res = getAuditReport(npm, report)
        +  if (!res || !res.report)
        +    return
        +  npm.output(`\n${res.report}`)
        +}
        +
        +const getAuditReport = (npm, report) => {
           if (!report)
             return
         
        -  const reporter = npm.command !== 'audit' ? 'install' : 'detail'
        +  // when in silent mode, we print nothing.  the JSON output is
        +  // going to just JSON.stringify() the report object.
        +  const reporter = log.levels[log.level] > log.levels.error ? 'quiet'
        +    : npm.flatOptions.json ? 'quiet'
        +    : npm.command !== 'audit' ? 'install'
        +    : 'detail'
           const defaultAuditLevel = npm.command !== 'audit' ? 'none' : 'low'
           const auditLevel = npm.flatOptions.auditLevel || defaultAuditLevel
         
        @@ -96,8 +115,9 @@ const printAuditReport = (npm, report) => {
             ...npm.flatOptions,
             auditLevel,
           })
        -  process.exitCode = process.exitCode || res.exitCode
        -  npm.output('\n' + res.report)
        +  if (npm.command === 'audit')
        +    process.exitCode = process.exitCode || res.exitCode
        +  return res
         }
         
         const packagesChangedMessage = (npm, { added, removed, changed, audited }) => {
        diff --git a/deps/npm/lib/utils/update-notifier.js b/deps/npm/lib/utils/update-notifier.js
        index 0a19be94e62a41..ed5806ced2a7d9 100644
        --- a/deps/npm/lib/utils/update-notifier.js
        +++ b/deps/npm/lib/utils/update-notifier.js
        @@ -14,30 +14,32 @@ const { resolve } = require('path')
         const isGlobalNpmUpdate = npm => {
           return npm.flatOptions.global &&
             ['install', 'update'].includes(npm.command) &&
        -    npm.argv.includes('npm')
        +    npm.argv.some(arg => /^npm(@|$)/.test(arg))
         }
         
         // update check frequency
         const DAILY = 1000 * 60 * 60 * 24
         const WEEKLY = DAILY * 7
         
        -const updateTimeout = async (npm, duration) => {
        +// don't put it in the _cacache folder, just in npm's cache
        +const lastCheckedFile = npm =>
        +  resolve(npm.flatOptions.cache, '../_update-notifier-last-checked')
        +
        +const checkTimeout = async (npm, duration) => {
           const t = new Date(Date.now() - duration)
        -  // don't put it in the _cacache folder, just in npm's cache
        -  const f = resolve(npm.flatOptions.cache, '../_update-notifier-last-checked')
        +  const f = lastCheckedFile(npm)
           // if we don't have a file, then definitely check it.
           const st = await stat(f).catch(() => ({ mtime: t - 1 }))
        +  return t > st.mtime
        +}
         
        -  if (t > st.mtime) {
        -    // best effort, if this fails, it's ok.
        -    // might be using /dev/null as the cache or something weird like that.
        -    await writeFile(f, '').catch(() => {})
        -    return true
        -  } else
        -    return false
        +const updateTimeout = async npm => {
        +  // best effort, if this fails, it's ok.
        +  // might be using /dev/null as the cache or something weird like that.
        +  await writeFile(lastCheckedFile(npm), '').catch(() => {})
         }
         
        -const updateNotifier = module.exports = async (npm, spec = 'latest') => {
        +const updateNotifier = async (npm, spec = 'latest') => {
           // never check for updates in CI, when updating npm already, or opted out
           if (!npm.config.get('update-notifier') ||
               isGlobalNpmUpdate(npm) ||
        @@ -57,7 +59,7 @@ const updateNotifier = module.exports = async (npm, spec = 'latest') => {
           const duration = spec !== 'latest' ? DAILY : WEEKLY
         
           // if we've already checked within the specified duration, don't check again
        -  if (!(await updateTimeout(npm, duration)))
        +  if (!(await checkTimeout(npm, duration)))
             return null
         
           // if they're currently using a prerelease, nudge to the next prerelease
        @@ -113,3 +115,11 @@ const updateNotifier = module.exports = async (npm, spec = 'latest') => {
         
           return messagec
         }
        +
        +// only update the notification timeout if we actually finished checking
        +module.exports = async npm => {
        +  const notification = await updateNotifier(npm)
        +  // intentional.  do not await this.  it's a best-effort update.
        +  updateTimeout(npm)
        +  npm.updateNotification = notification
        +}
        diff --git a/deps/npm/lib/workspaces/arborist-cmd.js b/deps/npm/lib/workspaces/arborist-cmd.js
        index b12c0ee47b19f0..337e7f9d8f9321 100644
        --- a/deps/npm/lib/workspaces/arborist-cmd.js
        +++ b/deps/npm/lib/workspaces/arborist-cmd.js
        @@ -17,6 +17,7 @@ class ArboristCmd extends BaseCommand {
             getWorkspaces(filters, { path: this.npm.localPrefix })
               .then(workspaces => {
                 this.workspaces = [...workspaces.keys()]
        +        this.workspacePaths = [...workspaces.values()]
                 this.exec(args, cb)
               })
               .catch(er => cb(er))
        diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1
        index 9d6faac7a39083..75b1e990e58620 100644
        --- a/deps/npm/man/man1/npm-access.1
        +++ b/deps/npm/man/man1/npm-access.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-ACCESS" "1" "May 2021" "" ""
        +.TH "NPM\-ACCESS" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-access\fR \- Set access level on published packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1
        index de7c5424d3b9a0..213191e2960638 100644
        --- a/deps/npm/man/man1/npm-adduser.1
        +++ b/deps/npm/man/man1/npm-adduser.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-ADDUSER" "1" "May 2021" "" ""
        +.TH "NPM\-ADDUSER" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-adduser\fR \- Add a registry user account
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-audit.1 b/deps/npm/man/man1/npm-audit.1
        index a012de1608e301..dfd4f7ec872f2e 100644
        --- a/deps/npm/man/man1/npm-audit.1
        +++ b/deps/npm/man/man1/npm-audit.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-AUDIT" "1" "May 2021" "" ""
        +.TH "NPM\-AUDIT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-audit\fR \- Run a security audit
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-bin.1 b/deps/npm/man/man1/npm-bin.1
        index 957732cb942b63..5206fc0ece1b7f 100644
        --- a/deps/npm/man/man1/npm-bin.1
        +++ b/deps/npm/man/man1/npm-bin.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-BIN" "1" "May 2021" "" ""
        +.TH "NPM\-BIN" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-bin\fR \- Display npm bin folder
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1
        index 72a1e2d5111ab8..d07e7e35f5f714 100644
        --- a/deps/npm/man/man1/npm-bugs.1
        +++ b/deps/npm/man/man1/npm-bugs.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-BUGS" "1" "May 2021" "" ""
        +.TH "NPM\-BUGS" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-bugs\fR \- Report bugs for a package in a web browser
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1
        index a2e140c93580e9..02a4f6888f75b2 100644
        --- a/deps/npm/man/man1/npm-cache.1
        +++ b/deps/npm/man/man1/npm-cache.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-CACHE" "1" "May 2021" "" ""
        +.TH "NPM\-CACHE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-cache\fR \- Manipulates packages cache
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-ci.1 b/deps/npm/man/man1/npm-ci.1
        index ebbf8530787644..cdbc318d309019 100644
        --- a/deps/npm/man/man1/npm-ci.1
        +++ b/deps/npm/man/man1/npm-ci.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-CI" "1" "May 2021" "" ""
        +.TH "NPM\-CI" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-ci\fR \- Install a project with a clean slate
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1
        index dffedb6b639e6a..d853c9bbe32ce0 100644
        --- a/deps/npm/man/man1/npm-completion.1
        +++ b/deps/npm/man/man1/npm-completion.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-COMPLETION" "1" "May 2021" "" ""
        +.TH "NPM\-COMPLETION" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-completion\fR \- Tab Completion for npm
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1
        index a2a357f861d4f9..4eb04f2f006b5f 100644
        --- a/deps/npm/man/man1/npm-config.1
        +++ b/deps/npm/man/man1/npm-config.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-CONFIG" "1" "May 2021" "" ""
        +.TH "NPM\-CONFIG" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-config\fR \- Manage the npm configuration files
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1
        index 4dc5896b2d2a98..741e613b1cbabd 100644
        --- a/deps/npm/man/man1/npm-dedupe.1
        +++ b/deps/npm/man/man1/npm-dedupe.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DEDUPE" "1" "May 2021" "" ""
        +.TH "NPM\-DEDUPE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-dedupe\fR \- Reduce duplication in the package tree
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1
        index d705787d73b860..81ef20ada52591 100644
        --- a/deps/npm/man/man1/npm-deprecate.1
        +++ b/deps/npm/man/man1/npm-deprecate.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DEPRECATE" "1" "May 2021" "" ""
        +.TH "NPM\-DEPRECATE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-deprecate\fR \- Deprecate a version of a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1
        index fb32b068689be7..d2251146e7e626 100644
        --- a/deps/npm/man/man1/npm-diff.1
        +++ b/deps/npm/man/man1/npm-diff.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DIFF" "1" "May 2021" "" ""
        +.TH "NPM\-DIFF" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-diff\fR \- The registry diff command
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1
        index 5f52ff56040cbe..edb31fad1561fd 100644
        --- a/deps/npm/man/man1/npm-dist-tag.1
        +++ b/deps/npm/man/man1/npm-dist-tag.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DIST\-TAG" "1" "May 2021" "" ""
        +.TH "NPM\-DIST\-TAG" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-dist-tag\fR \- Modify package distribution tags
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1
        index aff1d30424fc74..f181d676c90648 100644
        --- a/deps/npm/man/man1/npm-docs.1
        +++ b/deps/npm/man/man1/npm-docs.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DOCS" "1" "May 2021" "" ""
        +.TH "NPM\-DOCS" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-docs\fR \- Open documentation for a package in a web browser
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-doctor.1 b/deps/npm/man/man1/npm-doctor.1
        index 6c2fe5684d1faf..3cb800333912ce 100644
        --- a/deps/npm/man/man1/npm-doctor.1
        +++ b/deps/npm/man/man1/npm-doctor.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-DOCTOR" "1" "May 2021" "" ""
        +.TH "NPM\-DOCTOR" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-doctor\fR \- Check your npm environment
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1
        index 231a43afbbe486..a6d045db8a7ff6 100644
        --- a/deps/npm/man/man1/npm-edit.1
        +++ b/deps/npm/man/man1/npm-edit.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-EDIT" "1" "May 2021" "" ""
        +.TH "NPM\-EDIT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-edit\fR \- Edit an installed package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-exec.1 b/deps/npm/man/man1/npm-exec.1
        index 92d81795ad89c5..f3b991a3330537 100644
        --- a/deps/npm/man/man1/npm-exec.1
        +++ b/deps/npm/man/man1/npm-exec.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-EXEC" "1" "May 2021" "" ""
        +.TH "NPM\-EXEC" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-exec\fR \- Run a command from a local or remote npm package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-explain.1 b/deps/npm/man/man1/npm-explain.1
        index 6c8df53652e70b..507a68074f1061 100644
        --- a/deps/npm/man/man1/npm-explain.1
        +++ b/deps/npm/man/man1/npm-explain.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-EXPLAIN" "1" "May 2021" "" ""
        +.TH "NPM\-EXPLAIN" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-explain\fR \- Explain installed packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1
        index 606776e29f0fdb..b4ca707a099a7c 100644
        --- a/deps/npm/man/man1/npm-explore.1
        +++ b/deps/npm/man/man1/npm-explore.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-EXPLORE" "1" "May 2021" "" ""
        +.TH "NPM\-EXPLORE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-explore\fR \- Browse an installed package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-find-dupes.1 b/deps/npm/man/man1/npm-find-dupes.1
        index fe8ead43e8ff65..e3ecfe15cdee0b 100644
        --- a/deps/npm/man/man1/npm-find-dupes.1
        +++ b/deps/npm/man/man1/npm-find-dupes.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-FIND\-DUPES" "1" "May 2021" "" ""
        +.TH "NPM\-FIND\-DUPES" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-find-dupes\fR \- Find duplication in the package tree
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1
        index 09b43ace17c6de..6d098b88042745 100644
        --- a/deps/npm/man/man1/npm-fund.1
        +++ b/deps/npm/man/man1/npm-fund.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-FUND" "1" "May 2021" "" ""
        +.TH "NPM\-FUND" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-fund\fR \- Retrieve funding information
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1
        index f99582872bf068..3554328daa4dda 100644
        --- a/deps/npm/man/man1/npm-help-search.1
        +++ b/deps/npm/man/man1/npm-help-search.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-HELP\-SEARCH" "1" "May 2021" "" ""
        +.TH "NPM\-HELP\-SEARCH" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-help-search\fR \- Search npm help documentation
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1
        index 9835fa89438b27..db9639e94e6101 100644
        --- a/deps/npm/man/man1/npm-help.1
        +++ b/deps/npm/man/man1/npm-help.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-HELP" "1" "May 2021" "" ""
        +.TH "NPM\-HELP" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-help\fR \- Get help on npm
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-hook.1 b/deps/npm/man/man1/npm-hook.1
        index e615148ef53268..08b52f2c4c4a45 100644
        --- a/deps/npm/man/man1/npm-hook.1
        +++ b/deps/npm/man/man1/npm-hook.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-HOOK" "1" "May 2021" "" ""
        +.TH "NPM\-HOOK" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-hook\fR \- Manage registry hooks
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1
        index fab1b127dd3e97..970201eba343cd 100644
        --- a/deps/npm/man/man1/npm-init.1
        +++ b/deps/npm/man/man1/npm-init.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-INIT" "1" "May 2021" "" ""
        +.TH "NPM\-INIT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-init\fR \- Create a package\.json file
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1
        index ef7ee7c8cb28a2..1267c086725eb0 100644
        --- a/deps/npm/man/man1/npm-install-ci-test.1
        +++ b/deps/npm/man/man1/npm-install-ci-test.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-INSTALL\-CI\-TEST" "1" "May 2021" "" ""
        +.TH "NPM\-INSTALL\-CI\-TEST" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-install-ci-test\fR \- Install a project with a clean slate and run tests
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1
        index ed77750516cdcd..969054201c5d30 100644
        --- a/deps/npm/man/man1/npm-install-test.1
        +++ b/deps/npm/man/man1/npm-install-test.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-INSTALL\-TEST" "1" "May 2021" "" ""
        +.TH "NPM\-INSTALL\-TEST" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-install-test\fR \- Install package(s) and run tests
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1
        index 37ede568148c0a..94cd6d88a64947 100644
        --- a/deps/npm/man/man1/npm-install.1
        +++ b/deps/npm/man/man1/npm-install.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-INSTALL" "1" "May 2021" "" ""
        +.TH "NPM\-INSTALL" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-install\fR \- Install a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1
        index 18feec2632138b..4eea5bef5500bd 100644
        --- a/deps/npm/man/man1/npm-link.1
        +++ b/deps/npm/man/man1/npm-link.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-LINK" "1" "May 2021" "" ""
        +.TH "NPM\-LINK" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-link\fR \- Symlink a package folder
         .SS Synopsis
        @@ -103,6 +103,15 @@ relevant metadata by running \fBnpm install  \-\-package\-lock\-only\fP\|\.
         .P
         If you \fIwant\fR to save the \fBfile:\fP reference in your \fBpackage\.json\fP and
         \fBpackage\-lock\.json\fP files, you can use \fBnpm link  \-\-save\fP to do so\.
        +.SS Workspace Usage
        +.P
        +\fBnpm link  \-\-workspace \fP will link the relevant package as a
        +dependency of the specified workspace(s)\.  Note that It may actually be
        +linked into the parent project's \fBnode_modules\fP folder, if there are no
        +conflicting dependencies\.
        +.P
        +\fBnpm link \-\-workspace \fP will create a global link to the specified
        +workspace(s)\.
         .SS Configuration
         
         
        @@ -308,6 +317,49 @@ commands that modify your local installation, eg, \fBinstall\fP, \fBupdate\fP,
         .P
         Note: This is NOT honored by other network related commands, eg \fBdist\-tags\fP,
         \fBowner\fP, etc\.
        +.SS \fBworkspace\fP
        +.RS 0
        +.IP \(bu 2
        +Default:
        +.IP \(bu 2
        +Type: String (can be set multiple times)
        +
        +.RE
        +.P
        +Enable running a command in the context of the configured workspaces of the
        +current project while filtering by running only the workspaces defined by
        +this configuration option\.
        +.P
        +Valid values for the \fBworkspace\fP config are either:
        +.RS 0
        +.IP \(bu 2
        +Workspace names
        +.IP \(bu 2
        +Path to a workspace directory
        +.IP \(bu 2
        +Path to a parent workspace directory (will result to selecting all of the
        +nested workspaces)
        +
        +.RE
        +.P
        +When set for the \fBnpm init\fP command, this may be set to the folder of a
        +workspace which does not yet exist, to create the folder and set it up as a
        +brand new workspace within the project\.
        +.P
        +This value is not exported to the environment for child processes\.
        +.SS \fBworkspaces\fP
        +.RS 0
        +.IP \(bu 2
        +Default: false
        +.IP \(bu 2
        +Type: Boolean
        +
        +.RE
        +.P
        +Enable running a command in the context of \fBall\fR the configured
        +workspaces\.
        +.P
        +This value is not exported to the environment for child processes\.
         
         
         .SS See Also
        diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1
        index ca61850bc2cfe5..aaa6c7667c4715 100644
        --- a/deps/npm/man/man1/npm-logout.1
        +++ b/deps/npm/man/man1/npm-logout.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-LOGOUT" "1" "May 2021" "" ""
        +.TH "NPM\-LOGOUT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-logout\fR \- Log out of the registry
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1
        index a0098530c3fffa..450704f45df212 100644
        --- a/deps/npm/man/man1/npm-ls.1
        +++ b/deps/npm/man/man1/npm-ls.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-LS" "1" "May 2021" "" ""
        +.TH "NPM\-LS" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-ls\fR \- List installed packages
         .SS Synopsis
        @@ -26,7 +26,7 @@ example, running \fBnpm ls promzard\fP in npm's source tree will show:
         .P
         .RS 2
         .nf
        -npm@7\.14\.0 /path/to/npm
        +npm@7\.16\.0 /path/to/npm
         └─┬ init\-package\-json@0\.0\.4
           └── promzard@0\.1\.5
         .fi
        diff --git a/deps/npm/man/man1/npm-org.1 b/deps/npm/man/man1/npm-org.1
        index 04c7ea35e75222..12b3ffa648cdb6 100644
        --- a/deps/npm/man/man1/npm-org.1
        +++ b/deps/npm/man/man1/npm-org.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-ORG" "1" "May 2021" "" ""
        +.TH "NPM\-ORG" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-org\fR \- Manage orgs
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1
        index 0df4e2b3524479..b7760dcc277a04 100644
        --- a/deps/npm/man/man1/npm-outdated.1
        +++ b/deps/npm/man/man1/npm-outdated.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-OUTDATED" "1" "May 2021" "" ""
        +.TH "NPM\-OUTDATED" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-outdated\fR \- Check for outdated packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1
        index 151d4f50a97eb7..65cce149d84386 100644
        --- a/deps/npm/man/man1/npm-owner.1
        +++ b/deps/npm/man/man1/npm-owner.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-OWNER" "1" "May 2021" "" ""
        +.TH "NPM\-OWNER" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-owner\fR \- Manage package owners
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1
        index f120e865729782..541a8a8bd8f6d8 100644
        --- a/deps/npm/man/man1/npm-pack.1
        +++ b/deps/npm/man/man1/npm-pack.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PACK" "1" "May 2021" "" ""
        +.TH "NPM\-PACK" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-pack\fR \- Create a tarball from a package
         .SS Synopsis
        @@ -27,6 +27,18 @@ commands that modify your local installation, eg, \fBinstall\fP, \fBupdate\fP,
         .P
         Note: This is NOT honored by other network related commands, eg \fBdist\-tags\fP,
         \fBowner\fP, etc\.
        +.SS \fBjson\fP
        +.RS 0
        +.IP \(bu 2
        +Default: false
        +.IP \(bu 2
        +Type: Boolean
        +
        +.RE
        +.P
        +Whether or not to output JSON data, rather than the normal output\.
        +.P
        +Not supported by all npm commands\.
         .SS \fBworkspace\fP
         .RS 0
         .IP \(bu 2
        diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1
        index f6375b9b2d3f5b..22a344819646b0 100644
        --- a/deps/npm/man/man1/npm-ping.1
        +++ b/deps/npm/man/man1/npm-ping.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PING" "1" "May 2021" "" ""
        +.TH "NPM\-PING" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-ping\fR \- Ping npm registry
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1
        index bc9aaf91010a71..e8ed7409acd5aa 100644
        --- a/deps/npm/man/man1/npm-prefix.1
        +++ b/deps/npm/man/man1/npm-prefix.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PREFIX" "1" "May 2021" "" ""
        +.TH "NPM\-PREFIX" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-prefix\fR \- Display prefix
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-profile.1 b/deps/npm/man/man1/npm-profile.1
        index 6e9bf429a0ed61..ec658fd327b472 100644
        --- a/deps/npm/man/man1/npm-profile.1
        +++ b/deps/npm/man/man1/npm-profile.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PROFILE" "1" "May 2021" "" ""
        +.TH "NPM\-PROFILE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-profile\fR \- Change settings on your registry profile
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1
        index 39a186810d4ca4..4c599a58ce31b6 100644
        --- a/deps/npm/man/man1/npm-prune.1
        +++ b/deps/npm/man/man1/npm-prune.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PRUNE" "1" "May 2021" "" ""
        +.TH "NPM\-PRUNE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-prune\fR \- Remove extraneous packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1
        index bb619a2249c788..ad6a10cd38956d 100644
        --- a/deps/npm/man/man1/npm-publish.1
        +++ b/deps/npm/man/man1/npm-publish.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-PUBLISH" "1" "May 2021" "" ""
        +.TH "NPM\-PUBLISH" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-publish\fR \- Publish a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1
        index 8d065b423b78fc..ee52e5b1a114b6 100644
        --- a/deps/npm/man/man1/npm-rebuild.1
        +++ b/deps/npm/man/man1/npm-rebuild.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-REBUILD" "1" "May 2021" "" ""
        +.TH "NPM\-REBUILD" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-rebuild\fR \- Rebuild a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1
        index 3273f89d145a99..d251b87e074bce 100644
        --- a/deps/npm/man/man1/npm-repo.1
        +++ b/deps/npm/man/man1/npm-repo.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-REPO" "1" "May 2021" "" ""
        +.TH "NPM\-REPO" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-repo\fR \- Open package repository page in the browser
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1
        index cae1f9946ec25b..80bd67acff2141 100644
        --- a/deps/npm/man/man1/npm-restart.1
        +++ b/deps/npm/man/man1/npm-restart.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-RESTART" "1" "May 2021" "" ""
        +.TH "NPM\-RESTART" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-restart\fR \- Restart a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1
        index 267d18c69d4c73..6ff177e7f725e8 100644
        --- a/deps/npm/man/man1/npm-root.1
        +++ b/deps/npm/man/man1/npm-root.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-ROOT" "1" "May 2021" "" ""
        +.TH "NPM\-ROOT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-root\fR \- Display npm root
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1
        index 9168963943161c..a38b2a3937d388 100644
        --- a/deps/npm/man/man1/npm-run-script.1
        +++ b/deps/npm/man/man1/npm-run-script.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-RUN\-SCRIPT" "1" "May 2021" "" ""
        +.TH "NPM\-RUN\-SCRIPT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-run-script\fR \- Run arbitrary package scripts
         .SS Synopsis
        @@ -74,11 +74,7 @@ can use the \fBINIT_CWD\fP environment variable, which holds the full path you
         were in when you ran \fBnpm run\fP\|\.
         .P
         \fBnpm run\fP sets the \fBNODE\fP environment variable to the \fBnode\fP executable
        -with which \fBnpm\fP is executed\. Also, if the \fB\-\-scripts\-prepend\-node\-path\fP is
        -passed, the directory within which \fBnode\fP resides is added to the \fBPATH\fP\|\.
        -If \fB\-\-scripts\-prepend\-node\-path=auto\fP is passed (which has been the default
        -in \fBnpm\fP v3), this is only performed when that \fBnode\fP executable is not
        -found in the \fBPATH\fP\|\.
        +with which \fBnpm\fP is executed\.
         .P
         If you try to run a script without having a \fBnode_modules\fP directory and it
         fails, you will be given a warning to run \fBnpm install\fP, just in case you've
        diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1
        index f383ff56145cfc..1373531e8581ba 100644
        --- a/deps/npm/man/man1/npm-search.1
        +++ b/deps/npm/man/man1/npm-search.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-SEARCH" "1" "May 2021" "" ""
        +.TH "NPM\-SEARCH" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-search\fR \- Search for packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-set-script.1 b/deps/npm/man/man1/npm-set-script.1
        index 2a9c3e3f1425e7..5bec7da19283c7 100644
        --- a/deps/npm/man/man1/npm-set-script.1
        +++ b/deps/npm/man/man1/npm-set-script.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-SET\-SCRIPT" "1" "May 2021" "" ""
        +.TH "NPM\-SET\-SCRIPT" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-set-script\fR \- Set tasks in the scripts section of package\.json
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1
        index a57ffb18187c21..a7d3ac992605db 100644
        --- a/deps/npm/man/man1/npm-shrinkwrap.1
        +++ b/deps/npm/man/man1/npm-shrinkwrap.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-SHRINKWRAP" "1" "May 2021" "" ""
        +.TH "NPM\-SHRINKWRAP" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-shrinkwrap\fR \- Lock down dependency versions for publication
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1
        index ab2c3c1f6c9222..7fdba87d1749a6 100644
        --- a/deps/npm/man/man1/npm-star.1
        +++ b/deps/npm/man/man1/npm-star.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-STAR" "1" "May 2021" "" ""
        +.TH "NPM\-STAR" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-star\fR \- Mark your favorite packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1
        index 5255f99033bfb5..cf3bf307ccf14a 100644
        --- a/deps/npm/man/man1/npm-stars.1
        +++ b/deps/npm/man/man1/npm-stars.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-STARS" "1" "May 2021" "" ""
        +.TH "NPM\-STARS" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-stars\fR \- View packages marked as favorites
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1
        index 2fecb53f87dc15..7f958afc6b272a 100644
        --- a/deps/npm/man/man1/npm-start.1
        +++ b/deps/npm/man/man1/npm-start.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-START" "1" "May 2021" "" ""
        +.TH "NPM\-START" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-start\fR \- Start a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1
        index 56f89c9285e723..161a6062c7fb6d 100644
        --- a/deps/npm/man/man1/npm-stop.1
        +++ b/deps/npm/man/man1/npm-stop.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-STOP" "1" "May 2021" "" ""
        +.TH "NPM\-STOP" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-stop\fR \- Stop a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1
        index 834d5d1ae376e0..fadd28e5284f49 100644
        --- a/deps/npm/man/man1/npm-team.1
        +++ b/deps/npm/man/man1/npm-team.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-TEAM" "1" "May 2021" "" ""
        +.TH "NPM\-TEAM" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-team\fR \- Manage organization teams and team memberships
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1
        index bb9436cfe5b9db..431e3ac85c8a49 100644
        --- a/deps/npm/man/man1/npm-test.1
        +++ b/deps/npm/man/man1/npm-test.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-TEST" "1" "May 2021" "" ""
        +.TH "NPM\-TEST" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-test\fR \- Test a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1
        index a86dd41e83ed02..623963089fd3ee 100644
        --- a/deps/npm/man/man1/npm-token.1
        +++ b/deps/npm/man/man1/npm-token.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-TOKEN" "1" "May 2021" "" ""
        +.TH "NPM\-TOKEN" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-token\fR \- Manage your authentication tokens
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1
        index d5f8c66d0483e1..0e11d67d5cb9f4 100644
        --- a/deps/npm/man/man1/npm-uninstall.1
        +++ b/deps/npm/man/man1/npm-uninstall.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-UNINSTALL" "1" "May 2021" "" ""
        +.TH "NPM\-UNINSTALL" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-uninstall\fR \- Remove a package
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1
        index e30a2a5aef5b8d..dbabcca7ce83ff 100644
        --- a/deps/npm/man/man1/npm-unpublish.1
        +++ b/deps/npm/man/man1/npm-unpublish.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-UNPUBLISH" "1" "May 2021" "" ""
        +.TH "NPM\-UNPUBLISH" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-unpublish\fR \- Remove a package from the registry
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-unstar.1 b/deps/npm/man/man1/npm-unstar.1
        index 90a28b2ca6ad25..24fbacccb75fad 100644
        --- a/deps/npm/man/man1/npm-unstar.1
        +++ b/deps/npm/man/man1/npm-unstar.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-UNSTAR" "1" "May 2021" "" ""
        +.TH "NPM\-UNSTAR" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-unstar\fR \- Remove an item from your favorite packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1
        index 09d5239f41c641..965869d3f8017d 100644
        --- a/deps/npm/man/man1/npm-update.1
        +++ b/deps/npm/man/man1/npm-update.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-UPDATE" "1" "May 2021" "" ""
        +.TH "NPM\-UPDATE" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-update\fR \- Update packages
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1
        index 148e89566d4790..a44af8a8c458fd 100644
        --- a/deps/npm/man/man1/npm-version.1
        +++ b/deps/npm/man/man1/npm-version.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-VERSION" "1" "May 2021" "" ""
        +.TH "NPM\-VERSION" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-version\fR \- Bump a package version
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1
        index f4d9be336323b0..aad352a7ab344e 100644
        --- a/deps/npm/man/man1/npm-view.1
        +++ b/deps/npm/man/man1/npm-view.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-VIEW" "1" "May 2021" "" ""
        +.TH "NPM\-VIEW" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-view\fR \- View registry info
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1
        index dd54af967863ee..34ea971dea80b2 100644
        --- a/deps/npm/man/man1/npm-whoami.1
        +++ b/deps/npm/man/man1/npm-whoami.1
        @@ -1,4 +1,4 @@
        -.TH "NPM\-WHOAMI" "1" "May 2021" "" ""
        +.TH "NPM\-WHOAMI" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-whoami\fR \- Display npm username
         .SS Synopsis
        diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1
        index ab9917f1d68947..fd5e1dba6c0858 100644
        --- a/deps/npm/man/man1/npm.1
        +++ b/deps/npm/man/man1/npm.1
        @@ -1,4 +1,4 @@
        -.TH "NPM" "1" "May 2021" "" ""
        +.TH "NPM" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpm\fR \- javascript package manager
         .SS Synopsis
        @@ -10,7 +10,7 @@ npm  [args]
         .RE
         .SS Version
         .P
        -7\.14\.0
        +7\.16\.0
         .SS Description
         .P
         npm is the package manager for the Node JavaScript platform\.  It puts
        @@ -56,10 +56,8 @@ requires compiling of C++ Code, npm will use
         node\-gyp \fIhttps://github\.com/nodejs/node\-gyp\fR for that task\.
         For a Unix system, node\-gyp \fIhttps://github\.com/nodejs/node\-gyp\fR
         needs Python, make and a buildchain like GCC\. On Windows,
        -Python and Microsoft Visual Studio C++ are needed\. Python 3 is
        -not supported by node\-gyp \fIhttps://github\.com/nodejs/node\-gyp\fR\|\.
        -For more information visit
        -the node\-gyp repository \fIhttps://github\.com/nodejs/node\-gyp\fR and
        +Python and Microsoft Visual Studio C++ are needed\. For more information
        +visit the node\-gyp repository \fIhttps://github\.com/nodejs/node\-gyp\fR and
         the node\-gyp Wiki \fIhttps://github\.com/nodejs/node\-gyp/wiki\fR\|\.
         .SS Directories
         .P
        diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1
        index 76305688fb0e73..234f7467879622 100644
        --- a/deps/npm/man/man1/npx.1
        +++ b/deps/npm/man/man1/npx.1
        @@ -1,4 +1,4 @@
        -.TH "NPX" "1" "May 2021" "" ""
        +.TH "NPX" "1" "June 2021" "" ""
         .SH "NAME"
         \fBnpx\fR \- Run a command from a local or remote npm package
         .SS Synopsis
        diff --git a/deps/npm/man/man5/folders.5 b/deps/npm/man/man5/folders.5
        index ccf0c4f6e8f17a..3360a8410e1303 100644
        --- a/deps/npm/man/man5/folders.5
        +++ b/deps/npm/man/man5/folders.5
        @@ -1,4 +1,4 @@
        -.TH "FOLDERS" "5" "May 2021" "" ""
        +.TH "FOLDERS" "5" "June 2021" "" ""
         .SH "NAME"
         \fBfolders\fR \- Folder Structures Used by npm
         .SS Description
        diff --git a/deps/npm/man/man5/install.5 b/deps/npm/man/man5/install.5
        index 5fc6f442a92268..3d2db70800d0bb 100644
        --- a/deps/npm/man/man5/install.5
        +++ b/deps/npm/man/man5/install.5
        @@ -1,4 +1,4 @@
        -.TH "INSTALL" "5" "May 2021" "" ""
        +.TH "INSTALL" "5" "June 2021" "" ""
         .SH "NAME"
         \fBinstall\fR \- Download and install node and npm
         .SS Description
        diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5
        index 2fdbdd139a9f82..c2122976c3b89e 100644
        --- a/deps/npm/man/man5/npm-shrinkwrap-json.5
        +++ b/deps/npm/man/man5/npm-shrinkwrap-json.5
        @@ -1,4 +1,4 @@
        -.TH "NPM\-SHRINKWRAP\.JSON" "5" "May 2021" "" ""
        +.TH "NPM\-SHRINKWRAP\.JSON" "5" "June 2021" "" ""
         .SH "NAME"
         \fBnpm-shrinkwrap.json\fR \- A publishable lockfile
         .SS Description
        diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5
        index 1ecd71ff214540..2f01620f99d5b1 100644
        --- a/deps/npm/man/man5/npmrc.5
        +++ b/deps/npm/man/man5/npmrc.5
        @@ -1,4 +1,4 @@
        -.TH "NPMRC" "5" "May 2021" "" ""
        +.TH "NPMRC" "5" "June 2021" "" ""
         .SH "NAME"
         \fBnpmrc\fR \- The npm config files
         .SS Description
        diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5
        index 8b5b12e03829a6..cb8a99e04123d9 100644
        --- a/deps/npm/man/man5/package-json.5
        +++ b/deps/npm/man/man5/package-json.5
        @@ -1,4 +1,4 @@
        -.TH "PACKAGE\.JSON" "5" "May 2021" "" ""
        +.TH "PACKAGE\.JSON" "5" "June 2021" "" ""
         .SH "NAME"
         \fBpackage.json\fR \- Specifics of npm's package\.json handling
         .SS Description
        diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5
        index 20bedd30009757..231093a5691e20 100644
        --- a/deps/npm/man/man5/package-lock-json.5
        +++ b/deps/npm/man/man5/package-lock-json.5
        @@ -1,4 +1,4 @@
        -.TH "PACKAGE\-LOCK\.JSON" "5" "May 2021" "" ""
        +.TH "PACKAGE\-LOCK\.JSON" "5" "June 2021" "" ""
         .SH "NAME"
         \fBpackage-lock.json\fR \- A manifestation of the manifest
         .SS Description
        @@ -35,8 +35,8 @@ files, and allowing for significant performance improvements\.
         Both of these files have the same format, and perform similar functions in
         the root of a project\.
         .P
        -The difference is that \fBpackage\-lock\.json\fP is that it cannot be published,
        -and it will be ignored if found in any place other than the root project\.
        +The difference is that \fBpackage\-lock\.json\fP cannot be published, and it will
        +be ignored if found in any place other than the root project\.
         .P
         In contrast, npm help npm\-shrinkwrap\.json allows
         publication, and defines the dependency tree from the point encountered\.
        diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7
        index c4d52469872613..43a9a41cd029c3 100644
        --- a/deps/npm/man/man7/config.7
        +++ b/deps/npm/man/man7/config.7
        @@ -1,4 +1,4 @@
        -.TH "CONFIG" "7" "May 2021" "" ""
        +.TH "CONFIG" "7" "June 2021" "" ""
         .SH "NAME"
         \fBconfig\fR \- More than you probably want to know about npm configuration
         .SS Description
        @@ -1037,6 +1037,8 @@ What level of logs to report\. On failure, \fIall\fR logs are written to
         .P
         Any logs of a higher level than the setting are shown\. The default is
         "notice"\.
        +.P
        +See also the \fBforeground\-scripts\fP config\.
         .SS \fBlogs\-max\fP
         .RS 0
         .IP \(bu 2
        diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7
        index 0935fea65f509f..61a19ab37f7b82 100644
        --- a/deps/npm/man/man7/developers.7
        +++ b/deps/npm/man/man7/developers.7
        @@ -1,4 +1,4 @@
        -.TH "DEVELOPERS" "7" "May 2021" "" ""
        +.TH "DEVELOPERS" "7" "June 2021" "" ""
         .SH "NAME"
         \fBdevelopers\fR \- Developer Guide
         .SS Description
        diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7
        index 13c9b9dbadf1c3..1d0a1cd254cf97 100644
        --- a/deps/npm/man/man7/orgs.7
        +++ b/deps/npm/man/man7/orgs.7
        @@ -1,4 +1,4 @@
        -.TH "ORGS" "7" "May 2021" "" ""
        +.TH "ORGS" "7" "June 2021" "" ""
         .SH "NAME"
         \fBorgs\fR \- Working with Teams & Orgs
         .SS Description
        diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7
        index 941a1450073139..becb565a7980fd 100644
        --- a/deps/npm/man/man7/registry.7
        +++ b/deps/npm/man/man7/registry.7
        @@ -1,4 +1,4 @@
        -.TH "REGISTRY" "7" "May 2021" "" ""
        +.TH "REGISTRY" "7" "June 2021" "" ""
         .SH "NAME"
         \fBregistry\fR \- The JavaScript Package Registry
         .SS Description
        diff --git a/deps/npm/man/man7/removal.7 b/deps/npm/man/man7/removal.7
        index ead032bfdf457d..ea41c7b1338411 100644
        --- a/deps/npm/man/man7/removal.7
        +++ b/deps/npm/man/man7/removal.7
        @@ -1,4 +1,4 @@
        -.TH "REMOVAL" "7" "May 2021" "" ""
        +.TH "REMOVAL" "7" "June 2021" "" ""
         .SH "NAME"
         \fBremoval\fR \- Cleaning the Slate
         .SS Synopsis
        diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7
        index 716946d732afb7..29a64a498293a4 100644
        --- a/deps/npm/man/man7/scope.7
        +++ b/deps/npm/man/man7/scope.7
        @@ -1,4 +1,4 @@
        -.TH "SCOPE" "7" "May 2021" "" ""
        +.TH "SCOPE" "7" "June 2021" "" ""
         .SH "NAME"
         \fBscope\fR \- Scoped packages
         .SS Description
        diff --git a/deps/npm/man/man7/scripts.7 b/deps/npm/man/man7/scripts.7
        index 63ebce805b4d8f..adef22da5ebc94 100644
        --- a/deps/npm/man/man7/scripts.7
        +++ b/deps/npm/man/man7/scripts.7
        @@ -1,4 +1,4 @@
        -.TH "SCRIPTS" "7" "May 2021" "" ""
        +.TH "SCRIPTS" "7" "June 2021" "" ""
         .SH "NAME"
         \fBscripts\fR \- How npm handles the "scripts" field
         .SS Description
        @@ -394,7 +394,7 @@ For example, if your package\.json contains this:
         {
           "scripts" : {
             "install" : "scripts/install\.js",
        -    "postinstall" : "scripts/postinstall\.js",
        +    "postinstall" : "scripts/install\.js",
             "uninstall" : "scripts/uninstall\.js"
           }
         }
        diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7
        index dbb63528d6da75..9da673cb142463 100644
        --- a/deps/npm/man/man7/workspaces.7
        +++ b/deps/npm/man/man7/workspaces.7
        @@ -1,4 +1,4 @@
        -.TH "WORKSPACES" "7" "May 2021" "" ""
        +.TH "WORKSPACES" "7" "June 2021" "" ""
         .SH "NAME"
         \fBworkspaces\fR \- Working with workspaces
         .SS Description
        diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js
        index 842996ba486690..dac7c81f8ecfbf 100644
        --- a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js
        +++ b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js
        @@ -110,16 +110,32 @@ const getAction = ({actual, ideal}) => {
           if (ideal.isRoot && actual.isRoot)
             return null
         
        +  // if the versions don't match, it's a change no matter what
        +  if (ideal.version !== actual.version)
        +    return 'CHANGE'
        +
           const binsExist = ideal.binPaths.every((path) => existsSync(path))
         
           // top nodes, links, and git deps won't have integrity, but do have resolved
        -  if (!ideal.integrity && !actual.integrity && ideal.resolved === actual.resolved && binsExist)
        +  // if neither node has integrity, the bins exist, and either (a) neither
        +  // node has a resolved value or (b) they both do and match, then we can
        +  // leave this one alone since we already know the versions match due to
        +  // the condition above.  The "neither has resolved" case (a) cannot be
        +  // treated as a 'mark CHANGE and refetch', because shrinkwraps, bundles,
        +  // and link deps may lack this information, and we don't want to try to
        +  // go to the registry for something that isn't there.
        +  const noIntegrity = !ideal.integrity && !actual.integrity
        +  const noResolved = !ideal.resolved && !actual.resolved
        +  const resolvedMatch = ideal.resolved && ideal.resolved === actual.resolved
        +  if (noIntegrity && binsExist && (resolvedMatch || noResolved))
             return null
         
           // otherwise, verify that it's the same bits
           // note that if ideal has integrity, and resolved doesn't, we treat
           // that as a 'change', so that it gets re-fetched and locked down.
        -  if (!ideal.integrity || !actual.integrity || !ssri.parse(ideal.integrity).match(actual.integrity) || !binsExist)
        +  const integrityMismatch = !ideal.integrity || !actual.integrity ||
        +    !ssri.parse(ideal.integrity).match(actual.integrity)
        +  if (integrityMismatch || !binsExist)
             return 'CHANGE'
         
           return null
        diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js
        index cff9f09633dfce..0a19ef93005add 100644
        --- a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js
        +++ b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js
        @@ -714,6 +714,7 @@ class Shrinkwrap {
                 resolved,
                 integrity,
                 hasShrinkwrap,
        +        version,
               } = this.get(node.path)
         
               const pathFixed = !resolved ? null
        @@ -727,8 +728,12 @@ class Shrinkwrap {
                 node.resolved === pathFixed
               const integrityOk = !integrity || !node.integrity ||
                 node.integrity === integrity
        +      const versionOk = !version || !node.version || version === node.version
         
        -      if ((resolved || integrity) && resolvedOk && integrityOk) {
        +      const allOk = (resolved || integrity || version) &&
        +        resolvedOk && integrityOk && versionOk
        +
        +      if (allOk) {
                 node.resolved = node.resolved || pathFixed || null
                 node.integrity = node.integrity || integrity || null
                 node.hasShrinkwrap = node.hasShrinkwrap || hasShrinkwrap || false
        diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json
        index 8500eaadf6752e..7c2622f49e93e7 100644
        --- a/deps/npm/node_modules/@npmcli/arborist/package.json
        +++ b/deps/npm/node_modules/@npmcli/arborist/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "@npmcli/arborist",
        -  "version": "2.6.0",
        +  "version": "2.6.2",
           "description": "Manage node_modules trees",
           "dependencies": {
             "@npmcli/installed-package-contents": "^1.0.7",
        @@ -19,7 +19,7 @@
             "npm-install-checks": "^4.0.0",
             "npm-package-arg": "^8.1.0",
             "npm-pick-manifest": "^6.1.0",
        -    "npm-registry-fetch": "^10.0.0",
        +    "npm-registry-fetch": "^11.0.0",
             "pacote": "^11.2.6",
             "parse-conflict-json": "^1.1.1",
             "promise-all-reject-late": "^1.0.0",
        diff --git a/deps/npm/node_modules/cacache/README.md b/deps/npm/node_modules/cacache/README.md
        index 0c315595abd343..6dc11babfa62ab 100644
        --- a/deps/npm/node_modules/cacache/README.md
        +++ b/deps/npm/node_modules/cacache/README.md
        @@ -458,13 +458,17 @@ cacache.rm.all(cachePath).then(() => {
         })
         ```
         
        -####  `> cacache.rm.entry(cache, key) -> Promise`
        +####  `> cacache.rm.entry(cache, key, [opts]) -> Promise`
         
         Alias: `cacache.rm`
         
         Removes the index entry for `key`. Content will still be accessible if
         requested directly by content address ([`get.stream.byDigest`](#get-stream)).
         
        +By default, this appends a new entry to the index with an integrity of `null`.
        +If `opts.removeFully` is set to `true` then the index file itself will be
        +physically deleted rather than appending a `null`.
        +
         To remove the content itself (which might still be used by other entries), use
         [`rm.content`](#rm-content). Or, to safely vacuum any unused content, use
         [`verify`](#verify).
        @@ -491,12 +495,21 @@ cacache.rm.content(cachePath, 'sha512-SoMeDIGest/IN+BaSE64==').then(() => {
         })
         ```
         
        -####  `> cacache.index.compact(cache, key, matchFn) -> Promise`
        +####  `> cacache.index.compact(cache, key, matchFn, [opts]) -> Promise`
         
         Uses `matchFn`, which must be a synchronous function that accepts two entries
         and returns a boolean indicating whether or not the two entries match, to
         deduplicate all entries in the cache for the given `key`.
         
        +If `opts.validateEntry` is provided, it will be called as a function with the
        +only parameter being a single index entry. The function must return a Boolean,
        +if it returns `true` the entry is considered valid and will be kept in the index,
        +if it returns `false` the entry will be removed from the index.
        +
        +If `opts.validateEntry` is not provided, however, every entry in the index will
        +be deduplicated and kept until the first `null` integrity is reached, removing
        +all entries that were written before the `null`.
        +
         The deduplicated list of entries is both written to the index, replacing the
         existing content, and returned in the Promise.
         
        diff --git a/deps/npm/node_modules/cacache/get.js b/deps/npm/node_modules/cacache/get.js
        index b6bae1e504eba2..fe710bbd68def3 100644
        --- a/deps/npm/node_modules/cacache/get.js
        +++ b/deps/npm/node_modules/cacache/get.js
        @@ -32,18 +32,18 @@ function getData (byDigest, cache, key, opts = {}) {
                   metadata: memoized.entry.metadata,
                   data: memoized.data,
                   integrity: memoized.entry.integrity,
        -          size: memoized.entry.size
        +          size: memoized.entry.size,
                 }
             )
           }
           return (byDigest ? Promise.resolve(null) : index.find(cache, key, opts)).then(
             (entry) => {
        -      if (!entry && !byDigest) {
        +      if (!entry && !byDigest)
                 throw new index.NotFoundError(cache, key)
        -      }
        +
               return read(cache, byDigest ? key : entry.integrity, {
                 integrity,
        -        size
        +        size,
               })
                 .then((data) =>
                   byDigest
        @@ -52,15 +52,15 @@ function getData (byDigest, cache, key, opts = {}) {
                       data,
                       metadata: entry.metadata,
                       size: entry.size,
        -              integrity: entry.integrity
        +              integrity: entry.integrity,
                     }
                 )
                 .then((res) => {
        -          if (memoize && byDigest) {
        +          if (memoize && byDigest)
                     memo.put.byDigest(cache, key, res, opts)
        -          } else if (memoize) {
        +          else if (memoize)
                     memo.put(cache, entry, res.data, opts)
        -          }
        +
                   return res
                 })
             }
        @@ -86,16 +86,16 @@ function getDataSync (byDigest, cache, key, opts = {}) {
                 metadata: memoized.entry.metadata,
                 data: memoized.data,
                 integrity: memoized.entry.integrity,
        -        size: memoized.entry.size
        +        size: memoized.entry.size,
               }
           }
           const entry = !byDigest && index.find.sync(cache, key, opts)
        -  if (!entry && !byDigest) {
        +  if (!entry && !byDigest)
             throw new index.NotFoundError(cache, key)
        -  }
        +
           const data = read.sync(cache, byDigest ? key : entry.integrity, {
             integrity: integrity,
        -    size: size
        +    size: size,
           })
           const res = byDigest
             ? data
        @@ -103,13 +103,13 @@ function getDataSync (byDigest, cache, key, opts = {}) {
               metadata: entry.metadata,
               data: data,
               size: entry.size,
        -      integrity: entry.integrity
        +      integrity: entry.integrity,
             }
        -  if (memoize && byDigest) {
        +  if (memoize && byDigest)
             memo.put.byDigest(cache, key, res, opts)
        -  } else if (memoize) {
        +  else if (memoize)
             memo.put(cache, entry, res.data, opts)
        -  }
        +
           return res
         }
         
        @@ -129,17 +129,16 @@ const getMemoizedStream = (memoized) => {
         function getStream (cache, key, opts = {}) {
           const { memoize, size } = opts
           const memoized = memo.get(cache, key, opts)
        -  if (memoized && memoize !== false) {
        +  if (memoized && memoize !== false)
             return getMemoizedStream(memoized)
        -  }
         
           const stream = new Pipeline()
           index
             .find(cache, key)
             .then((entry) => {
        -      if (!entry) {
        +      if (!entry)
                 throw new index.NotFoundError(cache, key)
        -      }
        +
               stream.emit('metadata', entry.metadata)
               stream.emit('integrity', entry.integrity)
               stream.emit('size', entry.size)
        @@ -178,9 +177,9 @@ function getStreamDigest (cache, integrity, opts = {}) {
             return stream
           } else {
             const stream = read.readStream(cache, integrity, opts)
        -    if (!memoize) {
        +    if (!memoize)
               return stream
        -    }
        +
             const memoStream = new Collect.PassThrough()
             memoStream.on('collect', data => memo.put.byDigest(
               cache,
        @@ -197,11 +196,10 @@ module.exports.info = info
         function info (cache, key, opts = {}) {
           const { memoize } = opts
           const memoized = memo.get(cache, key, opts)
        -  if (memoized && memoize !== false) {
        +  if (memoized && memoize !== false)
             return Promise.resolve(memoized.entry)
        -  } else {
        +  else
             return index.find(cache, key)
        -  }
         }
         
         module.exports.hasContent = read.hasContent
        @@ -224,9 +222,9 @@ function copy (byDigest, cache, key, dest, opts = {}) {
               ? Promise.resolve(null)
               : index.find(cache, key, opts)
             ).then((entry) => {
        -      if (!entry && !byDigest) {
        +      if (!entry && !byDigest)
                 throw new index.NotFoundError(cache, key)
        -      }
        +
               return read
                 .copy(cache, byDigest ? key : entry.integrity, dest, opts)
                 .then(() => {
        @@ -235,7 +233,7 @@ function copy (byDigest, cache, key, dest, opts = {}) {
                     : {
                       metadata: entry.metadata,
                       size: entry.size,
        -              integrity: entry.integrity
        +              integrity: entry.integrity,
                     }
                 })
             })
        @@ -248,7 +246,7 @@ function copy (byDigest, cache, key, dest, opts = {}) {
                 : {
                   metadata: res.metadata,
                   size: res.size,
        -          integrity: res.integrity
        +          integrity: res.integrity,
                 }
             })
           })
        diff --git a/deps/npm/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/cacache/lib/content/read.js
        index 7cc16482d44c8f..034e8eee05b101 100644
        --- a/deps/npm/node_modules/cacache/lib/content/read.js
        +++ b/deps/npm/node_modules/cacache/lib/content/read.js
        @@ -20,17 +20,16 @@ function read (cache, integrity, opts = {}) {
             // get size
             return lstat(cpath).then(stat => ({ stat, cpath, sri }))
           }).then(({ stat, cpath, sri }) => {
        -    if (typeof size === 'number' && stat.size !== size) {
        +    if (typeof size === 'number' && stat.size !== size)
               throw sizeError(size, stat.size)
        -    }
        -    if (stat.size > MAX_SINGLE_READ_SIZE) {
        +
        +    if (stat.size > MAX_SINGLE_READ_SIZE)
               return readPipeline(cpath, stat.size, sri, new Pipeline()).concat()
        -    }
         
             return readFile(cpath, null).then((data) => {
        -      if (!ssri.checkData(data, sri)) {
        +      if (!ssri.checkData(data, sri))
                 throw integrityError(sri, cpath)
        -      }
        +
               return data
             })
           })
        @@ -40,11 +39,11 @@ const readPipeline = (cpath, size, sri, stream) => {
           stream.push(
             new fsm.ReadStream(cpath, {
               size,
        -      readSize: MAX_SINGLE_READ_SIZE
        +      readSize: MAX_SINGLE_READ_SIZE,
             }),
             ssri.integrityStream({
               integrity: sri,
        -      size
        +      size,
             })
           )
           return stream
        @@ -56,13 +55,11 @@ function readSync (cache, integrity, opts = {}) {
           const { size } = opts
           return withContentSriSync(cache, integrity, (cpath, sri) => {
             const data = fs.readFileSync(cpath)
        -    if (typeof size === 'number' && size !== data.length) {
        +    if (typeof size === 'number' && size !== data.length)
               throw sizeError(size, data.length)
        -    }
         
        -    if (ssri.checkData(data, sri)) {
        +    if (ssri.checkData(data, sri))
               return data
        -    }
         
             throw integrityError(sri, cpath)
           })
        @@ -78,9 +75,9 @@ function readStream (cache, integrity, opts = {}) {
             // just lstat to ensure it exists
             return lstat(cpath).then((stat) => ({ stat, cpath, sri }))
           }).then(({ stat, cpath, sri }) => {
        -    if (typeof size === 'number' && size !== stat.size) {
        +    if (typeof size === 'number' && size !== stat.size)
               return stream.emit('error', sizeError(size, stat.size))
        -    }
        +
             readPipeline(cpath, stat.size, sri, stream)
           }, er => stream.emit('error', er))
         
        @@ -109,22 +106,21 @@ function copySync (cache, integrity, dest) {
         module.exports.hasContent = hasContent
         
         function hasContent (cache, integrity) {
        -  if (!integrity) {
        +  if (!integrity)
             return Promise.resolve(false)
        -  }
        +
           return withContentSri(cache, integrity, (cpath, sri) => {
             return lstat(cpath).then((stat) => ({ size: stat.size, sri, stat }))
           }).catch((err) => {
        -    if (err.code === 'ENOENT') {
        +    if (err.code === 'ENOENT')
               return false
        -    }
        +
             if (err.code === 'EPERM') {
               /* istanbul ignore else */
        -      if (process.platform !== 'win32') {
        +      if (process.platform !== 'win32')
                 throw err
        -      } else {
        +      else
                 return false
        -      }
             }
           })
         }
        @@ -132,24 +128,23 @@ function hasContent (cache, integrity) {
         module.exports.hasContent.sync = hasContentSync
         
         function hasContentSync (cache, integrity) {
        -  if (!integrity) {
        +  if (!integrity)
             return false
        -  }
        +
           return withContentSriSync(cache, integrity, (cpath, sri) => {
             try {
               const stat = fs.lstatSync(cpath)
               return { size: stat.size, sri, stat }
             } catch (err) {
        -      if (err.code === 'ENOENT') {
        +      if (err.code === 'ENOENT')
                 return false
        -      }
        +
               if (err.code === 'EPERM') {
                 /* istanbul ignore else */
        -        if (process.platform !== 'win32') {
        +        if (process.platform !== 'win32')
                   throw err
        -        } else {
        +        else
                   return false
        -        }
               }
             }
           })
        @@ -167,7 +162,8 @@ function withContentSri (cache, integrity, fn) {
               const cpath = contentPath(cache, digests[0])
               return fn(cpath, digests[0])
             } else {
        -      // Can't use race here because a generic error can happen before a ENOENT error, and can happen before a valid result
        +      // Can't use race here because a generic error can happen before
        +      // a ENOENT error, and can happen before a valid result
               return Promise
                 .all(digests.map((meta) => {
                   return withContentSri(cache, meta, fn)
        @@ -184,15 +180,13 @@ function withContentSri (cache, integrity, fn) {
                 .then((results) => {
                   // Return the first non error if it is found
                   const result = results.find((r) => !(r instanceof Error))
        -          if (result) {
        +          if (result)
                     return result
        -          }
         
                   // Throw the No matching content found error
                   const enoentError = results.find((r) => r.code === 'ENOENT')
        -          if (enoentError) {
        +          if (enoentError)
                     throw enoentError
        -          }
         
                   // Throw generic error
                   throw results.find((r) => r instanceof Error)
        diff --git a/deps/npm/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/cacache/lib/content/rm.js
        index 50612364e9b48a..6a3d1a3d023406 100644
        --- a/deps/npm/node_modules/cacache/lib/content/rm.js
        +++ b/deps/npm/node_modules/cacache/lib/content/rm.js
        @@ -11,10 +11,9 @@ module.exports = rm
         function rm (cache, integrity) {
           return hasContent(cache, integrity).then((content) => {
             // ~pretty~ sure we can't end up with a content lacking sri, but be safe
        -    if (content && content.sri) {
        +    if (content && content.sri)
               return rimraf(contentPath(cache, content.sri)).then(() => true)
        -    } else {
        +    else
               return false
        -    }
           })
         }
        diff --git a/deps/npm/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/cacache/lib/content/write.js
        index e8f3e3534940ca..dde1bd1dd5daef 100644
        --- a/deps/npm/node_modules/cacache/lib/content/write.js
        +++ b/deps/npm/node_modules/cacache/lib/content/write.js
        @@ -22,16 +22,15 @@ module.exports = write
         
         function write (cache, data, opts = {}) {
           const { algorithms, size, integrity } = opts
        -  if (algorithms && algorithms.length > 1) {
        +  if (algorithms && algorithms.length > 1)
             throw new Error('opts.algorithms only supports a single algorithm for now')
        -  }
        -  if (typeof size === 'number' && data.length !== size) {
        +
        +  if (typeof size === 'number' && data.length !== size)
             return Promise.reject(sizeError(size, data.length))
        -  }
        +
           const sri = ssri.fromData(data, algorithms ? { algorithms } : {})
        -  if (integrity && !ssri.checkData(data, integrity, opts)) {
        +  if (integrity && !ssri.checkData(data, integrity, opts))
             return Promise.reject(checksumError(integrity, sri))
        -  }
         
           return disposer(makeTmp(cache, opts), makeTmpDisposer,
             (tmp) => {
        @@ -112,13 +111,17 @@ function pipeToTmp (inputStream, cache, tmpTarget, opts) {
           const hashStream = ssri.integrityStream({
             integrity: opts.integrity,
             algorithms: opts.algorithms,
        -    size: opts.size
        +    size: opts.size,
        +  })
        +  hashStream.on('integrity', i => {
        +    integrity = i
        +  })
        +  hashStream.on('size', s => {
        +    size = s
           })
        -  hashStream.on('integrity', i => { integrity = i })
        -  hashStream.on('size', s => { size = s })
         
           const outStream = new fsm.WriteStream(tmpTarget, {
        -    flags: 'wx'
        +    flags: 'wx',
           })
         
           // NB: this can throw if the hashStream has a problem with
        @@ -132,21 +135,23 @@ function pipeToTmp (inputStream, cache, tmpTarget, opts) {
         
           return pipeline.promise()
             .then(() => ({ integrity, size }))
        -    .catch(er => rimraf(tmpTarget).then(() => { throw er }))
        +    .catch(er => rimraf(tmpTarget).then(() => {
        +      throw er
        +    }))
         }
         
         function makeTmp (cache, opts) {
           const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix)
           return fixOwner.mkdirfix(cache, path.dirname(tmpTarget)).then(() => ({
             target: tmpTarget,
        -    moved: false
        +    moved: false,
           }))
         }
         
         function makeTmpDisposer (tmp) {
        -  if (tmp.moved) {
        +  if (tmp.moved)
             return Promise.resolve()
        -  }
        +
           return rimraf(tmp.target)
         }
         
        diff --git a/deps/npm/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/cacache/lib/entry-index.js
        index 8827ebb541b2dc..71aac5ed75b146 100644
        --- a/deps/npm/node_modules/cacache/lib/entry-index.js
        +++ b/deps/npm/node_modules/cacache/lib/entry-index.js
        @@ -14,7 +14,9 @@ const fixOwner = require('./util/fix-owner')
         const hashToSegments = require('./util/hash-to-segments')
         const indexV = require('../package.json')['cache-version'].index
         const moveFile = require('@npmcli/move-file')
        -const rimraf = util.promisify(require('rimraf'))
        +const _rimraf = require('rimraf')
        +const rimraf = util.promisify(_rimraf)
        +rimraf.sync = _rimraf.sync
         
         const appendFile = util.promisify(fs.appendFile)
         const readFile = util.promisify(fs.readFile)
        @@ -35,15 +37,30 @@ module.exports.compact = compact
         async function compact (cache, key, matchFn, opts = {}) {
           const bucket = bucketPath(cache, key)
           const entries = await bucketEntries(bucket)
        -  // reduceRight because the bottom-most result is the newest
        +  const newEntries = []
        +  // we loop backwards because the bottom-most result is the newest
           // since we add new entries with appendFile
        -  const newEntries = entries.reduceRight((acc, newEntry) => {
        -    if (!acc.find((oldEntry) => matchFn(oldEntry, newEntry))) {
        -      acc.push(newEntry)
        -    }
        -
        -    return acc
        -  }, [])
        +  for (let i = entries.length - 1; i >= 0; --i) {
        +    const entry = entries[i]
        +    // a null integrity could mean either a delete was appended
        +    // or the user has simply stored an index that does not map
        +    // to any content. we determine if the user wants to keep the
        +    // null integrity based on the validateEntry function passed in options.
        +    // if the integrity is null and no validateEntry is provided, we break
        +    // as we consider the null integrity to be a deletion of everything
        +    // that came before it.
        +    if (entry.integrity === null && !opts.validateEntry)
        +      break
        +
        +    // if this entry is valid, and it is either the first entry or
        +    // the newEntries array doesn't already include an entry that
        +    // matches this one based on the provided matchFn, then we add
        +    // it to the beginning of our list
        +    if ((!opts.validateEntry || opts.validateEntry(entry) === true) &&
        +      (newEntries.length === 0 ||
        +        !newEntries.find((oldEntry) => matchFn(oldEntry, entry))))
        +      newEntries.unshift(entry)
        +  }
         
           const newIndex = '\n' + newEntries.map((entry) => {
             const stringified = JSON.stringify(entry)
        @@ -56,14 +73,13 @@ async function compact (cache, key, matchFn, opts = {}) {
             await fixOwner.mkdirfix(cache, path.dirname(target))
             return {
               target,
        -      moved: false
        +      moved: false,
             }
           }
         
           const teardown = async (tmp) => {
        -    if (!tmp.moved) {
        +    if (!tmp.moved)
               return rimraf(tmp.target)
        -    }
           }
         
           const write = async (tmp) => {
        @@ -76,16 +92,20 @@ async function compact (cache, key, matchFn, opts = {}) {
             try {
               await fixOwner.chownr(cache, bucket)
             } catch (err) {
        -      if (err.code !== 'ENOENT') {
        +      if (err.code !== 'ENOENT')
                 throw err
        -      }
             }
           }
         
           // write the file atomically
           await disposer(setup(), teardown, write)
         
        -  return newEntries.map((entry) => formatEntry(cache, entry, true))
        +  // we reverse the list we generated such that the newest
        +  // entries come first in order to make looping through them easier
        +  // the true passed to formatEntry tells it to keep null
        +  // integrity values, if they made it this far it's because
        +  // validateEntry returned true, and as such we should return it
        +  return newEntries.reverse().map((entry) => formatEntry(cache, entry, true))
         }
         
         module.exports.insert = insert
        @@ -98,7 +118,7 @@ function insert (cache, key, integrity, opts = {}) {
             integrity: integrity && ssri.stringify(integrity),
             time: Date.now(),
             size,
        -    metadata
        +    metadata,
           }
           return fixOwner
             .mkdirfix(cache, path.dirname(bucket))
        @@ -110,14 +130,15 @@ function insert (cache, key, integrity, opts = {}) {
               // another while still preserving the string length of the JSON in
               // question. So, we just slap the length in there and verify it on read.
               //
        -      // Thanks to @isaacs for the whiteboarding session that ended up with this.
        +      // Thanks to @isaacs for the whiteboarding session that ended up with
        +      // this.
               return appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`)
             })
             .then(() => fixOwner.chownr(cache, bucket))
             .catch((err) => {
        -      if (err.code === 'ENOENT') {
        +      if (err.code === 'ENOENT')
                 return undefined
        -      }
        +
               throw err
               // There's a class of race conditions that happen when things get deleted
               // during fixOwner, or between the two mkdirfix/chownr calls.
        @@ -140,7 +161,7 @@ function insertSync (cache, key, integrity, opts = {}) {
             integrity: integrity && ssri.stringify(integrity),
             time: Date.now(),
             size,
        -    metadata
        +    metadata,
           }
           fixOwner.mkdirfix.sync(cache, path.dirname(bucket))
           const stringified = JSON.stringify(entry)
        @@ -148,9 +169,8 @@ function insertSync (cache, key, integrity, opts = {}) {
           try {
             fixOwner.chownr.sync(cache, bucket)
           } catch (err) {
        -    if (err.code !== 'ENOENT') {
        +    if (err.code !== 'ENOENT')
               throw err
        -    }
           }
           return formatEntry(cache, entry)
         }
        @@ -162,19 +182,17 @@ function find (cache, key) {
           return bucketEntries(bucket)
             .then((entries) => {
               return entries.reduce((latest, next) => {
        -        if (next && next.key === key) {
        +        if (next && next.key === key)
                   return formatEntry(cache, next)
        -        } else {
        +        else
                   return latest
        -        }
               }, null)
             })
             .catch((err) => {
        -      if (err.code === 'ENOENT') {
        +      if (err.code === 'ENOENT')
                 return null
        -      } else {
        +      else
                 throw err
        -      }
             })
         }
         
        @@ -184,31 +202,37 @@ function findSync (cache, key) {
           const bucket = bucketPath(cache, key)
           try {
             return bucketEntriesSync(bucket).reduce((latest, next) => {
        -      if (next && next.key === key) {
        +      if (next && next.key === key)
                 return formatEntry(cache, next)
        -      } else {
        +      else
                 return latest
        -      }
             }, null)
           } catch (err) {
        -    if (err.code === 'ENOENT') {
        +    if (err.code === 'ENOENT')
               return null
        -    } else {
        +    else
               throw err
        -    }
           }
         }
         
         module.exports.delete = del
         
        -function del (cache, key, opts) {
        -  return insert(cache, key, null, opts)
        +function del (cache, key, opts = {}) {
        +  if (!opts.removeFully)
        +    return insert(cache, key, null, opts)
        +
        +  const bucket = bucketPath(cache, key)
        +  return rimraf(bucket)
         }
         
         module.exports.delete.sync = delSync
         
        -function delSync (cache, key, opts) {
        -  return insertSync(cache, key, null, opts)
        +function delSync (cache, key, opts = {}) {
        +  if (!opts.removeFully)
        +    return insertSync(cache, key, null, opts)
        +
        +  const bucket = bucketPath(cache, key)
        +  return rimraf.sync(bucket)
         }
         
         module.exports.lsStream = lsStream
        @@ -239,12 +263,12 @@ function lsStream (cache) {
                         // reduced is a map of key => entry
                         for (const entry of reduced.values()) {
                           const formatted = formatEntry(cache, entry)
        -                  if (formatted) {
        +                  if (formatted)
                             stream.write(formatted)
        -                  }
                         }
                       }).catch(err => {
        -                if (err.code === 'ENOENT') { return undefined }
        +                if (err.code === 'ENOENT')
        +                  return undefined
                         throw err
                       })
                     })
        @@ -288,9 +312,9 @@ function bucketEntriesSync (bucket, filter) {
         function _bucketEntries (data, filter) {
           const entries = []
           data.split('\n').forEach((entry) => {
        -    if (!entry) {
        +    if (!entry)
               return
        -    }
        +
             const pieces = entry.split('\t')
             if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) {
               // Hash is no good! Corruption or malice? Doesn't matter!
        @@ -304,9 +328,8 @@ function _bucketEntries (data, filter) {
               // Entry is corrupted!
               return
             }
        -    if (obj) {
        +    if (obj)
               entries.push(obj)
        -    }
           })
           return entries
         }
        @@ -348,24 +371,23 @@ function hash (str, digest) {
         
         function formatEntry (cache, entry, keepAll) {
           // Treat null digests as deletions. They'll shadow any previous entries.
        -  if (!entry.integrity && !keepAll) {
        +  if (!entry.integrity && !keepAll)
             return null
        -  }
        +
           return {
             key: entry.key,
             integrity: entry.integrity,
             path: entry.integrity ? contentPath(cache, entry.integrity) : undefined,
             size: entry.size,
             time: entry.time,
        -    metadata: entry.metadata
        +    metadata: entry.metadata,
           }
         }
         
         function readdirOrEmpty (dir) {
           return readdir(dir).catch((err) => {
        -    if (err.code === 'ENOENT' || err.code === 'ENOTDIR') {
        +    if (err.code === 'ENOENT' || err.code === 'ENOTDIR')
               return []
        -    }
         
             throw err
           })
        diff --git a/deps/npm/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/cacache/lib/memoization.js
        index 185141d8eadad8..d5465f39fc581e 100644
        --- a/deps/npm/node_modules/cacache/lib/memoization.js
        +++ b/deps/npm/node_modules/cacache/lib/memoization.js
        @@ -8,7 +8,7 @@ const MAX_AGE = 3 * 60 * 1000
         const MEMOIZED = new LRU({
           max: MAX_SIZE,
           maxAge: MAX_AGE,
        -  length: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length
        +  length: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length,
         })
         
         module.exports.clearMemoized = clearMemoized
        @@ -62,13 +62,12 @@ class ObjProxy {
         }
         
         function pickMem (opts) {
        -  if (!opts || !opts.memoize) {
        +  if (!opts || !opts.memoize)
             return MEMOIZED
        -  } else if (opts.memoize.get && opts.memoize.set) {
        +  else if (opts.memoize.get && opts.memoize.set)
             return opts.memoize
        -  } else if (typeof opts.memoize === 'object') {
        +  else if (typeof opts.memoize === 'object')
             return new ObjProxy(opts.memoize)
        -  } else {
        +  else
             return MEMOIZED
        -  }
         }
        diff --git a/deps/npm/node_modules/cacache/lib/util/disposer.js b/deps/npm/node_modules/cacache/lib/util/disposer.js
        index 8a24ad2f2a2a28..aa8aed54da551d 100644
        --- a/deps/npm/node_modules/cacache/lib/util/disposer.js
        +++ b/deps/npm/node_modules/cacache/lib/util/disposer.js
        @@ -8,9 +8,9 @@ function disposer (creatorFn, disposerFn, fn) {
               .then(
                 // disposer resolved, do something with original fn's promise
                 () => {
        -          if (shouldThrow) {
        +          if (shouldThrow)
                     throw result
        -          }
        +
                   return result
                 },
                 // Disposer fn failed, crash process
        diff --git a/deps/npm/node_modules/cacache/lib/util/fix-owner.js b/deps/npm/node_modules/cacache/lib/util/fix-owner.js
        index 9afa638a8c8393..90ffece524f54b 100644
        --- a/deps/npm/node_modules/cacache/lib/util/fix-owner.js
        +++ b/deps/npm/node_modules/cacache/lib/util/fix-owner.js
        @@ -49,9 +49,8 @@ function fixOwner (cache, filepath) {
             const { uid, gid } = owner
         
             // No need to override if it's already what we used.
        -    if (self.uid === uid && self.gid === gid) {
        +    if (self.uid === uid && self.gid === gid)
               return
        -    }
         
             return inflight('fixOwner: fixing ownership on ' + filepath, () =>
               chownr(
        @@ -59,9 +58,9 @@ function fixOwner (cache, filepath) {
                 typeof uid === 'number' ? uid : self.uid,
                 typeof gid === 'number' ? gid : self.gid
               ).catch((err) => {
        -        if (err.code === 'ENOENT') {
        +        if (err.code === 'ENOENT')
                   return null
        -        }
        +
                 throw err
               })
             )
        @@ -94,9 +93,9 @@ function fixOwnerSync (cache, filepath) {
             )
           } catch (err) {
             // only catch ENOENT, any other error is a problem.
        -    if (err.code === 'ENOENT') {
        +    if (err.code === 'ENOENT')
               return null
        -    }
        +
             throw err
           }
         }
        @@ -111,14 +110,13 @@ function mkdirfix (cache, p, cb) {
           return Promise.resolve(inferOwner(cache)).then(() => {
             return mkdirp(p)
               .then((made) => {
        -        if (made) {
        +        if (made)
                   return fixOwner(cache, made).then(() => made)
        -        }
               })
               .catch((err) => {
        -        if (err.code === 'EEXIST') {
        +        if (err.code === 'EEXIST')
                   return fixOwner(cache, p).then(() => null)
        -        }
        +
                 throw err
               })
           })
        @@ -138,8 +136,7 @@ function mkdirfixSync (cache, p) {
             if (err.code === 'EEXIST') {
               fixOwnerSync(cache, p)
               return null
        -    } else {
        +    } else
               throw err
        -    }
           }
         }
        diff --git a/deps/npm/node_modules/cacache/lib/util/move-file.js b/deps/npm/node_modules/cacache/lib/util/move-file.js
        index 84130b2e9ffb82..c3f9e35eb99c77 100644
        --- a/deps/npm/node_modules/cacache/lib/util/move-file.js
        +++ b/deps/npm/node_modules/cacache/lib/util/move-file.js
        @@ -38,19 +38,17 @@ function moveFile (src, dest) {
                 } else if (err.code === 'EEXIST' || err.code === 'EBUSY') {
                   // file already exists, so whatever
                   return resolve()
        -        } else {
        +        } else
                   return reject(err)
        -        }
        -      } else {
        +      } else
                 return resolve()
        -      }
             })
           })
             .then(() => {
               // content should never change for any reason, so make it read-only
               return Promise.all([
                 unlink(src),
        -        !isWindows && chmod(dest, '0444')
        +        !isWindows && chmod(dest, '0444'),
               ])
             })
             .catch(() => {
        diff --git a/deps/npm/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/cacache/lib/verify.js
        index 5a011a3f1d2cb1..e9d679eceaf51f 100644
        --- a/deps/npm/node_modules/cacache/lib/verify.js
        +++ b/deps/npm/node_modules/cacache/lib/verify.js
        @@ -24,7 +24,7 @@ const readFile = util.promisify(fs.readFile)
         const verifyOpts = (opts) => ({
           concurrency: 20,
           log: { silly () {} },
        -  ...opts
        +  ...opts,
         })
         
         module.exports = verify
        @@ -40,7 +40,7 @@ function verify (cache, opts) {
             rebuildIndex,
             cleanTmp,
             writeVerifile,
        -    markEndTime
        +    markEndTime,
           ]
         
           return steps
        @@ -54,9 +54,9 @@ function verify (cache, opts) {
                       stats[k] = s[k]
                     })
                   const end = new Date()
        -          if (!stats.runTime) {
        +          if (!stats.runTime)
                     stats.runTime = {}
        -          }
        +
                   stats.runTime[label] = end - start
                   return Promise.resolve(stats)
                 })
        @@ -108,9 +108,9 @@ function garbageCollect (cache, opts) {
           const indexStream = index.lsStream(cache)
           const liveContent = new Set()
           indexStream.on('data', (entry) => {
        -    if (opts.filter && !opts.filter(entry)) {
        +    if (opts.filter && !opts.filter(entry))
               return
        -    }
        +
             liveContent.add(entry.integrity.toString())
           })
           return new Promise((resolve, reject) => {
        @@ -120,14 +120,14 @@ function garbageCollect (cache, opts) {
             return glob(path.join(contentDir, '**'), {
               follow: false,
               nodir: true,
        -      nosort: true
        +      nosort: true,
             }).then((files) => {
               return Promise.resolve({
                 verifiedContent: 0,
                 reclaimedCount: 0,
                 reclaimedSize: 0,
                 badContentCount: 0,
        -        keptSize: 0
        +        keptSize: 0,
               }).then((stats) =>
                 pMap(
                   files,
        @@ -171,14 +171,14 @@ function verifyContent (filepath, sri) {
             .then((s) => {
               const contentInfo = {
                 size: s.size,
        -        valid: true
        +        valid: true,
               }
               return ssri
                 .checkStream(new fsm.ReadStream(filepath), sri)
                 .catch((err) => {
        -          if (err.code !== 'EINTEGRITY') {
        +          if (err.code !== 'EINTEGRITY')
                     throw err
        -          }
        +
                   return rimraf(filepath).then(() => {
                     contentInfo.valid = false
                   })
        @@ -186,9 +186,9 @@ function verifyContent (filepath, sri) {
                 .then(() => contentInfo)
             })
             .catch((err) => {
        -      if (err.code === 'ENOENT') {
        +      if (err.code === 'ENOENT')
                 return { size: 0, valid: false }
        -      }
        +
               throw err
             })
         }
        @@ -199,7 +199,7 @@ function rebuildIndex (cache, opts) {
             const stats = {
               missingContent: 0,
               rejectedEntries: 0,
        -      totalEntries: 0
        +      totalEntries: 0,
             }
             const buckets = {}
             for (const k in entries) {
        @@ -209,9 +209,9 @@ function rebuildIndex (cache, opts) {
                 const entry = entries[k]
                 const excluded = opts.filter && !opts.filter(entry)
                 excluded && stats.rejectedEntries++
        -        if (buckets[hashed] && !excluded) {
        +        if (buckets[hashed] && !excluded)
                   buckets[hashed].push(entry)
        -        } else if (buckets[hashed] && excluded) {
        +        else if (buckets[hashed] && excluded) {
                   // skip
                 } else if (excluded) {
                   buckets[hashed] = []
        @@ -244,7 +244,7 @@ function rebuildBucket (cache, bucket, stats, opts) {
                     return index
                       .insert(cache, entry.key, entry.integrity, {
                         metadata: entry.metadata,
        -                size: entry.size
        +                size: entry.size,
                       })
                       .then(() => {
                         stats.totalEntries++
        diff --git a/deps/npm/node_modules/cacache/package.json b/deps/npm/node_modules/cacache/package.json
        index aefa5aae42585c..3c2e65c0404a0d 100644
        --- a/deps/npm/node_modules/cacache/package.json
        +++ b/deps/npm/node_modules/cacache/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "cacache",
        -  "version": "15.1.0",
        +  "version": "15.2.0",
           "cache-version": {
             "content": "2",
             "index": "5"
        @@ -13,15 +13,17 @@
           ],
           "scripts": {
             "benchmarks": "node test/benchmarks",
        -    "lint": "standard",
        -    "postrelease": "npm publish",
        -    "posttest": "npm run lint",
        -    "prepublishOnly": "git push --follow-tags",
        -    "prerelease": "npm t",
        -    "release": "standard-version -s",
        +    "preversion": "npm test",
        +    "postversion": "npm publish",
        +    "prepublishOnly": "git push origin --follow-tags",
             "test": "tap",
        +    "snap": "tap",
             "coverage": "tap",
        -    "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test"
        +    "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test",
        +    "lint": "npm run npmclilint -- \"*.*js\" \"lib/**/*.*js\" \"test/**/*.*js\"",
        +    "npmclilint": "npmcli-lint",
        +    "lintfix": "npm run lint -- --fix",
        +    "postsnap": "npm run lintfix --"
           },
           "repository": "https://github.com/npm/cacache",
           "keywords": [
        @@ -39,23 +41,6 @@
             "disk cache",
             "disk storage"
           ],
        -  "author": {
        -    "name": "Kat Marchán",
        -    "email": "kzm@sykosomatic.org",
        -    "twitter": "maybekatz"
        -  },
        -  "contributors": [
        -    {
        -      "name": "Charlotte Spencer",
        -      "email": "charlottelaspencer@gmail.com",
        -      "twitter": "charlotteis"
        -    },
        -    {
        -      "name": "Rebecca Turner",
        -      "email": "me@re-becca.org",
        -      "twitter": "ReBeccaOrg"
        -    }
        -  ],
           "license": "ISC",
           "dependencies": {
             "@npmcli/move-file": "^1.0.1",
        @@ -77,11 +62,10 @@
             "unique-filename": "^1.1.1"
           },
           "devDependencies": {
        +    "@npmcli/lint": "^1.0.1",
             "benchmark": "^2.1.4",
             "chalk": "^4.0.0",
             "require-inject": "^1.4.4",
        -    "standard": "^14.3.1",
        -    "standard-version": "^7.1.0",
             "tacks": "^1.3.0",
             "tap": "^15.0.9"
           },
        diff --git a/deps/npm/node_modules/cacache/put.js b/deps/npm/node_modules/cacache/put.js
        index eb21aa867173f6..84e9562bc33abb 100644
        --- a/deps/npm/node_modules/cacache/put.js
        +++ b/deps/npm/node_modules/cacache/put.js
        @@ -9,7 +9,7 @@ const Pipeline = require('minipass-pipeline')
         
         const putOpts = (opts) => ({
           algorithms: ['sha512'],
        -  ...opts
        +  ...opts,
         })
         
         module.exports = putData
        @@ -21,9 +21,9 @@ function putData (cache, key, data, opts = {}) {
             return index
               .insert(cache, key, res.integrity, { ...opts, size: res.size })
               .then((entry) => {
        -        if (memoize) {
        +        if (memoize)
                   memo.put(cache, entry, data, opts)
        -        }
        +
                 return res.integrity
               })
           })
        @@ -67,17 +67,16 @@ function putStream (cache, key, opts = {}) {
               return index
                 .insert(cache, key, integrity, { ...opts, size })
                 .then((entry) => {
        -          if (memoize && memoData) {
        +          if (memoize && memoData)
                     memo.put(cache, entry, memoData, opts)
        -          }
        -          if (integrity) {
        +
        +          if (integrity)
                     pipeline.emit('integrity', integrity)
        -          }
        -          if (size) {
        +
        +          if (size)
                     pipeline.emit('size', size)
        -          }
                 })
        -    }
        +    },
           }))
         
           return pipeline
        diff --git a/deps/npm/node_modules/cacache/rm.js b/deps/npm/node_modules/cacache/rm.js
        index 7dd4e8c8b07f1c..f2ef6b190f4577 100644
        --- a/deps/npm/node_modules/cacache/rm.js
        +++ b/deps/npm/node_modules/cacache/rm.js
        @@ -11,9 +11,9 @@ const rmContent = require('./lib/content/rm')
         module.exports = entry
         module.exports.entry = entry
         
        -function entry (cache, key) {
        +function entry (cache, key, opts) {
           memo.clearMemoized()
        -  return index.delete(cache, key)
        +  return index.delete(cache, key, opts)
         }
         
         module.exports.content = content
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/codeStyles/Project.xml b/deps/npm/node_modules/iconv-lite/.idea/codeStyles/Project.xml
        new file mode 100644
        index 00000000000000..3f2688cb57ab8c
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/codeStyles/Project.xml
        @@ -0,0 +1,47 @@
        +
        +  
        +    
        +      
        +    
        +      
        +    
        +      
        +    
        +      
        +    
        +      
        +    
        +      
        +    
        +      
        +    
        +      
        +  
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/codeStyles/codeStyleConfig.xml b/deps/npm/node_modules/iconv-lite/.idea/codeStyles/codeStyleConfig.xml
        new file mode 100644
        index 00000000000000..79ee123c2b23e0
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/codeStyles/codeStyleConfig.xml
        @@ -0,0 +1,5 @@
        +
        +  
        +    
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/iconv-lite.iml b/deps/npm/node_modules/iconv-lite/.idea/iconv-lite.iml
        new file mode 100644
        index 00000000000000..0c8867d7e175f4
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/iconv-lite.iml
        @@ -0,0 +1,12 @@
        +
        +
        +  
        +    
        +      
        +      
        +      
        +    
        +    
        +    
        +  
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/inspectionProfiles/Project_Default.xml b/deps/npm/node_modules/iconv-lite/.idea/inspectionProfiles/Project_Default.xml
        new file mode 100644
        index 00000000000000..03d9549ea8e4ad
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/inspectionProfiles/Project_Default.xml
        @@ -0,0 +1,6 @@
        +
        +  
        +    
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/modules.xml b/deps/npm/node_modules/iconv-lite/.idea/modules.xml
        new file mode 100644
        index 00000000000000..5d24f2e1ec92a2
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/modules.xml
        @@ -0,0 +1,8 @@
        +
        +
        +  
        +    
        +      
        +    
        +  
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/.idea/vcs.xml b/deps/npm/node_modules/iconv-lite/.idea/vcs.xml
        new file mode 100644
        index 00000000000000..94a25f7f4cb416
        --- /dev/null
        +++ b/deps/npm/node_modules/iconv-lite/.idea/vcs.xml
        @@ -0,0 +1,6 @@
        +
        +
        +  
        +    
        +  
        +
        \ No newline at end of file
        diff --git a/deps/npm/node_modules/iconv-lite/Changelog.md b/deps/npm/node_modules/iconv-lite/Changelog.md
        index c299cc06a25d3e..464549b148481a 100644
        --- a/deps/npm/node_modules/iconv-lite/Changelog.md
        +++ b/deps/npm/node_modules/iconv-lite/Changelog.md
        @@ -1,3 +1,7 @@
        +## 0.6.3 / 2021-05-23
        +  * Fix HKSCS encoding to prefer Big5 codes if both Big5 and HKSCS codes are possible (#264)
        +
        +
         ## 0.6.2 / 2020-07-08
           * Support Uint8Array-s decoding without conversion to Buffers, plus fix an edge case.
         
        diff --git a/deps/npm/node_modules/iconv-lite/encodings/dbcs-data.js b/deps/npm/node_modules/iconv-lite/encodings/dbcs-data.js
        index 4b61914341f916..0d17e5821b3df9 100644
        --- a/deps/npm/node_modules/iconv-lite/encodings/dbcs-data.js
        +++ b/deps/npm/node_modules/iconv-lite/encodings/dbcs-data.js
        @@ -167,7 +167,19 @@ module.exports = {
             'big5hkscs': {
                 type: '_dbcs',
                 table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
        -        encodeSkipVals: [0xa2cc],
        +        encodeSkipVals: [
        +            // Although Encoding Standard says we should avoid encoding to HKSCS area (See Step 1 of
        +            // https://encoding.spec.whatwg.org/#index-big5-pointer), we still do it to increase compatibility with ICU.
        +            // But if a single unicode point can be encoded both as HKSCS and regular Big5, we prefer the latter.
        +            0x8e69, 0x8e6f, 0x8e7e, 0x8eab, 0x8eb4, 0x8ecd, 0x8ed0, 0x8f57, 0x8f69, 0x8f6e, 0x8fcb, 0x8ffe,
        +            0x906d, 0x907a, 0x90c4, 0x90dc, 0x90f1, 0x91bf, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92d1, 0x9447, 0x94ca,
        +            0x95d9, 0x96fc, 0x9975, 0x9b76, 0x9b78, 0x9b7b, 0x9bc6, 0x9bde, 0x9bec, 0x9bf6, 0x9c42, 0x9c53, 0x9c62,
        +            0x9c68, 0x9c6b, 0x9c77, 0x9cbc, 0x9cbd, 0x9cd0, 0x9d57, 0x9d5a, 0x9dc4, 0x9def, 0x9dfb, 0x9ea9, 0x9eef,
        +            0x9efd, 0x9f60, 0x9fcb, 0xa077, 0xa0dc, 0xa0df, 0x8fcc, 0x92c8, 0x9644, 0x96ed,
        +
        +            // Step 2 of https://encoding.spec.whatwg.org/#index-big5-pointer: Use last pointer for U+2550, U+255E, U+2561, U+256A, U+5341, or U+5345
        +            0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa2cc, 0xa2ce,
        +        ],
             },
         
             'cnbig5': 'big5hkscs',
        diff --git a/deps/npm/node_modules/iconv-lite/package.json b/deps/npm/node_modules/iconv-lite/package.json
        index 8f86f9c9bc1f8f..d351115a839fa0 100644
        --- a/deps/npm/node_modules/iconv-lite/package.json
        +++ b/deps/npm/node_modules/iconv-lite/package.json
        @@ -1,7 +1,7 @@
         {
             "name": "iconv-lite",
             "description": "Convert character encodings in pure javascript.",
        -    "version": "0.6.2",
        +    "version": "0.6.3",
             "license": "MIT",
             "keywords": [
                 "iconv",
        diff --git a/deps/npm/node_modules/is-core-module/.github/FUNDING.yml b/deps/npm/node_modules/is-core-module/.github/FUNDING.yml
        deleted file mode 100644
        index 422ce9b01a7f3b..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/FUNDING.yml
        +++ /dev/null
        @@ -1,12 +0,0 @@
        -# These are supported funding model platforms
        -
        -github: [ljharb]
        -patreon: # Replace with a single Patreon username
        -open_collective: # Replace with a single Open Collective username
        -ko_fi: # Replace with a single Ko-fi username
        -tidelift: npm/is-core-module
        -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
        -liberapay: # Replace with a single Liberapay username
        -issuehunt: # Replace with a single IssueHunt username
        -otechie: # Replace with a single Otechie username
        -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/node-4+.yml b/deps/npm/node_modules/is-core-module/.github/workflows/node-4+.yml
        deleted file mode 100644
        index ba174e1d6c28cd..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/node-4+.yml
        +++ /dev/null
        @@ -1,54 +0,0 @@
        -name: 'Tests: node.js'
        -
        -on: [pull_request, push]
        -
        -jobs:
        -  matrix:
        -    runs-on: ubuntu-latest
        -    outputs:
        -      latest: ${{ steps.set-matrix.outputs.requireds }}
        -      minors: ${{ steps.set-matrix.outputs.optionals }}
        -    steps:
        -      - uses: ljharb/actions/node/matrix@main
        -        id: set-matrix
        -        with:
        -          preset: '>=4'
        -
        -  latest:
        -    needs: [matrix]
        -    name: 'latest minors'
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.latest) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        name: 'npm install && npm run tests-only'
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -  minors:
        -    needs: [matrix, latest]
        -    name: 'non-latest minors'
        -    continue-on-error: true
        -    if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }}
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.minors) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -
        -  node:
        -    name: 'node 4+'
        -    needs: [latest, minors]
        -    runs-on: ubuntu-latest
        -    steps:
        -      - run: 'echo tests completed'
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/node-iojs.yml b/deps/npm/node_modules/is-core-module/.github/workflows/node-iojs.yml
        deleted file mode 100644
        index f707c3cfc308ec..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/node-iojs.yml
        +++ /dev/null
        @@ -1,58 +0,0 @@
        -name: 'Tests: node.js (io.js)'
        -
        -on: [pull_request, push]
        -
        -jobs:
        -  matrix:
        -    runs-on: ubuntu-latest
        -    outputs:
        -      latest: ${{ steps.set-matrix.outputs.requireds }}
        -      minors: ${{ steps.set-matrix.outputs.optionals }}
        -    steps:
        -      - uses: ljharb/actions/node/matrix@main
        -        id: set-matrix
        -        with:
        -          preset: 'iojs'
        -
        -  latest:
        -    needs: [matrix]
        -    name: 'latest minors'
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.latest) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        name: 'npm install && npm run tests-only'
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -          skip-ls-check: true
        -
        -  minors:
        -    needs: [matrix, latest]
        -    name: 'non-latest minors'
        -    continue-on-error: true
        -    if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }}
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.minors) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        name: 'npm install && npm run tests-only'
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -          skip-ls-check: true
        -
        -  node:
        -    name: 'io.js'
        -    needs: [latest, minors]
        -    runs-on: ubuntu-latest
        -    steps:
        -      - run: 'echo tests completed'
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/node-pretest.yml b/deps/npm/node_modules/is-core-module/.github/workflows/node-pretest.yml
        deleted file mode 100644
        index 3921e0ae6cd6ba..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/node-pretest.yml
        +++ /dev/null
        @@ -1,26 +0,0 @@
        -name: 'Tests: pretest/posttest'
        -
        -on: [pull_request, push]
        -
        -jobs:
        -  pretest:
        -    runs-on: ubuntu-latest
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        name: 'npm install && npm run pretest'
        -        with:
        -          node-version: 'lts/*'
        -          command: 'pretest'
        -
        -  posttest:
        -    runs-on: ubuntu-latest
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        name: 'npm install && npm run posttest'
        -        with:
        -          node-version: 'lts/*'
        -          command: 'posttest'
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/node-zero.yml b/deps/npm/node_modules/is-core-module/.github/workflows/node-zero.yml
        deleted file mode 100644
        index d044c6031d5b3a..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/node-zero.yml
        +++ /dev/null
        @@ -1,58 +0,0 @@
        -name: 'Tests: node.js (0.x)'
        -
        -on: [pull_request, push]
        -
        -jobs:
        -  matrix:
        -    runs-on: ubuntu-latest
        -    outputs:
        -      stable: ${{ steps.set-matrix.outputs.requireds }}
        -      unstable: ${{ steps.set-matrix.outputs.optionals }}
        -    steps:
        -      - uses: ljharb/actions/node/matrix@main
        -        id: set-matrix
        -        with:
        -          preset: '0.x'
        -
        -  stable:
        -    needs: [matrix]
        -    name: 'stable minors'
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.stable) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -          cache-node-modules-key: node_modules-${{ github.workflow }}-${{ github.action }}-${{ github.run_id }}
        -          skip-ls-check: true
        -
        -  unstable:
        -    needs: [matrix, stable]
        -    name: 'unstable minors'
        -    continue-on-error: true
        -    if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }}
        -    runs-on: ubuntu-latest
        -
        -    strategy:
        -      matrix: ${{ fromJson(needs.matrix.outputs.unstable) }}
        -
        -    steps:
        -      - uses: actions/checkout@v2
        -      - uses: ljharb/actions/node/run@main
        -        with:
        -          node-version: ${{ matrix.node-version }}
        -          command: 'tests-only'
        -          cache-node-modules-key: node_modules-${{ github.workflow }}-${{ github.action }}-${{ github.run_id }}
        -          skip-ls-check: true
        -
        -  node:
        -    name: 'node 0.x'
        -    needs: [stable, unstable]
        -    runs-on: ubuntu-latest
        -    steps:
        -      - run: 'echo tests completed'
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/rebase.yml b/deps/npm/node_modules/is-core-module/.github/workflows/rebase.yml
        deleted file mode 100644
        index 0c2ad39b5f7b82..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/rebase.yml
        +++ /dev/null
        @@ -1,15 +0,0 @@
        -name: Automatic Rebase
        -
        -on: [pull_request_target]
        -
        -jobs:
        -  _:
        -    name: "Automatic Rebase"
        -
        -    runs-on: ubuntu-latest
        -
        -    steps:
        -    - uses: actions/checkout@v1
        -    - uses: ljharb/rebase@master
        -      env:
        -        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        diff --git a/deps/npm/node_modules/is-core-module/.github/workflows/require-allow-edits.yml b/deps/npm/node_modules/is-core-module/.github/workflows/require-allow-edits.yml
        deleted file mode 100644
        index aac42d3e29c7af..00000000000000
        --- a/deps/npm/node_modules/is-core-module/.github/workflows/require-allow-edits.yml
        +++ /dev/null
        @@ -1,14 +0,0 @@
        -name: Require “Allow Edits”
        -
        -on: [pull_request_target]
        -
        -jobs:
        -  _:
        -    name: "Require “Allow Edits”"
        -
        -    runs-on: ubuntu-latest
        -
        -    steps:
        -    - uses: ljharb/require-allow-edits@main
        -      env:
        -        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        diff --git a/deps/npm/node_modules/is-core-module/.nycrc b/deps/npm/node_modules/is-core-module/.nycrc
        index 1826526e091b89..bdd626ce91477a 100644
        --- a/deps/npm/node_modules/is-core-module/.nycrc
        +++ b/deps/npm/node_modules/is-core-module/.nycrc
        @@ -2,10 +2,6 @@
         	"all": true,
         	"check-coverage": false,
         	"reporter": ["text-summary", "text", "html", "json"],
        -	"lines": 86,
        -	"statements": 85.93,
        -	"functions": 82.43,
        -	"branches": 76.06,
         	"exclude": [
         		"coverage",
         		"test"
        diff --git a/deps/npm/node_modules/is-core-module/CHANGELOG.md b/deps/npm/node_modules/is-core-module/CHANGELOG.md
        index 4cdb33d005960d..f2148ddde438a8 100644
        --- a/deps/npm/node_modules/is-core-module/CHANGELOG.md
        +++ b/deps/npm/node_modules/is-core-module/CHANGELOG.md
        @@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file.
         The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
         and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
         
        +## [v2.4.0](https://github.com/inspect-js/is-core-module/compare/v2.3.0...v2.4.0) - 2021-05-09
        +
        +### Commits
        +
        +- [readme] add actions and codecov badges [`82b7faa`](https://github.com/inspect-js/is-core-module/commit/82b7faa12b56dbe47fbea67e1a5b9e447027ba40)
        +- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`8096868`](https://github.com/inspect-js/is-core-module/commit/8096868c024a161ccd4d44110b136763e92eace8)
        +- [Dev Deps] update `eslint` [`6726824`](https://github.com/inspect-js/is-core-module/commit/67268249b88230018c510f6532a8046d7326346f)
        +- [New] add `diagnostics_channel` to node `^14.17` [`86c6563`](https://github.com/inspect-js/is-core-module/commit/86c65634201b8ff9b3e48a9a782594579c7f5c3c)
        +- [meta] fix prepublish script [`697a01e`](https://github.com/inspect-js/is-core-module/commit/697a01e3c9c0be074066520954f30fb28532ec57)
        +
        +## [v2.3.0](https://github.com/inspect-js/is-core-module/compare/v2.2.0...v2.3.0) - 2021-04-24
        +
        +### Commits
        +
        +- [meta] do not publish github action workflow files [`060d4bb`](https://github.com/inspect-js/is-core-module/commit/060d4bb971a29451c19ff336eb56bee27f9fa95a)
        +- [New] add support for `node:` prefix, in node 16+ [`7341223`](https://github.com/inspect-js/is-core-module/commit/73412230a769f6e81c05eea50b6520cebf54ed2f)
        +- [actions] use `node/install` instead of `node/run`; use `codecov` action [`016269a`](https://github.com/inspect-js/is-core-module/commit/016269abae9f6657a5254adfbb813f09a05067f9)
        +- [patch] remove unneeded `.0` in version ranges [`cb466a6`](https://github.com/inspect-js/is-core-module/commit/cb466a6d89e52b8389e5c12715efcd550c41cea3)
        +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`c9f9c39`](https://github.com/inspect-js/is-core-module/commit/c9f9c396ace60ef81906f98059c064e6452473ed)
        +- [actions] update workflows [`3ee4a89`](https://github.com/inspect-js/is-core-module/commit/3ee4a89fd5a02fccd43882d905448ea6a98e9a3c)
        +- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`dee4fed`](https://github.com/inspect-js/is-core-module/commit/dee4fed79690c1d43a22f7fa9426abebdc6d727f)
        +- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`7d046ba`](https://github.com/inspect-js/is-core-module/commit/7d046ba07ae8c9292e43652694ca808d7b309de8)
        +- [meta] use `prepublishOnly` script for npm 7+ [`149e677`](https://github.com/inspect-js/is-core-module/commit/149e6771a5ede6d097e71785b467a9c4b4977cc7)
        +- [readme] remove travis badge [`903b51d`](https://github.com/inspect-js/is-core-module/commit/903b51d6b69b98abeabfbc3695c345b02646f19c)
        +
         ## [v2.2.0](https://github.com/inspect-js/is-core-module/compare/v2.1.0...v2.2.0) - 2020-11-26
         
         ### Commits
        diff --git a/deps/npm/node_modules/is-core-module/README.md b/deps/npm/node_modules/is-core-module/README.md
        index 479d6d24c0f041..062d9068eb57e8 100644
        --- a/deps/npm/node_modules/is-core-module/README.md
        +++ b/deps/npm/node_modules/is-core-module/README.md
        @@ -1,6 +1,7 @@
         # is-core-module [![Version Badge][2]][1]
         
        -[![Build Status][3]][4]
        +[![github actions][actions-image]][actions-url]
        +[![coverage][codecov-image]][codecov-url]
         [![dependency status][5]][6]
         [![dev dependency status][7]][8]
         [![License][license-image]][license-url]
        @@ -24,8 +25,6 @@ Clone the repo, `npm install`, and run `npm test`
         
         [1]: https://npmjs.org/package/is-core-module
         [2]: https://versionbadg.es/inspect-js/is-core-module.svg
        -[3]: https://travis-ci.com/inspect-js/is-core-module.svg
        -[4]: https://travis-ci.com/inspect-js/is-core-module
         [5]: https://david-dm.org/inspect-js/is-core-module.svg
         [6]: https://david-dm.org/inspect-js/is-core-module
         [7]: https://david-dm.org/inspect-js/is-core-module/dev-status.svg
        @@ -35,3 +34,7 @@ Clone the repo, `npm install`, and run `npm test`
         [license-url]: LICENSE
         [downloads-image]: https://img.shields.io/npm/dm/is-core-module.svg
         [downloads-url]: https://npm-stat.com/charts.html?package=is-core-module
        +[codecov-image]: https://codecov.io/gh/inspect-js/is-core-module/branch/main/graphs/badge.svg
        +[codecov-url]: https://app.codecov.io/gh/inspect-js/is-core-module/
        +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/is-core-module
        +[actions-url]: https://github.com/inspect-js/is-core-module/actions
        diff --git a/deps/npm/node_modules/is-core-module/core.json b/deps/npm/node_modules/is-core-module/core.json
        index 0238b61a4c71e4..44a92a1a414b97 100644
        --- a/deps/npm/node_modules/is-core-module/core.json
        +++ b/deps/npm/node_modules/is-core-module/core.json
        @@ -1,83 +1,146 @@
         {
         	"assert": true,
        +	"node:assert": ">= 16",
         	"assert/strict": ">= 15",
        +	"node:assert/strict": ">= 16",
         	"async_hooks": ">= 8",
        +	"node:async_hooks": ">= 16",
         	"buffer_ieee754": "< 0.9.7",
         	"buffer": true,
        +	"node:buffer": ">= 16",
         	"child_process": true,
        +	"node:child_process": ">= 16",
         	"cluster": true,
        +	"node:cluster": ">= 16",
         	"console": true,
        +	"node:console": ">= 16",
         	"constants": true,
        +	"node:constants": ">= 16",
         	"crypto": true,
        +	"node:crypto": ">= 16",
         	"_debug_agent": ">= 1 && < 8",
         	"_debugger": "< 8",
         	"dgram": true,
        -	"diagnostics_channel": ">= 15.1",
        +	"node:dgram": ">= 16",
        +	"diagnostics_channel": [">= 14.17 && < 15", ">= 15.1"],
        +	"node:diagnostics_channel": ">= 16",
         	"dns": true,
        +	"node:dns": ">= 16",
         	"dns/promises": ">= 15",
        +	"node:dns/promises": ">= 16",
         	"domain": ">= 0.7.12",
        +	"node:domain": ">= 16",
         	"events": true,
        +	"node:events": ">= 16",
         	"freelist": "< 6",
         	"fs": true,
        +	"node:fs": ">= 16",
         	"fs/promises": [">= 10 && < 10.1", ">= 14"],
        +	"node:fs/promises": ">= 16",
         	"_http_agent": ">= 0.11.1",
        +	"node:_http_agent": ">= 16",
         	"_http_client": ">= 0.11.1",
        +	"node:_http_client": ">= 16",
         	"_http_common": ">= 0.11.1",
        +	"node:_http_common": ">= 16",
         	"_http_incoming": ">= 0.11.1",
        +	"node:_http_incoming": ">= 16",
         	"_http_outgoing": ">= 0.11.1",
        +	"node:_http_outgoing": ">= 16",
         	"_http_server": ">= 0.11.1",
        +	"node:_http_server": ">= 16",
         	"http": true,
        +	"node:http": ">= 16",
         	"http2": ">= 8.8",
        +	"node:http2": ">= 16",
         	"https": true,
        -	"inspector": ">= 8.0.0",
        +	"node:https": ">= 16",
        +	"inspector": ">= 8",
        +	"node:inspector": ">= 16",
         	"_linklist": "< 8",
         	"module": true,
        +	"node:module": ">= 16",
         	"net": true,
        -	"node-inspect/lib/_inspect": ">= 7.6.0 && < 12",
        -	"node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12",
        -	"node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12",
        +	"node:net": ">= 16",
        +	"node-inspect/lib/_inspect": ">= 7.6 && < 12",
        +	"node-inspect/lib/internal/inspect_client": ">= 7.6 && < 12",
        +	"node-inspect/lib/internal/inspect_repl": ">= 7.6 && < 12",
         	"os": true,
        +	"node:os": ">= 16",
         	"path": true,
        +	"node:path": ">= 16",
         	"path/posix": ">= 15.3",
        +	"node:path/posix": ">= 16",
         	"path/win32": ">= 15.3",
        +	"node:path/win32": ">= 16",
         	"perf_hooks": ">= 8.5",
        +	"node:perf_hooks": ">= 16",
         	"process": ">= 1",
        +	"node:process": ">= 16",
         	"punycode": true,
        +	"node:punycode": ">= 16",
         	"querystring": true,
        +	"node:querystring": ">= 16",
         	"readline": true,
        +	"node:readline": ">= 16",
         	"repl": true,
        +	"node:repl": ">= 16",
         	"smalloc": ">= 0.11.5 && < 3",
         	"_stream_duplex": ">= 0.9.4",
        +	"node:_stream_duplex": ">= 16",
         	"_stream_transform": ">= 0.9.4",
        +	"node:_stream_transform": ">= 16",
         	"_stream_wrap": ">= 1.4.1",
        +	"node:_stream_wrap": ">= 16",
         	"_stream_passthrough": ">= 0.9.4",
        +	"node:_stream_passthrough": ">= 16",
         	"_stream_readable": ">= 0.9.4",
        +	"node:_stream_readable": ">= 16",
         	"_stream_writable": ">= 0.9.4",
        +	"node:_stream_writable": ">= 16",
         	"stream": true,
        +	"node:stream": ">= 16",
         	"stream/promises": ">= 15",
        +	"node:stream/promises": ">= 16",
         	"string_decoder": true,
        +	"node:string_decoder": ">= 16",
         	"sys": [">= 0.6 && < 0.7", ">= 0.8"],
        +	"node:sys": ">= 16",
         	"timers": true,
        +	"node:timers": ">= 16",
         	"timers/promises": ">= 15",
        +	"node:timers/promises": ">= 16",
         	"_tls_common": ">= 0.11.13",
        +	"node:_tls_common": ">= 16",
         	"_tls_legacy": ">= 0.11.3 && < 10",
         	"_tls_wrap": ">= 0.11.3",
        +	"node:_tls_wrap": ">= 16",
         	"tls": true,
        +	"node:tls": ">= 16",
         	"trace_events": ">= 10",
        +	"node:trace_events": ">= 16",
         	"tty": true,
        +	"node:tty": ">= 16",
         	"url": true,
        +	"node:url": ">= 16",
         	"util": true,
        +	"node:util": ">= 16",
         	"util/types": ">= 15.3",
        +	"node:util/types": ">= 16",
         	"v8/tools/arguments": ">= 10 && < 12",
        -	"v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        -	"v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        -	"v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        -	"v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        -	"v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        -	"v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
        +	"v8/tools/codemap": [">= 4.4 && < 5", ">= 5.2 && < 12"],
        +	"v8/tools/consarray": [">= 4.4 && < 5", ">= 5.2 && < 12"],
        +	"v8/tools/csvparser": [">= 4.4 && < 5", ">= 5.2 && < 12"],
        +	"v8/tools/logreader": [">= 4.4 && < 5", ">= 5.2 && < 12"],
        +	"v8/tools/profile_view": [">= 4.4 && < 5", ">= 5.2 && < 12"],
        +	"v8/tools/splaytree": [">= 4.4 && < 5", ">= 5.2 && < 12"],
         	"v8": ">= 1",
        +	"node:v8": ">= 16",
         	"vm": true,
        +	"node:vm": ">= 16",
         	"wasi": ">= 13.4 && < 13.5",
         	"worker_threads": ">= 11.7",
        -	"zlib": true
        +	"node:worker_threads": ">= 16",
        +	"zlib": true,
        +	"node:zlib": ">= 16"
         }
        diff --git a/deps/npm/node_modules/is-core-module/package.json b/deps/npm/node_modules/is-core-module/package.json
        index 21341cc431a505..0442e92cd2065a 100644
        --- a/deps/npm/node_modules/is-core-module/package.json
        +++ b/deps/npm/node_modules/is-core-module/package.json
        @@ -1,6 +1,6 @@
         {
         	"name": "is-core-module",
        -	"version": "2.2.0",
        +	"version": "2.4.0",
         	"description": "Is this specifier a node.js core module?",
         	"main": "index.js",
         	"exports": {
        @@ -13,7 +13,8 @@
         		"./package.json": "./package.json"
         	},
         	"scripts": {
        -		"prepublish": "safe-publish-latest",
        +		"prepublish": "not-in-publish || npm run prepublishOnly",
        +		"prepublishOnly": "safe-publish-latest",
         		"lint": "eslint .",
         		"pretest": "npm run lint",
         		"tests-only": "tape 'test/**/*.js'",
        @@ -47,13 +48,14 @@
         		"has": "^1.0.3"
         	},
         	"devDependencies": {
        -		"@ljharb/eslint-config": "^17.3.0",
        -		"aud": "^1.1.3",
        +		"@ljharb/eslint-config": "^17.6.0",
        +		"aud": "^1.1.5",
         		"auto-changelog": "^2.2.1",
        -		"eslint": "^7.14.0",
        +		"eslint": "^7.26.0",
         		"nyc": "^10.3.2",
         		"safe-publish-latest": "^1.1.4",
        -		"tape": "^5.0.1"
        +		"semver": "^6.3.0",
        +		"tape": "^5.2.2"
         	},
         	"auto-changelog": {
         		"output": "CHANGELOG.md",
        diff --git a/deps/npm/node_modules/is-core-module/test/index.js b/deps/npm/node_modules/is-core-module/test/index.js
        index 99659bcf113f78..281c7e9a4b1340 100644
        --- a/deps/npm/node_modules/is-core-module/test/index.js
        +++ b/deps/npm/node_modules/is-core-module/test/index.js
        @@ -2,9 +2,12 @@
         
         var test = require('tape');
         var keys = require('object-keys');
        +var semver = require('semver');
         var isCore = require('../');
         var data = require('../core.json');
         
        +var supportsNodePrefix = semver.satisfies(process.versions.node, '>= 16');
        +
         test('core modules', function (t) {
         	t.test('isCore()', function (st) {
         		st.ok(isCore('fs'));
        @@ -48,6 +51,17 @@ test('core modules', function (t) {
         					function () { require(mod); }, // eslint-disable-line no-loop-func
         					'requiring ' + mod + ' does not throw'
         				);
        +				if (supportsNodePrefix) {
        +					st.doesNotThrow(
        +						function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
        +						'requiring node:' + mod + ' does not throw'
        +					);
        +				} else {
        +					st['throws'](
        +						function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
        +						'requiring node:' + mod + ' throws'
        +					);
        +				}
         			}
         		}
         		st.end();
        @@ -73,6 +87,17 @@ test('core modules', function (t) {
         						function () { require(mod); }, // eslint-disable-line no-loop-func
         						'requiring ' + mod + ' does not throw'
         					);
        +					if (supportsNodePrefix) {
        +						st.doesNotThrow(
        +							function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
        +							'requiring node:' + mod + ' does not throw'
        +						);
        +					} else {
        +						st['throws'](
        +							function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
        +							'requiring node:' + mod + ' throws'
        +						);
        +					}
         				}
         			}
         		}
        diff --git a/deps/npm/node_modules/libnpmaccess/package.json b/deps/npm/node_modules/libnpmaccess/package.json
        index 69b7a0dc25fe49..23d4b444ca0701 100644
        --- a/deps/npm/node_modules/libnpmaccess/package.json
        +++ b/deps/npm/node_modules/libnpmaccess/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmaccess",
        -  "version": "4.0.2",
        +  "version": "4.0.3",
           "description": "programmatic library for `npm access` commands",
           "author": "Kat Marchán ",
           "license": "ISC",
        @@ -26,7 +26,7 @@
             "aproba": "^2.0.0",
             "minipass": "^3.1.1",
             "npm-package-arg": "^8.1.2",
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "engines": {
             "node": ">=10"
        diff --git a/deps/npm/node_modules/libnpmexec/CHANGELOG.md b/deps/npm/node_modules/libnpmexec/CHANGELOG.md
        new file mode 100644
        index 00000000000000..81a0e1a0327c38
        --- /dev/null
        +++ b/deps/npm/node_modules/libnpmexec/CHANGELOG.md
        @@ -0,0 +1,16 @@
        +# Changelog
        +
        +## v1.1.0
        +
        +- Add add walk up dir lookup logic to satisfy local bins,
        +similar to `@npmcli/run-script`
        +
        +## v1.0.1
        +
        +- Fix `scriptShell` option name.
        +
        +## v1.0.0
        +
        +- Initial implementation, moves the code that used to live in the **npm cli**,
        +ref: https://github.com/npm/cli/blob/release/v7.10.0/lib/exec.js into this
        +separate module, providing a programmatic API to the **npm exec** functionality.
        diff --git a/deps/npm/node_modules/libnpmexec/README.md b/deps/npm/node_modules/libnpmexec/README.md
        index fb7a7717600197..18a26011adc769 100644
        --- a/deps/npm/node_modules/libnpmexec/README.md
        +++ b/deps/npm/node_modules/libnpmexec/README.md
        @@ -39,7 +39,7 @@ await libexec({
           - `packages`: A list of packages to be used (possibly fetch from the registry) **Array**, defaults to `[]`
           - `path`: Location to where to read local project info (`package.json`) **String**, defaults to `.`
           - `runPath`: Location to where to execute the script **String**, defaults to `.`
        -  - `scriptShell`: Default shell to be used **String**
        +  - `scriptShell`: Default shell to be used **String**, defaults to `sh` on POSIX systems, `process.env.ComSpec` OR `cmd` on Windows
           - `yes`: Should skip download confirmation prompt when fetching missing packages from the registry? **Boolean**
           - `registry`, `cache`, and more options that are forwarded to [@npmcli/arborist](https://github.com/npm/arborist/) and [pacote](https://github.com/npm/pacote/#options) **Object**
         
        diff --git a/deps/npm/node_modules/libnpmexec/lib/index.js b/deps/npm/node_modules/libnpmexec/lib/index.js
        index a48c654bf6a4f8..8c5181f3975197 100644
        --- a/deps/npm/node_modules/libnpmexec/lib/index.js
        +++ b/deps/npm/node_modules/libnpmexec/lib/index.js
        @@ -16,6 +16,7 @@ const getBinFromManifest = require('./get-bin-from-manifest.js')
         const manifestMissing = require('./manifest-missing.js')
         const noTTY = require('./no-tty.js')
         const runScript = require('./run-script.js')
        +const isWindows = require('./is-windows.js')
         
         /* istanbul ignore next */
         const PATH = (
        @@ -34,7 +35,7 @@ const exec = async (opts) => {
             packages: _packages = [],
             path = '.',
             runPath = '.',
        -    scriptShell = undefined,
        +    scriptShell = isWindows ? process.env.ComSpec || 'cmd' : 'sh',
             yes = undefined,
             ...flatOptions
           } = opts
        diff --git a/deps/npm/node_modules/libnpmexec/lib/is-windows.js b/deps/npm/node_modules/libnpmexec/lib/is-windows.js
        new file mode 100644
        index 00000000000000..fbece90ad74964
        --- /dev/null
        +++ b/deps/npm/node_modules/libnpmexec/lib/is-windows.js
        @@ -0,0 +1 @@
        +module.exports = process.platform === 'win32'
        diff --git a/deps/npm/node_modules/libnpmexec/package.json b/deps/npm/node_modules/libnpmexec/package.json
        index c113ac6d0a6076..2b3b488cf079f3 100644
        --- a/deps/npm/node_modules/libnpmexec/package.json
        +++ b/deps/npm/node_modules/libnpmexec/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmexec",
        -  "version": "1.1.1",
        +  "version": "1.2.0",
           "files": [
             "lib"
           ],
        diff --git a/deps/npm/node_modules/libnpmhook/CHANGELOG.md b/deps/npm/node_modules/libnpmhook/CHANGELOG.md
        deleted file mode 100644
        index 05572749722598..00000000000000
        --- a/deps/npm/node_modules/libnpmhook/CHANGELOG.md
        +++ /dev/null
        @@ -1,110 +0,0 @@
        -# Change Log
        -
        -
        -# [6.0.0](https://github.com/npm/libnpmhook/compare/v5.0.2...v6.0.0) (2020-02-26)
        -
        -### Breaking Changes
        -
        -* [`aa629b4`](https://github.com/npm/libnpmhook/commit/aa629b4) fix: remove figgy-pudding ([@claudiahdz](https://github.com/claudiahdz))
        -
        -### Miscellaneuous
        -
        -* [`ea795fb`](https://github.com/npm/libnpmhook/commit/ea795fb) chore: basic project updates ([@claudiahdz](https://github.com/claudiahdz))
        -* [`a0fdf7e`](https://github.com/npm/libnpmhook/commit/a0fdf7e) chore: cleanup badges, contrib, readme ([@ruyadorno](https://github.com/ruyadorno))
        -
        ----
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -
        -## [5.0.2](https://github.com/npm/libnpmhook/compare/v5.0.1...v5.0.2) (2018-08-24)
        -
        -
        -
        -
        -## [5.0.1](https://github.com/npm/libnpmhook/compare/v5.0.0...v5.0.1) (2018-08-23)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** move JSONStream to prod deps ([bb63594](https://github.com/npm/libnpmhook/commit/bb63594))
        -
        -
        -
        -
        -# [5.0.0](https://github.com/npm/libnpmhook/compare/v4.0.1...v5.0.0) (2018-08-21)
        -
        -
        -### Features
        -
        -* **api:** overhauled API ([46b271b](https://github.com/npm/libnpmhook/commit/46b271b))
        -
        -
        -### BREAKING CHANGES
        -
        -* **api:** the API for ls() has changed, and rm() no longer errors on 404
        -
        -
        -
        -
        -## [4.0.1](https://github.com/npm/libnpmhook/compare/v4.0.0...v4.0.1) (2018-04-09)
        -
        -
        -
        -
        -# [4.0.0](https://github.com/npm/libnpmhook/compare/v3.0.1...v4.0.0) (2018-04-08)
        -
        -
        -### meta
        -
        -* drop support for node 4 and 7 ([f2a301e](https://github.com/npm/libnpmhook/commit/f2a301e))
        -
        -
        -### BREAKING CHANGES
        -
        -* node@4 and node@7 are no longer supported
        -
        -
        -
        -
        -## [3.0.1](https://github.com/npm/libnpmhook/compare/v3.0.0...v3.0.1) (2018-04-08)
        -
        -
        -
        -
        -# [3.0.0](https://github.com/npm/libnpmhook/compare/v2.0.1...v3.0.0) (2018-04-04)
        -
        -
        -### add
        -
        -* guess type based on name ([9418224](https://github.com/npm/libnpmhook/commit/9418224))
        -
        -
        -### BREAKING CHANGES
        -
        -* hook type is now based on name prefix
        -
        -
        -
        -
        -## [2.0.1](https://github.com/npm/libnpmhook/compare/v2.0.0...v2.0.1) (2018-03-16)
        -
        -
        -### Bug Fixes
        -
        -* **urls:** was hitting the wrong URL endpoints ([10171a9](https://github.com/npm/libnpmhook/commit/10171a9))
        -
        -
        -
        -
        -# [2.0.0](https://github.com/npm/libnpmhook/compare/v1.0.0...v2.0.0) (2018-03-16)
        -
        -
        -
        -
        -# 1.0.0 (2018-03-16)
        -
        -
        -### Features
        -
        -* **api:** baseline working api ([122658e](https://github.com/npm/npm-hooks/commit/122658e))
        diff --git a/deps/npm/node_modules/libnpmhook/package.json b/deps/npm/node_modules/libnpmhook/package.json
        index c2a3b2a3b8795c..40951245a9ea3b 100644
        --- a/deps/npm/node_modules/libnpmhook/package.json
        +++ b/deps/npm/node_modules/libnpmhook/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmhook",
        -  "version": "6.0.2",
        +  "version": "6.0.3",
           "description": "programmatic API for managing npm registry hooks",
           "main": "index.js",
           "files": [
        @@ -28,7 +28,7 @@
           "license": "ISC",
           "dependencies": {
             "aproba": "^2.0.0",
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "devDependencies": {
             "nock": "^9.6.1",
        diff --git a/deps/npm/node_modules/libnpmorg/CHANGELOG.md b/deps/npm/node_modules/libnpmorg/CHANGELOG.md
        deleted file mode 100644
        index 4cd5cd1cd68a1c..00000000000000
        --- a/deps/npm/node_modules/libnpmorg/CHANGELOG.md
        +++ /dev/null
        @@ -1,33 +0,0 @@
        -# Change Log
        -
        -## 2.0.0 (2020-03-02)
        -
        -### BREAKING CHANGE
        -- Removed `figgy-pudding` as a dependecy
        -- Using native promises
        -- Require node >= v10
        -
        -### Feature
        -- Updated stream interface to `minipass` type stream
        -
        ----
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -
        -## [1.0.1](https://github.com/npm/libnpmorg/compare/v1.0.0...v1.0.1) (2019-07-16)
        -
        -
        -### Bug Fixes
        -
        -* **standard:** standard --fix ([5118358](https://github.com/npm/libnpmorg/commit/5118358))
        -
        -
        -
        -
        -# 1.0.0 (2018-08-23)
        -
        -
        -### Features
        -
        -* **API:** implement org api ([731b9c6](https://github.com/npm/libnpmorg/commit/731b9c6))
        diff --git a/deps/npm/node_modules/libnpmorg/package.json b/deps/npm/node_modules/libnpmorg/package.json
        index d7e76f1d326808..0e82a207b70172 100644
        --- a/deps/npm/node_modules/libnpmorg/package.json
        +++ b/deps/npm/node_modules/libnpmorg/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmorg",
        -  "version": "2.0.2",
        +  "version": "2.0.3",
           "description": "Programmatic api for `npm org` commands",
           "author": "Kat Marchán ",
           "keywords": [
        @@ -40,7 +40,7 @@
           "homepage": "https://npmjs.com/package/libnpmorg",
           "dependencies": {
             "aproba": "^2.0.0",
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "engines": {
             "node": ">=10"
        diff --git a/deps/npm/node_modules/libnpmpublish/CHANGELOG.md b/deps/npm/node_modules/libnpmpublish/CHANGELOG.md
        deleted file mode 100644
        index 57d21f8400c5bd..00000000000000
        --- a/deps/npm/node_modules/libnpmpublish/CHANGELOG.md
        +++ /dev/null
        @@ -1,91 +0,0 @@
        -# Change Log
        -
        -
        -# [3.0.1](https://github.com/npm/libnpmpublish/compare/v3.0.0...v3.0.1) (2020-03-27)
        -
        -### Features
        -
        -* [`3e02307`](https://github.com/npm/libnpmpublish/commit/3e02307) chore: pack tarballs using libnpmpack ([@claudiahdz](https://github.com/claudiahdz))
        -
        -
        -# [3.0.0](https://github.com/npm/libnpmpublish/compare/v2.0.0...v3.0.0) (2020-03-09)
        -
        -### Breaking Changes
        -
        -* [`ecaeb0b`](https://github.com/npm/libnpmpublish/commit/ecaeb0b) feat: pack tarballs from source code using pacote v10 ([@claudiahdz](https://github.com/claudiahdz))
        -
        -* [`f6bf2b8`](https://github.com/npm/libnpmpublish/commit/f6bf2b8) feat: unpublish code refactor ([@claudiahdz](https://github.com/claudiahdz))
        -
        -### Miscellaneuous
        -
        -* [`5cea10f`](https://github.com/npm/libnpmpublish/commit/5cea10f) chore: basic project updates ([@claudiahdz](https://github.com/claudiahdz))
        -* [`3010b93`](https://github.com/npm/libnpmpublish/commit/3010b93) chore: cleanup badges + contributing ([@ruyadorno](https://github.com/ruyadorno))
        -
        ----
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -## [2.0.0](https://github.com/npm/libnpmpublish/compare/v1.1.3...v2.0.0) (2019-09-18)
        -
        -
        -### ⚠ BREAKING CHANGES
        -
        -* This drops support for Node.js version 6.
        -
        -### Bug Fixes
        -
        -* audit warnings, drop support for Node.js v6 ([d9a1fb6](https://github.com/npm/libnpmpublish/commit/d9a1fb6))
        -
        -### [1.1.3](https://github.com/npm/libnpmpublish/compare/v1.1.2...v1.1.3) (2019-09-18)
        -
        -
        -## [1.1.2](https://github.com/npm/libnpmpublish/compare/v1.1.1...v1.1.2) (2019-07-16)
        -
        -
        -
        -
        -## [1.1.1](https://github.com/npm/libnpmpublish/compare/v1.1.0...v1.1.1) (2019-01-22)
        -
        -
        -### Bug Fixes
        -
        -* **auth:** send username in correct key ([#3](https://github.com/npm/libnpmpublish/issues/3)) ([38422d0](https://github.com/npm/libnpmpublish/commit/38422d0))
        -
        -
        -
        -
        -# [1.1.0](https://github.com/npm/libnpmpublish/compare/v1.0.1...v1.1.0) (2018-08-31)
        -
        -
        -### Features
        -
        -* **publish:** add support for publishConfig on manifests ([161723b](https://github.com/npm/libnpmpublish/commit/161723b))
        -
        -
        -
        -
        -## [1.0.1](https://github.com/npm/libnpmpublish/compare/v1.0.0...v1.0.1) (2018-08-31)
        -
        -
        -### Bug Fixes
        -
        -* **opts:** remove unused opts ([2837098](https://github.com/npm/libnpmpublish/commit/2837098))
        -
        -
        -
        -
        -# 1.0.0 (2018-08-31)
        -
        -
        -### Bug Fixes
        -
        -* **api:** use opts.algorithms, return true on success ([80fe34b](https://github.com/npm/libnpmpublish/commit/80fe34b))
        -* **publish:** first test pass w/ bugfixes ([74135c9](https://github.com/npm/libnpmpublish/commit/74135c9))
        -* **publish:** full coverage test and related fixes ([b5a3446](https://github.com/npm/libnpmpublish/commit/b5a3446))
        -
        -
        -### Features
        -
        -* **docs:** add README with api docs ([553c13d](https://github.com/npm/libnpmpublish/commit/553c13d))
        -* **publish:** add initial publish support. tests tbd ([5b3fe94](https://github.com/npm/libnpmpublish/commit/5b3fe94))
        -* **unpublish:** add new api with unpublish support ([1c9d594](https://github.com/npm/libnpmpublish/commit/1c9d594))
        diff --git a/deps/npm/node_modules/libnpmpublish/package.json b/deps/npm/node_modules/libnpmpublish/package.json
        index 30bc4fda2530cf..ac0d632f7d66dc 100644
        --- a/deps/npm/node_modules/libnpmpublish/package.json
        +++ b/deps/npm/node_modules/libnpmpublish/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmpublish",
        -  "version": "4.0.1",
        +  "version": "4.0.2",
           "description": "Programmatic API for the bits behind npm publish and unpublish",
           "author": "npm Inc. ",
           "contributors": [
        @@ -46,7 +46,7 @@
           "dependencies": {
             "normalize-package-data": "^3.0.2",
             "npm-package-arg": "^8.1.2",
        -    "npm-registry-fetch": "^10.0.0",
        +    "npm-registry-fetch": "^11.0.0",
             "semver": "^7.1.3",
             "ssri": "^8.0.1"
           },
        diff --git a/deps/npm/node_modules/libnpmsearch/CHANGELOG.md b/deps/npm/node_modules/libnpmsearch/CHANGELOG.md
        deleted file mode 100644
        index 03b7fedc5bf0d0..00000000000000
        --- a/deps/npm/node_modules/libnpmsearch/CHANGELOG.md
        +++ /dev/null
        @@ -1,57 +0,0 @@
        -# Change Log
        -
        -
        -# [3.0.0](https://github.com/npm/libnpmhook/compare/v2.0.2...v3.0.0) (2020-02-26)
        -
        -### Breaking Changes
        -
        -* [`45f4db1`](https://github.com/npm/libnpmsearch/commit/45f4db1) fix: remove figgy-pudding ([@claudiahdz](https://github.com/claudiahdz))
        -
        -### Miscellaneuous
        -
        -* [`b413aae`](https://github.com/npm/libnpmsearch/commit/b413aae) chore: basic project updates ([@claudiahdz](https://github.com/claudiahdz))
        -* [`534983c`](https://github.com/npm/libnpmsearch/commit/534983c) chore: remove pr temmsearch ([@ruyadorno](https://github.com/ruyadorno))
        -* [`c503a89`](https://github.com/npm/libnpmsearch/commit/c503a89) chore: cleanup badges + contributing ([@ruyadorno](https://github.com/ruyadorno))
        -
        ----
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -
        -## [2.0.2](https://github.com/npm/libnpmsearch/compare/v2.0.1...v2.0.2) (2019-07-16)
        -
        -
        -
        -
        -## [2.0.1](https://github.com/npm/libnpmsearch/compare/v2.0.0...v2.0.1) (2019-06-10)
        -
        -
        -### Bug Fixes
        -
        -* **opts:** support `opts.from` properly ([#2](https://github.com/npm/libnpmsearch/issues/2)) ([da6636c](https://github.com/npm/libnpmsearch/commit/da6636c))
        -* **standard:** standard --fix ([beca19c](https://github.com/npm/libnpmsearch/commit/beca19c))
        -
        -
        -
        -
        -# [2.0.0](https://github.com/npm/libnpmsearch/compare/v1.0.0...v2.0.0) (2018-08-28)
        -
        -
        -### Features
        -
        -* **opts:** added options for pagination, details, and sorting weights ([ff97eb5](https://github.com/npm/libnpmsearch/commit/ff97eb5))
        -
        -
        -### BREAKING CHANGES
        -
        -* **opts:** this changes default requests and makes libnpmsearch return more complete data for individual packages, without null-defaulting
        -
        -
        -
        -
        -# 1.0.0 (2018-08-27)
        -
        -
        -### Features
        -
        -* **api:** got API working ([fe90008](https://github.com/npm/libnpmsearch/commit/fe90008))
        diff --git a/deps/npm/node_modules/libnpmsearch/package.json b/deps/npm/node_modules/libnpmsearch/package.json
        index 35e4a055572a12..88179b8d6fde89 100644
        --- a/deps/npm/node_modules/libnpmsearch/package.json
        +++ b/deps/npm/node_modules/libnpmsearch/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "libnpmsearch",
        -  "version": "3.1.1",
        +  "version": "3.1.2",
           "description": "Programmatic API for searching in npm and compatible registries.",
           "author": "Kat Marchán ",
           "files": [
        @@ -36,7 +36,7 @@
           "bugs": "https://github.com/npm/libnpmsearch/issues",
           "homepage": "https://npmjs.com/package/libnpmsearch",
           "dependencies": {
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "engines": {
             "node": ">=10"
        diff --git a/deps/npm/node_modules/libnpmteam/CHANGELOG.md b/deps/npm/node_modules/libnpmteam/CHANGELOG.md
        deleted file mode 100644
        index ba472cfcc52ba3..00000000000000
        --- a/deps/npm/node_modules/libnpmteam/CHANGELOG.md
        +++ /dev/null
        @@ -1,40 +0,0 @@
        -# Change Log
        -
        -## [2.0.0](https://github.com/npm/libnpmteam/compare/v1.0.2...v2.0.0) (2020-03-02)
        -
        -### BREAKING CHANGE
        -- Removed `figgy-pudding` as a dependecy
        -- Using native promises
        -- Require node >= v10
        -
        -### Feature
        -- Updated stream interface to `minipass` type stream
        -
        ----
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -
        -## [1.0.2](https://github.com/npm/libnpmteam/compare/v1.0.1...v1.0.2) (2019-07-16)
        -
        -
        -### Bug Fixes
        -
        -* **standard:** standard --fix ([3dc9144](https://github.com/npm/libnpmteam/commit/3dc9144))
        -
        -
        -
        -
        -## [1.0.1](https://github.com/npm/libnpmteam/compare/v1.0.0...v1.0.1) (2018-08-24)
        -
        -
        -
        -
        -# 1.0.0 (2018-08-22)
        -
        -
        -### Features
        -
        -* **api:** implement team api ([50dd0e1](https://github.com/npm/libnpmteam/commit/50dd0e1))
        -* **docs:** add fully-documented readme ([b1370f3](https://github.com/npm/libnpmteam/commit/b1370f3))
        -* **test:** test --100 ftw ([9d3bdc3](https://github.com/npm/libnpmteam/commit/9d3bdc3))
        diff --git a/deps/npm/node_modules/libnpmteam/package.json b/deps/npm/node_modules/libnpmteam/package.json
        index b51f60a327a2ad..09837ad2dd14a4 100644
        --- a/deps/npm/node_modules/libnpmteam/package.json
        +++ b/deps/npm/node_modules/libnpmteam/package.json
        @@ -1,7 +1,7 @@
         {
           "name": "libnpmteam",
           "description": "npm Team management APIs",
        -  "version": "2.0.3",
        +  "version": "2.0.4",
           "author": "Kat Marchán ",
           "license": "ISC",
           "scripts": {
        @@ -27,7 +27,7 @@
           "homepage": "https://npmjs.com/package/libnpmteam",
           "dependencies": {
             "aproba": "^2.0.0",
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "engines": {
             "node": ">=10"
        diff --git a/deps/npm/node_modules/make-fetch-happen/CHANGELOG.md b/deps/npm/node_modules/make-fetch-happen/CHANGELOG.md
        deleted file mode 100644
        index 324dfc1058d934..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/CHANGELOG.md
        +++ /dev/null
        @@ -1,654 +0,0 @@
        -# Changelog
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -### [8.0.3](https://github.com/npm/make-fetch-happen/compare/v8.0.2...v8.0.3) (2020-03-03)
        -
        -
        -### Bug Fixes
        -
        -* remoteFetch takes instance of fetch.Headers ([6e0de7b](https://github.com/npm/make-fetch-happen/commit/6e0de7b10b8597eaff69fea06a266914766cf5ab)), closes [#22](https://github.com/npm/make-fetch-happen/issues/22)
        -
        -### [8.0.1](https://github.com/npm/make-fetch-happen/compare/v8.0.0...v8.0.1) (2020-02-18)
        -
        -## [8.0.0](https://github.com/npm/make-fetch-happen/compare/v7.1.1...v8.0.0) (2020-02-18)
        -
        -
        -### ⚠ BREAKING CHANGES
        -
        -* this module now only supports taking a plain JavaScript
        -options object, not a figgy pudding config object.
        -
        -* update cacache and ssri ([09e4f97](https://github.com/npm/make-fetch-happen/commit/09e4f9794a6f134d3f1d8e65eb9bd940e38e5bfc))
        -
        -### [7.1.1](https://github.com/npm/make-fetch-happen/compare/v7.1.0...v7.1.1) (2020-01-28)
        -
        -## [7.1.0](https://github.com/npm/make-fetch-happen/compare/v7.0.0...v7.1.0) (2019-12-17)
        -
        -
        -### Features
        -
        -* use globalAgent when in lambda ([bd9409d](https://github.com/npm/make-fetch-happen/commit/bd9409da246a979b665ebd23967ec01dd928ce47)), closes [#4](https://github.com/npm/make-fetch-happen/issues/4)
        -
        -## [7.0.0](https://github.com/npm/make-fetch-happen/compare/v6.1.0...v7.0.0) (2019-12-17)
        -
        -
        -### ⚠ BREAKING CHANGES
        -
        -* drops support for node v8, since it's EOL as of 2020-01-01
        -
        -### Features
        -
        -* **github:** added github actions with coveralls integration ([1913c1b](https://github.com/npm/make-fetch-happen/commit/1913c1b51aaac6044b4dab65b3d19ec943a35f39))
        -* updated fetch module; linting mostly; based on testing ([063f28e](https://github.com/npm/make-fetch-happen/commit/063f28ea1ac23f7e9d9d79e15949ca82b634ce97))
        -* **utils:** fixed configure-options based on testing ([9dd4f6f](https://github.com/npm/make-fetch-happen/commit/9dd4f6f108442dc247de44e1ddc0341edcb84c9b))
        -* fixed test dep requires; added mockRequire function to mock tests properly ([95de7a1](https://github.com/npm/make-fetch-happen/commit/95de7a171110907e30f41f489e4be983cd8184a5))
        -* refactored functions into utilities ([74620dd](https://github.com/npm/make-fetch-happen/commit/74620dd7c2262ac46d9b4f6ac2dc9ff45a4f19ee))
        -* updated dev deps; update tap; updated standard ([dce6eec](https://github.com/npm/make-fetch-happen/commit/dce6eece130fb20164a62eeabc6090811d8f14a4))
        -* updated fetch tests; linting, logic, added tests ([d50aeaf](https://github.com/npm/make-fetch-happen/commit/d50aeafebeb5d8f7118d7f6660208f40ac487804))
        -
        -
        -### Bug Fixes
        -
        -* format cache key with new URL object shape ([21cb6cc](https://github.com/npm/make-fetch-happen/commit/21cb6cc968aabff8b5c5c02e3666fb093fd6578c))
        -* polish out an unnecessary URL object creation ([67a01d4](https://github.com/npm/make-fetch-happen/commit/67a01d46b2cacbadc22f49604ee524526cee3912)), closes [#14](https://github.com/npm/make-fetch-happen/issues/14)
        -* support user without password in proxy auth ([e24bbf9](https://github.com/npm/make-fetch-happen/commit/e24bbf935bc8a2c49070cdb2518e5ee290143191))
        -* updated 'files' property in package file ([945e40c](https://github.com/npm/make-fetch-happen/commit/945e40c7fbb59333e0c632c490683e4babc68dc1))
        -* Use WhatWG URL objects over deprecated legacy url API ([28aca97](https://github.com/npm/make-fetch-happen/commit/28aca97dfb63ca003ebf62d1b961771cfbb2481d))
        -
        -
        -* drop node 8 ([9fa7944](https://github.com/npm/make-fetch-happen/commit/9fa7944cbc603f3a194dfb440f519a7d5265653e))
        -
        -## [6.1.0](https://github.com/npm/make-fetch-happen/compare/v6.0.1...v6.1.0) (2019-11-14)
        -
        -
        -### Bug Fixes
        -
        -* **streams:** change condition/logic of fitInMemory used when defining memoize ([c173723](https://github.com/npm/make-fetch-happen/commit/c173723))
        -
        -### [6.0.1](https://github.com/npm/make-fetch-happen/compare/v6.0.0...v6.0.1) (2019-10-23)
        -
        -
        -# [6.0.0](https://github.com/npm/make-fetch-happen/compare/v5.0.0...v6.0.0) (2019-10-01)
        -
        -### Bug Fixes
        -
        -* preserve rfc7234 5.5.4 warnings ([001b91e](https://github.com/npm/make-fetch-happen/commit/001b91e))
        -* properly detect thrown HTTP "error" objects ([d7cbeb4](https://github.com/npm/make-fetch-happen/commit/d7cbeb4))
        -* safely create synthetic response body for 304 ([bc70f88](https://github.com/npm/make-fetch-happen/commit/bc70f88))
        -
        -### Features
        -
        -* **promises:** refactor bluebird with native promises ([7482d54](https://github.com/npm/make-fetch-happen/commit/7482d54))
        -
        -### BREAKING CHANGES
        -
        -* **streams:** refactor node streams with minipass ([1d7f5a3](https://github.com/npm/make-fetch-happen/commit/1d7f5a3))
        -
        -
        -# [5.0.0](https://github.com/npm/make-fetch-happen/compare/v4.0.2...v5.0.0) (2019-07-15)
        -
        -
        -### Features
        -
        -* cacache@12, no need for uid/gid opts ([fdb956f](https://github.com/npm/make-fetch-happen/commit/fdb956f))
        -
        -
        -### BREAKING CHANGES
        -
        -* cache uid and gid are inferred from the cache folder itself,
        -not passed in as options.
        -
        -
        -
        -
        -## [4.0.2](https://github.com/npm/make-fetch-happen/compare/v4.0.1...v4.0.2) (2019-07-02)
        -
        -
        -
        -
        -## [4.0.1](https://github.com/npm/make-fetch-happen/compare/v4.0.0...v4.0.1) (2018-04-12)
        -
        -
        -### Bug Fixes
        -
        -* **integrity:** use new sri.match() for verification ([4f371a0](https://github.com/npm/make-fetch-happen/commit/4f371a0))
        -
        -
        -
        -
        -# [4.0.0](https://github.com/npm/make-fetch-happen/compare/v3.0.0...v4.0.0) (2018-04-09)
        -
        -
        -### meta
        -
        -* drop node@4, add node@9 ([7b0191a](https://github.com/npm/make-fetch-happen/commit/7b0191a))
        -
        -
        -### BREAKING CHANGES
        -
        -* node@4 is no longer supported
        -
        -
        -
        -
        -# [3.0.0](https://github.com/npm/make-fetch-happen/compare/v2.6.0...v3.0.0) (2018-03-12)
        -
        -
        -### Bug Fixes
        -
        -* **license:** switch to ISC ([#49](https://github.com/npm/make-fetch-happen/issues/49)) ([bf90c6d](https://github.com/npm/make-fetch-happen/commit/bf90c6d))
        -* **standard:** standard@11 update ([ff0aa70](https://github.com/npm/make-fetch-happen/commit/ff0aa70))
        -
        -
        -### BREAKING CHANGES
        -
        -* **license:** license changed from CC0 to ISC.
        -
        -
        -
        -
        -# [2.6.0](https://github.com/npm/make-fetch-happen/compare/v2.5.0...v2.6.0) (2017-11-14)
        -
        -
        -### Bug Fixes
        -
        -* **integrity:** disable node-fetch compress when checking integrity (#42) ([a7cc74c](https://github.com/npm/make-fetch-happen/commit/a7cc74c))
        -
        -
        -### Features
        -
        -* **onretry:** Add `options.onRetry` (#48) ([f90ccff](https://github.com/npm/make-fetch-happen/commit/f90ccff))
        -
        -
        -
        -
        -# [2.5.0](https://github.com/npm/make-fetch-happen/compare/v2.4.13...v2.5.0) (2017-08-24)
        -
        -
        -### Bug Fixes
        -
        -* **agent:** support timeout durations greater than 30 seconds ([04875ae](https://github.com/npm/make-fetch-happen/commit/04875ae)), closes [#35](https://github.com/npm/make-fetch-happen/issues/35)
        -
        -
        -### Features
        -
        -* **cache:** export cache deletion functionality (#40) ([3da4250](https://github.com/npm/make-fetch-happen/commit/3da4250))
        -
        -
        -
        -
        -## [2.4.13](https://github.com/npm/make-fetch-happen/compare/v2.4.12...v2.4.13) (2017-06-29)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** bump other deps for bugfixes ([eab8297](https://github.com/npm/make-fetch-happen/commit/eab8297))
        -* **proxy:** bump proxy deps with bugfixes (#32) ([632f860](https://github.com/npm/make-fetch-happen/commit/632f860)), closes [#32](https://github.com/npm/make-fetch-happen/issues/32)
        -
        -
        -
        -
        -## [2.4.12](https://github.com/npm/make-fetch-happen/compare/v2.4.11...v2.4.12) (2017-06-06)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** encode x-local-cache-etc headers to be header-safe ([dc9fb1b](https://github.com/npm/make-fetch-happen/commit/dc9fb1b))
        -
        -
        -
        -
        -## [2.4.11](https://github.com/npm/make-fetch-happen/compare/v2.4.10...v2.4.11) (2017-06-05)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** bump deps with ssri fix ([bef1994](https://github.com/npm/make-fetch-happen/commit/bef1994))
        -
        -
        -
        -
        -## [2.4.10](https://github.com/npm/make-fetch-happen/compare/v2.4.9...v2.4.10) (2017-05-31)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** bump dep versions with bugfixes ([0af4003](https://github.com/npm/make-fetch-happen/commit/0af4003))
        -* **proxy:** use auth parameter for proxy authentication (#30) ([c687306](https://github.com/npm/make-fetch-happen/commit/c687306))
        -
        -
        -
        -
        -## [2.4.9](https://github.com/npm/make-fetch-happen/compare/v2.4.8...v2.4.9) (2017-05-25)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** use the passed-in promise for resolving cache stuff ([4c46257](https://github.com/npm/make-fetch-happen/commit/4c46257))
        -
        -
        -
        -
        -## [2.4.8](https://github.com/npm/make-fetch-happen/compare/v2.4.7...v2.4.8) (2017-05-25)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** pass uid/gid/Promise through to cache ([a847c92](https://github.com/npm/make-fetch-happen/commit/a847c92))
        -
        -
        -
        -
        -## [2.4.7](https://github.com/npm/make-fetch-happen/compare/v2.4.6...v2.4.7) (2017-05-24)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** pull in various fixes from deps ([fc2a587](https://github.com/npm/make-fetch-happen/commit/fc2a587))
        -
        -
        -
        -
        -## [2.4.6](https://github.com/npm/make-fetch-happen/compare/v2.4.5...v2.4.6) (2017-05-24)
        -
        -
        -### Bug Fixes
        -
        -* **proxy:** choose agent for http(s)-proxy by protocol of destUrl ([ea4832a](https://github.com/npm/make-fetch-happen/commit/ea4832a))
        -* **proxy:** make socks proxy working ([1de810a](https://github.com/npm/make-fetch-happen/commit/1de810a))
        -* **proxy:** revert previous proxy solution ([563b0d8](https://github.com/npm/make-fetch-happen/commit/563b0d8))
        -
        -
        -
        -
        -## [2.4.5](https://github.com/npm/make-fetch-happen/compare/v2.4.4...v2.4.5) (2017-05-24)
        -
        -
        -### Bug Fixes
        -
        -* **proxy:** use the destination url when determining agent ([1a714e7](https://github.com/npm/make-fetch-happen/commit/1a714e7))
        -
        -
        -
        -
        -## [2.4.4](https://github.com/npm/make-fetch-happen/compare/v2.4.3...v2.4.4) (2017-05-23)
        -
        -
        -### Bug Fixes
        -
        -* **redirect:** handle redirects explicitly  (#27) ([4c4af54](https://github.com/npm/make-fetch-happen/commit/4c4af54))
        -
        -
        -
        -
        -## [2.4.3](https://github.com/npm/make-fetch-happen/compare/v2.4.2...v2.4.3) (2017-05-06)
        -
        -
        -### Bug Fixes
        -
        -* **redirect:** redirects now delete authorization if hosts fail to match ([c071805](https://github.com/npm/make-fetch-happen/commit/c071805))
        -
        -
        -
        -
        -## [2.4.2](https://github.com/npm/make-fetch-happen/compare/v2.4.1...v2.4.2) (2017-05-04)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** reduce race condition window by checking for content ([24544b1](https://github.com/npm/make-fetch-happen/commit/24544b1))
        -* **match:** Rewrite the conditional stream logic (#25) ([66bba4b](https://github.com/npm/make-fetch-happen/commit/66bba4b))
        -
        -
        -
        -
        -## [2.4.1](https://github.com/npm/make-fetch-happen/compare/v2.4.0...v2.4.1) (2017-04-28)
        -
        -
        -### Bug Fixes
        -
        -* **memoization:** missed spots + allow passthrough of memo objs ([ac0cd12](https://github.com/npm/make-fetch-happen/commit/ac0cd12))
        -
        -
        -
        -
        -# [2.4.0](https://github.com/npm/make-fetch-happen/compare/v2.3.0...v2.4.0) (2017-04-28)
        -
        -
        -### Bug Fixes
        -
        -* **memoize:** cacache had a broken memoizer ([8a9ed4c](https://github.com/npm/make-fetch-happen/commit/8a9ed4c))
        -
        -
        -### Features
        -
        -* **memoization:** only slurp stuff into memory if opts.memoize is not false ([0744adc](https://github.com/npm/make-fetch-happen/commit/0744adc))
        -
        -
        -
        -
        -# [2.3.0](https://github.com/npm/make-fetch-happen/compare/v2.2.6...v2.3.0) (2017-04-27)
        -
        -
        -### Features
        -
        -* **agent:** added opts.strictSSL and opts.localAddress ([c35015a](https://github.com/npm/make-fetch-happen/commit/c35015a))
        -* **proxy:** Added opts.noProxy and NO_PROXY support ([f45c915](https://github.com/npm/make-fetch-happen/commit/f45c915))
        -
        -
        -
        -
        -## [2.2.6](https://github.com/npm/make-fetch-happen/compare/v2.2.5...v2.2.6) (2017-04-26)
        -
        -
        -### Bug Fixes
        -
        -* **agent:** check uppercase & lowercase proxy env (#24) ([acf2326](https://github.com/npm/make-fetch-happen/commit/acf2326)), closes [#22](https://github.com/npm/make-fetch-happen/issues/22)
        -* **deps:** switch to node-fetch-npm and stop bundling ([3db603b](https://github.com/npm/make-fetch-happen/commit/3db603b))
        -
        -
        -
        -
        -## [2.2.5](https://github.com/npm/make-fetch-happen/compare/v2.2.4...v2.2.5) (2017-04-23)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** bump cacache and use its size feature ([926c1d3](https://github.com/npm/make-fetch-happen/commit/926c1d3))
        -
        -
        -
        -
        -## [2.2.4](https://github.com/npm/make-fetch-happen/compare/v2.2.3...v2.2.4) (2017-04-18)
        -
        -
        -### Bug Fixes
        -
        -* **integrity:** hash verification issues fixed ([07f9402](https://github.com/npm/make-fetch-happen/commit/07f9402))
        -
        -
        -
        -
        -## [2.2.3](https://github.com/npm/make-fetch-happen/compare/v2.2.2...v2.2.3) (2017-04-18)
        -
        -
        -### Bug Fixes
        -
        -* **staleness:** responses older than 8h were never stale :< ([b54dd75](https://github.com/npm/make-fetch-happen/commit/b54dd75))
        -* **warning:** remove spurious warning, make format more spec-compliant ([2e4f6bb](https://github.com/npm/make-fetch-happen/commit/2e4f6bb))
        -
        -
        -
        -
        -## [2.2.2](https://github.com/npm/make-fetch-happen/compare/v2.2.1...v2.2.2) (2017-04-12)
        -
        -
        -### Bug Fixes
        -
        -* **retry:** stop retrying 404s ([6fafd53](https://github.com/npm/make-fetch-happen/commit/6fafd53))
        -
        -
        -
        -
        -## [2.2.1](https://github.com/npm/make-fetch-happen/compare/v2.2.0...v2.2.1) (2017-04-10)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** move test-only deps to devDeps ([2daaf80](https://github.com/npm/make-fetch-happen/commit/2daaf80))
        -
        -
        -
        -
        -# [2.2.0](https://github.com/npm/make-fetch-happen/compare/v2.1.0...v2.2.0) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** treat caches as private ([57b7dc2](https://github.com/npm/make-fetch-happen/commit/57b7dc2))
        -
        -
        -### Features
        -
        -* **retry:** accept shorthand retry settings ([dfed69d](https://github.com/npm/make-fetch-happen/commit/dfed69d))
        -
        -
        -
        -
        -# [2.1.0](https://github.com/npm/make-fetch-happen/compare/v2.0.4...v2.1.0) (2017-04-09)
        -
        -
        -### Features
        -
        -* **cache:** cache now obeys Age and a variety of other things (#13) ([7b9652d](https://github.com/npm/make-fetch-happen/commit/7b9652d))
        -
        -
        -
        -
        -## [2.0.4](https://github.com/npm/make-fetch-happen/compare/v2.0.3...v2.0.4) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **agent:** accept Request as fetch input, not just strings ([b71669a](https://github.com/npm/make-fetch-happen/commit/b71669a))
        -
        -
        -
        -
        -## [2.0.3](https://github.com/npm/make-fetch-happen/compare/v2.0.2...v2.0.3) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** seriously ([c29e7e7](https://github.com/npm/make-fetch-happen/commit/c29e7e7))
        -
        -
        -
        -
        -## [2.0.2](https://github.com/npm/make-fetch-happen/compare/v2.0.1...v2.0.2) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** use bundleDeps instead ([c36ebf0](https://github.com/npm/make-fetch-happen/commit/c36ebf0))
        -
        -
        -
        -
        -## [2.0.1](https://github.com/npm/make-fetch-happen/compare/v2.0.0...v2.0.1) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** make sure node-fetch tarball included in release ([3bf49d1](https://github.com/npm/make-fetch-happen/commit/3bf49d1))
        -
        -
        -
        -
        -# [2.0.0](https://github.com/npm/make-fetch-happen/compare/v1.7.0...v2.0.0) (2017-04-09)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** manually pull in newer node-fetch to avoid babel prod dep ([66e5e87](https://github.com/npm/make-fetch-happen/commit/66e5e87))
        -* **retry:** be more specific about when we retry ([a47b782](https://github.com/npm/make-fetch-happen/commit/a47b782))
        -
        -
        -### Features
        -
        -* **agent:** add ca/cert/key support to auto-agent (#15) ([57585a7](https://github.com/npm/make-fetch-happen/commit/57585a7))
        -
        -
        -### BREAKING CHANGES
        -
        -* **agent:** pac proxies are no longer supported.
        -* **retry:** Retry logic has changes.
        -
        -* 404s, 420s, and 429s all retry now.
        -* ENOTFOUND no longer retries.
        -* Only ECONNRESET, ECONNREFUSED, EADDRINUSE, ETIMEDOUT, and `request-timeout` errors are retried.
        -
        -
        -
        -
        -# [1.7.0](https://github.com/npm/make-fetch-happen/compare/v1.6.0...v1.7.0) (2017-04-08)
        -
        -
        -### Features
        -
        -* **cache:** add useful headers to inform users about cached data ([9bd7b00](https://github.com/npm/make-fetch-happen/commit/9bd7b00))
        -
        -
        -
        -
        -# [1.6.0](https://github.com/npm/make-fetch-happen/compare/v1.5.1...v1.6.0) (2017-04-06)
        -
        -
        -### Features
        -
        -* **agent:** better, keepalive-supporting, default http agents ([16277f6](https://github.com/npm/make-fetch-happen/commit/16277f6))
        -
        -
        -
        -
        -## [1.5.1](https://github.com/npm/make-fetch-happen/compare/v1.5.0...v1.5.1) (2017-04-05)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** bump cacache for its fixed error messages ([2f2b916](https://github.com/npm/make-fetch-happen/commit/2f2b916))
        -* **cache:** fix handling of errors in cache reads ([5729222](https://github.com/npm/make-fetch-happen/commit/5729222))
        -
        -
        -
        -
        -# [1.5.0](https://github.com/npm/make-fetch-happen/compare/v1.4.0...v1.5.0) (2017-04-04)
        -
        -
        -### Features
        -
        -* **retry:** retry requests on 408 timeouts, too ([8d8b5bd](https://github.com/npm/make-fetch-happen/commit/8d8b5bd))
        -
        -
        -
        -
        -# [1.4.0](https://github.com/npm/make-fetch-happen/compare/v1.3.1...v1.4.0) (2017-04-04)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** stop relying on BB.catch ([2b04494](https://github.com/npm/make-fetch-happen/commit/2b04494))
        -
        -
        -### Features
        -
        -* **retry:** report retry attempt number as extra header ([fd50927](https://github.com/npm/make-fetch-happen/commit/fd50927))
        -
        -
        -
        -
        -## [1.3.1](https://github.com/npm/make-fetch-happen/compare/v1.3.0...v1.3.1) (2017-04-04)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** pretend cache entry is missing on ENOENT ([9c2bb26](https://github.com/npm/make-fetch-happen/commit/9c2bb26))
        -
        -
        -
        -
        -# [1.3.0](https://github.com/npm/make-fetch-happen/compare/v1.2.1...v1.3.0) (2017-04-04)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** if metadata is missing for some odd reason, ignore the entry ([a021a6b](https://github.com/npm/make-fetch-happen/commit/a021a6b))
        -
        -
        -### Features
        -
        -* **cache:** add special headers when request was loaded straight from cache ([8a7dbd1](https://github.com/npm/make-fetch-happen/commit/8a7dbd1))
        -* **cache:** allow configuring algorithms to be calculated on insertion ([bf4a0f2](https://github.com/npm/make-fetch-happen/commit/bf4a0f2))
        -
        -
        -
        -
        -## [1.2.1](https://github.com/npm/make-fetch-happen/compare/v1.2.0...v1.2.1) (2017-04-03)
        -
        -
        -### Bug Fixes
        -
        -* **integrity:** update cacache and ssri and change EBADCHECKSUM -> EINTEGRITY ([b6cf6f6](https://github.com/npm/make-fetch-happen/commit/b6cf6f6))
        -
        -
        -
        -
        -# [1.2.0](https://github.com/npm/make-fetch-happen/compare/v1.1.0...v1.2.0) (2017-04-03)
        -
        -
        -### Features
        -
        -* **integrity:** full Subresource Integrity support (#10) ([a590159](https://github.com/npm/make-fetch-happen/commit/a590159))
        -
        -
        -
        -
        -# [1.1.0](https://github.com/npm/make-fetch-happen/compare/v1.0.1...v1.1.0) (2017-04-01)
        -
        -
        -### Features
        -
        -* **opts:** fetch.defaults() for default options ([522a65e](https://github.com/npm/make-fetch-happen/commit/522a65e))
        -
        -
        -
        -
        -## [1.0.1](https://github.com/npm/make-fetch-happen/compare/v1.0.0...v1.0.1) (2017-04-01)
        -
        -
        -
        -
        -# 1.0.0 (2017-04-01)
        -
        -
        -### Bug Fixes
        -
        -* **cache:** default on cache-control header ([b872a2c](https://github.com/npm/make-fetch-happen/commit/b872a2c))
        -* standard stuff and cache matching ([753f2c2](https://github.com/npm/make-fetch-happen/commit/753f2c2))
        -* **agent:** nudge around things with opts.agent ([ed62b57](https://github.com/npm/make-fetch-happen/commit/ed62b57))
        -* **agent:** {agent: false} has special behavior ([b8cc923](https://github.com/npm/make-fetch-happen/commit/b8cc923))
        -* **cache:** invalidation on non-GET ([fe78fac](https://github.com/npm/make-fetch-happen/commit/fe78fac))
        -* **cache:** make force-cache and only-if-cached work as expected ([f50e9df](https://github.com/npm/make-fetch-happen/commit/f50e9df))
        -* **cache:** more spec compliance ([d5a56db](https://github.com/npm/make-fetch-happen/commit/d5a56db))
        -* **cache:** only cache 200 gets ([0abb25a](https://github.com/npm/make-fetch-happen/commit/0abb25a))
        -* **cache:** only load cache code if cache opt is a string ([250fcd5](https://github.com/npm/make-fetch-happen/commit/250fcd5))
        -* **cache:** oops ([e3fa15a](https://github.com/npm/make-fetch-happen/commit/e3fa15a))
        -* **cache:** refactored warning removal into main file ([5b0a9f9](https://github.com/npm/make-fetch-happen/commit/5b0a9f9))
        -* **cache:** req constructor no longer needed in Cache ([5b74cbc](https://github.com/npm/make-fetch-happen/commit/5b74cbc))
        -* **cache:** standard fetch api calls cacheMode "cache" ([6fba805](https://github.com/npm/make-fetch-happen/commit/6fba805))
        -* **cache:** was using wrong method for non-GET/HEAD cache invalidation ([810763a](https://github.com/npm/make-fetch-happen/commit/810763a))
        -* **caching:** a bunch of cache-related fixes ([8ebda1d](https://github.com/npm/make-fetch-happen/commit/8ebda1d))
        -* **deps:** `cacache[@6](https://github.com/6).3.0` - race condition fixes ([9528442](https://github.com/npm/make-fetch-happen/commit/9528442))
        -* **freshness:** fix regex for cacheControl matching ([070db86](https://github.com/npm/make-fetch-happen/commit/070db86))
        -* **freshness:** fixed default freshness heuristic value ([5d29e88](https://github.com/npm/make-fetch-happen/commit/5d29e88))
        -* **logging:** remove console.log calls ([a1d0a47](https://github.com/npm/make-fetch-happen/commit/a1d0a47))
        -* **method:** node-fetch guarantees uppercase ([a1d68d6](https://github.com/npm/make-fetch-happen/commit/a1d68d6))
        -* **opts:** simplified opts handling ([516fd6e](https://github.com/npm/make-fetch-happen/commit/516fd6e))
        -* **proxy:** pass proxy option directly to ProxyAgent ([3398460](https://github.com/npm/make-fetch-happen/commit/3398460))
        -* **retry:** false -> {retries: 0} ([297fbb6](https://github.com/npm/make-fetch-happen/commit/297fbb6))
        -* **retry:** only retry put if body is not a stream ([a24e599](https://github.com/npm/make-fetch-happen/commit/a24e599))
        -* **retry:** skip retries if body is a stream for ANY method ([780c0f8](https://github.com/npm/make-fetch-happen/commit/780c0f8))
        -
        -
        -### Features
        -
        -* **api:** initial implementation -- can make and cache requests ([7d55b49](https://github.com/npm/make-fetch-happen/commit/7d55b49))
        -* **fetch:** injectable cache, and retry support ([87b84bf](https://github.com/npm/make-fetch-happen/commit/87b84bf))
        -
        -
        -### BREAKING CHANGES
        -
        -* **cache:** opts.cache -> opts.cacheManager; opts.cacheMode -> opts.cache
        -* **fetch:** opts.cache accepts a Cache-like obj or a path. Requests are now retried.
        -* **api:** actual api implemented
        diff --git a/deps/npm/node_modules/make-fetch-happen/README.md b/deps/npm/node_modules/make-fetch-happen/README.md
        index f454469e68508c..87659c9133bd5b 100644
        --- a/deps/npm/node_modules/make-fetch-happen/README.md
        +++ b/deps/npm/node_modules/make-fetch-happen/README.md
        @@ -20,7 +20,7 @@ pooling, proxies, retries, [and more](#features)!
           * [`fetch.defaults`](#fetch-defaults)
           * [`minipass-fetch` options](#minipass-fetch-options)
           * [`make-fetch-happen` options](#extra-options)
        -    * [`opts.cacheManager`](#opts-cache-manager)
        +    * [`opts.cachePath`](#opts-cache-path)
             * [`opts.cache`](#opts-cache)
             * [`opts.proxy`](#opts-proxy)
             * [`opts.noProxy`](#opts-no-proxy)
        @@ -35,7 +35,7 @@ pooling, proxies, retries, [and more](#features)!
         
         ```javascript
         const fetch = require('make-fetch-happen').defaults({
        -  cacheManager: './my-cache' // path where cache will be written (and read)
        +  cachePath: './my-cache' // path where cache will be written (and read)
         })
         
         fetch('https://registry.npmjs.org/make-fetch-happen').then(res => {
        @@ -103,7 +103,7 @@ A defaulted `fetch` will also have a `.defaults()` method, so they can be chaine
         
         ```javascript
         const fetch = require('make-fetch-happen').defaults({
        -  cacheManager: './my-local-cache'
        +  cachePath: './my-local-cache'
         })
         
         fetch('https://registry.npmjs.org/make-fetch-happen') // will always use the cache
        @@ -136,7 +136,7 @@ For more details, see [the documentation for `minipass-fetch` itself](https://gi
         
         make-fetch-happen augments the `minipass-fetch` API with additional features available through extra options. The following extra options are available:
         
        -* [`opts.cacheManager`](#opts-cache-manager) - Cache target to read/write
        +* [`opts.cachePath`](#opts-cache-path) - Cache target to read/write
         * [`opts.cache`](#opts-cache) - `fetch` cache mode. Controls cache *behavior*.
         * [`opts.proxy`](#opts-proxy) - Proxy agent
         * [`opts.noProxy`](#opts-no-proxy) - Domain segments to disable proxying for.
        @@ -147,15 +147,9 @@ make-fetch-happen augments the `minipass-fetch` API with additional features ava
         * [`opts.onRetry`](#opts-onretry) - a function called whenever a retry is attempted
         * [`opts.integrity`](#opts-integrity) - [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) metadata.
         
        -####  `> opts.cacheManager`
        +####  `> opts.cachePath`
         
        -Either a `String` or a `Cache`. If the former, it will be assumed to be a `Path` to be used as the cache root for [`cacache`](https://npm.im/cacache).
        -
        -If an object is provided, it will be assumed to be a compliant [`Cache` instance](https://developer.mozilla.org/en-US/docs/Web/API/Cache). Only `Cache.match()`, `Cache.put()`, and `Cache.delete()` are required. Options objects will not be passed in to `match()` or `delete()`.
        -
        -By implementing this API, you can customize the storage backend for make-fetch-happen itself -- for example, you could implement a cache that uses `redis` for caching, or simply keeps everything in memory. Most of the caching logic exists entirely on the make-fetch-happen side, so the only thing you need to worry about is reading, writing, and deleting, as well as making sure `fetch.Response` objects are what gets returned.
        -
        -You can refer to `cache.js` in the make-fetch-happen source code for a reference implementation.
        +A string `Path` to be used as the cache root for [`cacache`](https://npm.im/cacache).
         
         **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.
         
        @@ -163,7 +157,9 @@ The default cache manager also adds the following headers to cached responses:
         
         * `X-Local-Cache`: Path to the cache the content was found in
         * `X-Local-Cache-Key`: Unique cache entry key for this response
        +* `X-Local-Cache-Mode`: Either `stream` or `buffer` to indicate how the response was read from cacache
         * `X-Local-Cache-Hash`: Specific integrity hash for the cached entry
        +* `X-Local-Cache-Status`: One of `miss`, `hit`, `stale`, `revalidated`, `updated`, or `skip` to signal how the response was created
         * `X-Local-Cache-Time`: UTCString of the cache insertion time for the entry
         
         Using [`cacache`](https://npm.im/cacache), a call like this may be used to
        @@ -181,12 +177,8 @@ cacache.get.byDigest(h.get('x-local-cache'), h.get('x-local-cache-hash'))
         
         ```javascript
         fetch('https://registry.npmjs.org/make-fetch-happen', {
        -  cacheManager: './my-local-cache'
        +  cachePath: './my-local-cache'
         }) // -> 200-level response will be written to disk
        -
        -fetch('https://npm.im/cacache', {
        -  cacheManager: new MyCustomRedisCache(process.env.PORT)
        -}) // -> 200-level response will be written to redis
         ```
         
         A possible (minimal) implementation for `MyCustomRedisCache`:
        @@ -230,7 +222,7 @@ class MyCustomRedisCache {
         
         ####  `> opts.cache`
         
        -This option follows the standard `fetch` API cache option. This option will do nothing if [`opts.cacheManager`](#opts-cache-manager) is null. The following values are accepted (as strings):
        +This 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):
         
         * `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.
         * `no-store` - Fetch behaves as if there is no HTTP cache at all.
        @@ -245,7 +237,7 @@ This option follows the standard `fetch` API cache option. This option will do n
         
         ```javascript
         const fetch = require('make-fetch-happen').defaults({
        -  cacheManager: './my-cache'
        +  cachePath: './my-cache'
         })
         
         // Will error with ENOTCACHED if we haven't already cached this url
        @@ -330,7 +322,6 @@ An object that can be used to tune request retry settings. Retries will only be
         The following are worth noting as explicitly not retried:
         
         * `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.
        -* `ECONNRESET` currently has no support for restarting. It will eventually be supported but requires a bit more juggling due to streaming.
         
         If `opts.retry` is `false`, it is equivalent to `{retries: 0}`
         
        diff --git a/deps/npm/node_modules/make-fetch-happen/cache.js b/deps/npm/node_modules/make-fetch-happen/cache.js
        deleted file mode 100644
        index 234e3a41d0519a..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/cache.js
        +++ /dev/null
        @@ -1,260 +0,0 @@
        -'use strict'
        -
        -const fetch = require('minipass-fetch')
        -const cacache = require('cacache')
        -const ssri = require('ssri')
        -const url = require('url')
        -
        -const Minipass = require('minipass')
        -const MinipassFlush = require('minipass-flush')
        -const MinipassCollect = require('minipass-collect')
        -const MinipassPipeline = require('minipass-pipeline')
        -
        -const MAX_MEM_SIZE = 5 * 1024 * 1024 // 5MB
        -
        -// some headers should never be stored in the cache, either because
        -// they're a security footgun to leave lying around, or because we
        -// just don't need them taking up space.
        -// set to undefined so they're omitted from the JSON.stringify
        -const pruneHeaders = {
        -  authorization: undefined,
        -  'npm-session': undefined,
        -  'set-cookie': undefined,
        -  'cf-ray': undefined,
        -  'cf-cache-status': undefined,
        -  'cf-request-id': undefined,
        -  'x-fetch-attempts': undefined,
        -}
        -
        -function cacheKey (req) {
        -  const parsed = new url.URL(req.url)
        -  return `make-fetch-happen:request-cache:${
        -    url.format({
        -      protocol: parsed.protocol,
        -      slashes: true,
        -      port: parsed.port,
        -      hostname: parsed.hostname,
        -      pathname: parsed.pathname,
        -      search: parsed.search,
        -    })
        -  }`
        -}
        -
        -// This is a cacache-based implementation of the Cache standard,
        -// using node-fetch.
        -// docs: https://developer.mozilla.org/en-US/docs/Web/API/Cache
        -//
        -module.exports = class Cache {
        -  constructor (path, opts) {
        -    this._path = path
        -    this.Promise = (opts && opts.Promise) || Promise
        -  }
        -
        -  static get pruneHeaders () {
        -    // exposed for testing, not modifiable
        -    return { ...pruneHeaders }
        -  }
        -
        -  // Returns a Promise that resolves to the response associated with the first
        -  // matching request in the Cache object.
        -  match (req, opts) {
        -    const key = cacheKey(req)
        -    return cacache.get.info(this._path, key).then(info => {
        -      return info && cacache.get.hasContent(
        -        this._path, info.integrity, opts
        -      ).then(exists => exists && info)
        -    }).then(info => {
        -      if (info && info.metadata && matchDetails(req, {
        -        url: info.metadata.url,
        -        reqHeaders: new fetch.Headers(info.metadata.reqHeaders),
        -        resHeaders: new fetch.Headers(info.metadata.resHeaders),
        -        cacheIntegrity: info.integrity,
        -        integrity: opts && opts.integrity,
        -      })) {
        -        const resHeaders = new fetch.Headers(info.metadata.resHeaders)
        -        addCacheHeaders(resHeaders, this._path, key, info.integrity, info.time)
        -        if (req.method === 'HEAD') {
        -          return new fetch.Response(null, {
        -            url: req.url,
        -            headers: resHeaders,
        -            status: 200,
        -          })
        -        }
        -        const cachePath = this._path
        -        // avoid opening cache file handles until a user actually tries to
        -        // read from it.
        -        const body = new Minipass()
        -        const fitInMemory = info.size < MAX_MEM_SIZE
        -        const removeOnResume = () => body.removeListener('resume', onResume)
        -        const onResume =
        -          opts.memoize !== false && fitInMemory
        -            ? () => {
        -              const c = cacache.get.stream.byDigest(cachePath, info.integrity, {
        -                memoize: opts.memoize,
        -              })
        -              c.on('error', /* istanbul ignore next */ err => {
        -                body.emit('error', err)
        -              })
        -              c.pipe(body)
        -            }
        -            : () => {
        -              removeOnResume()
        -              cacache.get.byDigest(cachePath, info.integrity, {
        -                memoize: opts.memoize,
        -              })
        -                .then(data => body.end(data))
        -                .catch(/* istanbul ignore next */ err => {
        -                  body.emit('error', err)
        -                })
        -            }
        -        body.once('resume', onResume)
        -        body.once('end', () => removeOnResume)
        -        return this.Promise.resolve(new fetch.Response(body, {
        -          url: req.url,
        -          headers: resHeaders,
        -          status: 200,
        -          size: info.size,
        -        }))
        -      }
        -    })
        -  }
        -
        -  // Takes both a request and its response and adds it to the given cache.
        -  put (req, response, opts) {
        -    opts = opts || {}
        -    const size = response.headers.get('content-length')
        -    const fitInMemory = !!size && opts.memoize !== false && size < MAX_MEM_SIZE
        -    const ckey = cacheKey(req)
        -    const cacheOpts = {
        -      algorithms: opts.algorithms,
        -      metadata: {
        -        url: req.url,
        -        reqHeaders: {
        -          ...req.headers.raw(),
        -          ...pruneHeaders,
        -        },
        -        resHeaders: {
        -          ...response.headers.raw(),
        -          ...pruneHeaders,
        -        },
        -      },
        -      size,
        -      memoize: fitInMemory && opts.memoize,
        -    }
        -    if (req.method === 'HEAD' || response.status === 304) {
        -      // Update metadata without writing
        -      return cacache.get.info(this._path, ckey).then(info => {
        -        // Providing these will bypass content write
        -        cacheOpts.integrity = info.integrity
        -        addCacheHeaders(
        -          response.headers, this._path, ckey, info.integrity, info.time
        -        )
        -
        -        return new MinipassPipeline(
        -          cacache.get.stream.byDigest(this._path, info.integrity, cacheOpts),
        -          cacache.put.stream(this._path, ckey, cacheOpts)
        -        ).promise().then(() => {
        -          return response
        -        })
        -      })
        -    }
        -    const oldBody = response.body
        -    // the flush is the last thing in the pipeline.  Build the pipeline
        -    // back-to-front so we don't consume the data before we use it!
        -    // We unshift in either a tee-stream to the cache put stream,
        -    // or a collecter that dumps it to cache in one go, then the
        -    // old body to bring in the data.
        -    const newBody = new MinipassPipeline(new MinipassFlush({
        -      flush () {
        -        return cacheWritePromise
        -      },
        -    }))
        -
        -    let cacheWriteResolve, cacheWriteReject
        -    const cacheWritePromise = new Promise((resolve, reject) => {
        -      cacheWriteResolve = resolve
        -      cacheWriteReject = reject
        -    })
        -    const cachePath = this._path
        -
        -    if (fitInMemory) {
        -      const collecter = new MinipassCollect.PassThrough()
        -      collecter.on('collect', data => {
        -        cacache.put(
        -          cachePath,
        -          ckey,
        -          data,
        -          cacheOpts
        -        ).then(cacheWriteResolve, cacheWriteReject)
        -      })
        -      newBody.unshift(collecter)
        -    } else {
        -      const tee = new Minipass()
        -      const cacheStream = cacache.put.stream(
        -        cachePath,
        -        ckey,
        -        cacheOpts
        -      )
        -      tee.pipe(cacheStream)
        -      cacheStream.promise().then(cacheWriteResolve, cacheWriteReject)
        -      newBody.unshift(tee)
        -    }
        -
        -    newBody.unshift(oldBody)
        -    return Promise.resolve(new fetch.Response(newBody, response))
        -  }
        -
        -  // Finds the Cache entry whose key is the request, and if found, deletes the
        -  // Cache entry and returns a Promise that resolves to true. If no Cache entry
        -  // is found, it returns false.
        -  'delete' (req, opts) {
        -    opts = opts || {}
        -    if (typeof opts.memoize === 'object') {
        -      if (opts.memoize.reset)
        -        opts.memoize.reset()
        -      else if (opts.memoize.clear)
        -        opts.memoize.clear()
        -      else {
        -        Object.keys(opts.memoize).forEach(k => {
        -          opts.memoize[k] = null
        -        })
        -      }
        -    }
        -    return cacache.rm.entry(
        -      this._path,
        -      cacheKey(req)
        -    // TODO - true/false
        -    ).then(() => false)
        -  }
        -}
        -
        -function matchDetails (req, cached) {
        -  const reqUrl = new url.URL(req.url)
        -  const cacheUrl = new url.URL(cached.url)
        -  const vary = cached.resHeaders.get('Vary')
        -  // https://tools.ietf.org/html/rfc7234#section-4.1
        -  if (vary) {
        -    if (vary.match(/\*/))
        -      return false
        -    else {
        -      const fieldsMatch = vary.split(/\s*,\s*/).every(field => {
        -        return cached.reqHeaders.get(field) === req.headers.get(field)
        -      })
        -      if (!fieldsMatch)
        -        return false
        -    }
        -  }
        -  if (cached.integrity)
        -    return ssri.parse(cached.integrity).match(cached.cacheIntegrity)
        -
        -  reqUrl.hash = null
        -  cacheUrl.hash = null
        -  return url.format(reqUrl) === url.format(cacheUrl)
        -}
        -
        -function addCacheHeaders (resHeaders, path, key, hash, time) {
        -  resHeaders.set('X-Local-Cache', encodeURIComponent(path))
        -  resHeaders.set('X-Local-Cache-Key', encodeURIComponent(key))
        -  resHeaders.set('X-Local-Cache-Hash', encodeURIComponent(hash))
        -  resHeaders.set('X-Local-Cache-Time', new Date(time).toUTCString())
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/index.js b/deps/npm/node_modules/make-fetch-happen/index.js
        deleted file mode 100644
        index 54f72049c1d52b..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/index.js
        +++ /dev/null
        @@ -1,457 +0,0 @@
        -'use strict'
        -
        -const url = require('url')
        -const fetch = require('minipass-fetch')
        -const pkg = require('./package.json')
        -const retry = require('promise-retry')
        -let ssri
        -
        -const Minipass = require('minipass')
        -const MinipassPipeline = require('minipass-pipeline')
        -const getAgent = require('./agent')
        -const setWarning = require('./warning')
        -
        -const configureOptions = require('./utils/configure-options')
        -const iterableToObject = require('./utils/iterable-to-object')
        -const makePolicy = require('./utils/make-policy')
        -
        -const isURL = /^https?:/
        -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})`
        -
        -const RETRY_ERRORS = [
        -  'ECONNRESET', // remote socket closed on us
        -  'ECONNREFUSED', // remote host refused to open connection
        -  'EADDRINUSE', // failed to bind to a local port (proxy?)
        -  'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW
        -  // Known codes we do NOT retry on:
        -  // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline)
        -]
        -
        -const RETRY_TYPES = [
        -  'request-timeout',
        -]
        -
        -// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch
        -module.exports = cachingFetch
        -cachingFetch.defaults = function (_uri, _opts) {
        -  const fetch = this
        -  if (typeof _uri === 'object') {
        -    _opts = _uri
        -    _uri = null
        -  }
        -
        -  function defaultedFetch (uri, opts) {
        -    const finalOpts = Object.assign({}, _opts || {}, opts || {})
        -    return fetch(uri || _uri, finalOpts)
        -  }
        -
        -  defaultedFetch.defaults = fetch.defaults
        -  defaultedFetch.delete = fetch.delete
        -  return defaultedFetch
        -}
        -
        -cachingFetch.delete = cacheDelete
        -function cacheDelete (uri, opts) {
        -  opts = configureOptions(opts)
        -  if (opts.cacheManager) {
        -    const req = new fetch.Request(uri, {
        -      method: opts.method,
        -      headers: opts.headers,
        -    })
        -    return opts.cacheManager.delete(req, opts)
        -  }
        -}
        -
        -function initializeSsri () {
        -  if (!ssri)
        -    ssri = require('ssri')
        -}
        -
        -function cachingFetch (uri, _opts) {
        -  const opts = configureOptions(_opts)
        -
        -  if (opts.integrity) {
        -    initializeSsri()
        -    // if verifying integrity, fetch must not decompress
        -    opts.compress = false
        -  }
        -
        -  const isCachable = (
        -    (
        -      opts.method === 'GET' ||
        -      opts.method === 'HEAD'
        -    ) &&
        -      Boolean(opts.cacheManager) &&
        -      opts.cache !== 'no-store' &&
        -      opts.cache !== 'reload'
        -  )
        -
        -  if (isCachable) {
        -    const req = new fetch.Request(uri, {
        -      method: opts.method,
        -      headers: opts.headers,
        -    })
        -
        -    return opts.cacheManager.match(req, opts).then(res => {
        -      if (res) {
        -        const warningCode = (res.headers.get('Warning') || '').match(/^\d+/)
        -        if (warningCode && +warningCode >= 100 && +warningCode < 200) {
        -          // https://tools.ietf.org/html/rfc7234#section-4.3.4
        -          //
        -          // If a stored response is selected for update, the cache MUST:
        -          //
        -          // * delete any Warning header fields in the stored response with
        -          //   warn-code 1xx (see Section 5.5);
        -          //
        -          // * retain any Warning header fields in the stored response with
        -          //   warn-code 2xx;
        -          //
        -          res.headers.delete('Warning')
        -        }
        -
        -        if (opts.cache === 'default' && !isStale(req, res))
        -          return res
        -
        -        if (opts.cache === 'default' || opts.cache === 'no-cache')
        -          return conditionalFetch(req, res, opts)
        -
        -        if (opts.cache === 'force-cache' || opts.cache === 'only-if-cached') {
        -          //   112 Disconnected operation
        -          // SHOULD be included if the cache is intentionally disconnected from
        -          // the rest of the network for a period of time.
        -          // (https://tools.ietf.org/html/rfc2616#section-14.46)
        -          setWarning(res, 112, 'Disconnected operation')
        -          return res
        -        }
        -      }
        -
        -      if (!res && opts.cache === 'only-if-cached') {
        -        const errorMsg = `request to ${
        -          uri
        -        } failed: cache mode is 'only-if-cached' but no cached response available.`
        -
        -        const err = new Error(errorMsg)
        -        err.code = 'ENOTCACHED'
        -        throw err
        -      }
        -
        -      // Missing cache entry, or mode is default (if stale), reload, no-store
        -      return remoteFetch(req.url, opts)
        -    })
        -  }
        -  return remoteFetch(uri, opts)
        -}
        -
        -// https://tools.ietf.org/html/rfc7234#section-4.2
        -function isStale (req, res) {
        -  const _req = {
        -    url: req.url,
        -    method: req.method,
        -    headers: iterableToObject(req.headers),
        -  }
        -
        -  const policy = makePolicy(req, res)
        -
        -  const responseTime = res.headers.get('x-local-cache-time') ||
        -    /* istanbul ignore next - would be weird to get a 'stale'
        -     * response that didn't come from cache with a cache time header */
        -    (res.headers.get('date') || 0)
        -
        -  policy._responseTime = new Date(responseTime)
        -
        -  const bool = !policy.satisfiesWithoutRevalidation(_req)
        -  const headers = policy.responseHeaders()
        -  if (headers.warning && /^113\b/.test(headers.warning)) {
        -    // Possible to pick up a rfc7234 warning at this point.
        -    // This is kind of a weird place to stick this, should probably go
        -    // in cachingFetch.  But by putting it here, we save an extra
        -    // CachePolicy object construction.
        -    res.headers.append('warning', headers.warning)
        -  }
        -  return bool
        -}
        -
        -function mustRevalidate (res) {
        -  return (res.headers.get('cache-control') || '').match(/must-revalidate/i)
        -}
        -
        -function conditionalFetch (req, cachedRes, opts) {
        -  const _req = {
        -    url: req.url,
        -    method: req.method,
        -    headers: Object.assign({}, opts.headers || {}),
        -  }
        -
        -  const policy = makePolicy(req, cachedRes)
        -  opts.headers = policy.revalidationHeaders(_req)
        -
        -  return remoteFetch(req.url, opts)
        -    .then(condRes => {
        -      const revalidatedPolicy = policy.revalidatedPolicy(_req, {
        -        status: condRes.status,
        -        headers: iterableToObject(condRes.headers),
        -      })
        -
        -      if (condRes.status >= 500 && !mustRevalidate(cachedRes)) {
        -        //   111 Revalidation failed
        -        // MUST be included if a cache returns a stale response because an
        -        // attempt to revalidate the response failed, due to an inability to
        -        // reach the server.
        -        // (https://tools.ietf.org/html/rfc2616#section-14.46)
        -        setWarning(cachedRes, 111, 'Revalidation failed')
        -        return cachedRes
        -      }
        -
        -      if (condRes.status === 304) { // 304 Not Modified
        -        // Create a synthetic response from the cached body and original req
        -        const synthRes = new fetch.Response(cachedRes.body, condRes)
        -        return opts.cacheManager.put(req, synthRes, opts)
        -          .then(newRes => {
        -            // Get the list first, because if we delete while iterating,
        -            // it'll throw off the count and not make it through all
        -            // of them.
        -            const newHeaders = revalidatedPolicy.policy.responseHeaders()
        -            const toDelete = [...newRes.headers.keys()]
        -              .filter(k => !newHeaders[k])
        -            for (const key of toDelete)
        -              newRes.headers.delete(key)
        -
        -            for (const [key, val] of Object.entries(newHeaders))
        -              newRes.headers.set(key, val)
        -
        -            return newRes
        -          })
        -      }
        -
        -      return condRes
        -    })
        -    .then(res => res)
        -    .catch(err => {
        -      if (mustRevalidate(cachedRes))
        -        throw err
        -      else {
        -        //   111 Revalidation failed
        -        // MUST be included if a cache returns a stale response because an
        -        // attempt to revalidate the response failed, due to an inability to
        -        // reach the server.
        -        // (https://tools.ietf.org/html/rfc2616#section-14.46)
        -        setWarning(cachedRes, 111, 'Revalidation failed')
        -        //   199 Miscellaneous warning
        -        // The warning text MAY include arbitrary information to be presented to
        -        // a human user, or logged. A system receiving this warning MUST NOT take
        -        // any automated action, besides presenting the warning to the user.
        -        // (https://tools.ietf.org/html/rfc2616#section-14.46)
        -        setWarning(
        -          cachedRes,
        -          199,
        -          `Miscellaneous Warning ${err.code}: ${err.message}`
        -        )
        -
        -        return cachedRes
        -      }
        -    })
        -}
        -
        -function remoteFetchHandleIntegrity (res, integrity) {
        -  if (res.status !== 200)
        -    return res // Error responses aren't subject to integrity checks.
        -
        -  const oldBod = res.body
        -  const newBod = ssri.integrityStream({
        -    integrity,
        -  })
        -  return new fetch.Response(new MinipassPipeline(oldBod, newBod), res)
        -}
        -
        -function remoteFetch (uri, opts) {
        -  const agent = getAgent(uri, opts)
        -  const headers = opts.headers instanceof fetch.Headers
        -    ? opts.headers
        -    : new fetch.Headers(opts.headers)
        -  if (!headers.get('connection'))
        -    headers.set('connection', agent ? 'keep-alive' : 'close')
        -
        -  if (!headers.get('user-agent'))
        -    headers.set('user-agent', USER_AGENT)
        -
        -  const reqOpts = {
        -    agent,
        -    body: opts.body,
        -    compress: opts.compress,
        -    follow: opts.follow,
        -    headers,
        -    method: opts.method,
        -    redirect: 'manual',
        -    size: opts.size,
        -    counter: opts.counter,
        -    timeout: opts.timeout,
        -    ca: opts.ca,
        -    cert: opts.cert,
        -    key: opts.key,
        -    rejectUnauthorized: opts.strictSSL,
        -  }
        -
        -  return retry(
        -    (retryHandler, attemptNum) => {
        -      const req = new fetch.Request(uri, reqOpts)
        -      return fetch(req)
        -        .then((res) => {
        -          if (opts.integrity)
        -            res = remoteFetchHandleIntegrity(res, opts.integrity)
        -
        -          res.headers.set('x-fetch-attempts', attemptNum)
        -
        -          const isStream = Minipass.isStream(req.body)
        -
        -          if (opts.cacheManager) {
        -            const isMethodGetHead = (
        -              req.method === 'GET' ||
        -              req.method === 'HEAD'
        -            )
        -
        -            const isCachable = (
        -              opts.cache !== 'no-store' &&
        -              isMethodGetHead &&
        -              makePolicy(req, res).storable() &&
        -              res.status === 200 // No other statuses should be stored!
        -            )
        -
        -            if (isCachable)
        -              return opts.cacheManager.put(req, res, opts)
        -
        -            if (!isMethodGetHead) {
        -              return opts.cacheManager.delete(req).then(() => {
        -                if (res.status >= 500 && req.method !== 'POST' && !isStream) {
        -                  if (typeof opts.onRetry === 'function')
        -                    opts.onRetry(res)
        -
        -                  return retryHandler(res)
        -                }
        -
        -                return res
        -              })
        -            }
        -          }
        -
        -          const isRetriable = (
        -            req.method !== 'POST' &&
        -            !isStream &&
        -            (
        -              res.status === 408 || // Request Timeout
        -              res.status === 420 || // Enhance Your Calm (usually Twitter rate-limit)
        -              res.status === 429 || // Too Many Requests ("standard" rate-limiting)
        -              res.status >= 500 // Assume server errors are momentary hiccups
        -            )
        -          )
        -
        -          if (isRetriable) {
        -            if (typeof opts.onRetry === 'function')
        -              opts.onRetry(res)
        -
        -            return retryHandler(res)
        -          }
        -
        -          if (!fetch.isRedirect(res.status))
        -            return res
        -
        -          if (opts.redirect === 'manual')
        -            return res
        -
        -          // if (!fetch.isRedirect(res.status) || opts.redirect === 'manual') {
        -          //   return res
        -          // }
        -
        -          // handle redirects - matches behavior of fetch: https://github.com/bitinn/node-fetch
        -          if (opts.redirect === 'error') {
        -            const err = new fetch.FetchError(`redirect mode is set to error: ${uri}`, 'no-redirect', { code: 'ENOREDIRECT' })
        -            throw err
        -          }
        -
        -          if (!res.headers.get('location')) {
        -            const err = new fetch.FetchError(`redirect location header missing at: ${uri}`, 'no-location', { code: 'EINVALIDREDIRECT' })
        -            throw err
        -          }
        -
        -          if (req.counter >= req.follow) {
        -            const err = new fetch.FetchError(`maximum redirect reached at: ${uri}`, 'max-redirect', { code: 'EMAXREDIRECT' })
        -            throw err
        -          }
        -
        -          const resolvedUrlParsed = new url.URL(res.headers.get('location'), req.url)
        -          const resolvedUrl = url.format(resolvedUrlParsed)
        -          const redirectURL = (isURL.test(res.headers.get('location')))
        -            ? new url.URL(res.headers.get('location'))
        -            : resolvedUrlParsed
        -
        -          // Comment below is used under the following license:
        -          // Copyright (c) 2010-2012 Mikeal Rogers
        -          // Licensed under the Apache License, Version 2.0 (the "License");
        -          // you may not use this file except in compliance with the License.
        -          // You may obtain a copy of the License at
        -          // http://www.apache.org/licenses/LICENSE-2.0
        -          // Unless required by applicable law or agreed to in writing,
        -          // software distributed under the License is distributed on an "AS
        -          // IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
        -          // express or implied. See the License for the specific language
        -          // governing permissions and limitations under the License.
        -
        -          // Remove authorization if changing hostnames (but not if just
        -          // changing ports or protocols).  This matches the behavior of request:
        -          // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138
        -          if (new url.URL(req.url).hostname !== redirectURL.hostname)
        -            req.headers.delete('authorization')
        -
        -          // for POST request with 301/302 response, or any request with 303 response,
        -          // use GET when following redirect
        -          if (
        -            res.status === 303 ||
        -            (
        -              req.method === 'POST' &&
        -              (
        -                res.status === 301 ||
        -                res.status === 302
        -              )
        -            )
        -          ) {
        -            opts.method = 'GET'
        -            opts.body = null
        -            req.headers.delete('content-length')
        -          }
        -
        -          opts.headers = {}
        -          req.headers.forEach((value, name) => {
        -            opts.headers[name] = value
        -          })
        -
        -          opts.counter = ++req.counter
        -          return cachingFetch(resolvedUrl, opts)
        -        })
        -        .catch(err => {
        -          const code = (err.code === 'EPROMISERETRY')
        -            ? err.retried.code
        -            : err.code
        -
        -          const isRetryError = (
        -            RETRY_ERRORS.indexOf(code) === -1 &&
        -            RETRY_TYPES.indexOf(err.type) === -1
        -          )
        -
        -          if (req.method === 'POST' || isRetryError)
        -            throw err
        -
        -          if (typeof opts.onRetry === 'function')
        -            opts.onRetry(err)
        -
        -          return retryHandler(err)
        -        })
        -    },
        -    opts.retry
        -  ).catch(err => {
        -    if (err.status >= 400 && err.type !== 'system') {
        -      // this is an HTTP response "error" that we care about
        -      return err
        -    }
        -
        -    throw err
        -  })
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/agent.js b/deps/npm/node_modules/make-fetch-happen/lib/agent.js
        similarity index 88%
        rename from deps/npm/node_modules/make-fetch-happen/agent.js
        rename to deps/npm/node_modules/make-fetch-happen/lib/agent.js
        index e27eb4f3a801da..873d69cf4760b8 100644
        --- a/deps/npm/node_modules/make-fetch-happen/agent.js
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/agent.js
        @@ -4,8 +4,8 @@ const url = require('url')
         const isLambda = require('is-lambda')
         
         const AGENT_CACHE = new LRU({ max: 50 })
        -let HttpsAgent
        -let HttpAgent
        +const HttpAgent = require('agentkeepalive')
        +const HttpsAgent = HttpAgent.HttpsAgent
         
         module.exports = getAgent
         
        @@ -66,11 +66,6 @@ function getAgent (uri, opts) {
             return proxy
           }
         
        -  if (!HttpsAgent) {
        -    HttpAgent = require('agentkeepalive')
        -    HttpsAgent = HttpAgent.HttpsAgent
        -  }
        -
           const agent = isHttps ? new HttpsAgent({
             maxSockets: agentMaxSockets,
             ca: opts.ca,
        @@ -155,15 +150,15 @@ function getProxyUri (uri, opts) {
         }
         
         const getAuth = u =>
        -  u.username && u.password ? `${u.username}:${u.password}`
        -  : u.username ? u.username
        +  u.username && u.password ? decodeURIComponent(`${u.username}:${u.password}`)
        +  : u.username ? decodeURIComponent(u.username)
           : null
         
         const getPath = u => u.pathname + u.search + u.hash
         
        -let HttpProxyAgent
        -let HttpsProxyAgent
        -let SocksProxyAgent
        +const HttpProxyAgent = require('http-proxy-agent')
        +const HttpsProxyAgent = require('https-proxy-agent')
        +const SocksProxyAgent = require('socks-proxy-agent')
         module.exports.getProxy = getProxy
         function getProxy (proxyUrl, opts, isHttps) {
           const popts = {
        @@ -182,23 +177,13 @@ function getProxy (proxyUrl, opts, isHttps) {
           }
         
           if (proxyUrl.protocol === 'http:' || proxyUrl.protocol === 'https:') {
        -    if (!isHttps) {
        -      if (!HttpProxyAgent)
        -        HttpProxyAgent = require('http-proxy-agent')
        -
        +    if (!isHttps)
               return new HttpProxyAgent(popts)
        -    } else {
        -      if (!HttpsProxyAgent)
        -        HttpsProxyAgent = require('https-proxy-agent')
        -
        +    else
               return new HttpsProxyAgent(popts)
        -    }
        -  } else if (proxyUrl.protocol.startsWith('socks')) {
        -    if (!SocksProxyAgent)
        -      SocksProxyAgent = require('socks-proxy-agent')
        -
        +  } else if (proxyUrl.protocol.startsWith('socks'))
             return new SocksProxyAgent(popts)
        -  } else {
        +  else {
             throw Object.assign(
               new Error(`unsupported proxy protocol: '${proxyUrl.protocol}'`),
               {
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/make-fetch-happen/lib/cache/entry.js
        new file mode 100644
        index 00000000000000..0df006fe34a3fc
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/cache/entry.js
        @@ -0,0 +1,432 @@
        +const { Request, Response } = require('minipass-fetch')
        +const Minipass = require('minipass')
        +const MinipassCollect = require('minipass-collect')
        +const MinipassFlush = require('minipass-flush')
        +const MinipassPipeline = require('minipass-pipeline')
        +const cacache = require('cacache')
        +const url = require('url')
        +
        +const CachePolicy = require('./policy.js')
        +const cacheKey = require('./key.js')
        +const remote = require('../remote.js')
        +
        +const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
        +
        +// maximum amount of data we will buffer into memory
        +// if we'll exceed this, we switch to streaming
        +const MAX_MEM_SIZE = 5 * 1024 * 1024 // 5MB
        +
        +// allow list for request headers that will be written to the cache index
        +// note: we will also store any request headers
        +// that are named in a response's vary header
        +const KEEP_REQUEST_HEADERS = [
        +  'accept-charset',
        +  'accept-encoding',
        +  'accept-language',
        +  'accept',
        +  'cache-control',
        +]
        +
        +// allow list for response headers that will be written to the cache index
        +// note: we must not store the real response's age header, or when we load
        +// a cache policy based on the metadata it will think the cached response
        +// is always stale
        +const KEEP_RESPONSE_HEADERS = [
        +  'cache-control',
        +  'content-encoding',
        +  'content-language',
        +  'content-type',
        +  'date',
        +  'etag',
        +  'expires',
        +  'last-modified',
        +  'location',
        +  'pragma',
        +  'vary',
        +]
        +
        +// return an object containing all metadata to be written to the index
        +const getMetadata = (request, response, options) => {
        +  const metadata = {
        +    url: request.url,
        +    reqHeaders: {},
        +    resHeaders: {},
        +  }
        +
        +  // only save the status if it's not a 200 or 304
        +  if (response.status !== 200 && response.status !== 304)
        +    metadata.status = response.status
        +
        +  for (const name of KEEP_REQUEST_HEADERS) {
        +    if (request.headers.has(name))
        +      metadata.reqHeaders[name] = request.headers.get(name)
        +  }
        +
        +  // if the request's host header differs from the host in the url
        +  // we need to keep it, otherwise it's just noise and we ignore it
        +  const host = request.headers.get('host')
        +  const parsedUrl = new url.URL(request.url)
        +  if (host && parsedUrl.host !== host)
        +    metadata.reqHeaders.host = host
        +
        +  // if the response has a vary header, make sure
        +  // we store the relevant request headers too
        +  if (response.headers.has('vary')) {
        +    const vary = response.headers.get('vary')
        +    // a vary of "*" means every header causes a different response.
        +    // in that scenario, we do not include any additional headers
        +    // as the freshness check will always fail anyway and we don't
        +    // want to bloat the cache indexes
        +    if (vary !== '*') {
        +      // copy any other request headers that will vary the response
        +      const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/)
        +      for (const name of varyHeaders) {
        +        // explicitly ignore accept-encoding here
        +        if (name !== 'accept-encoding' && request.headers.has(name))
        +          metadata.reqHeaders[name] = request.headers.get(name)
        +      }
        +    }
        +  }
        +
        +  for (const name of KEEP_RESPONSE_HEADERS) {
        +    if (response.headers.has(name))
        +      metadata.resHeaders[name] = response.headers.get(name)
        +  }
        +
        +  // we only store accept-encoding and content-encoding if the user
        +  // has disabled automatic compression and decompression in minipass-fetch
        +  // since if it's enabled (the default) then the content will have
        +  // already been decompressed making the header a lie
        +  if (options.compress === false) {
        +    metadata.reqHeaders['accept-encoding'] = request.headers.get('accept-encoding')
        +    metadata.resHeaders['content-encoding'] = response.headers.get('content-encoding')
        +  }
        +
        +  return metadata
        +}
        +
        +// symbols used to hide objects that may be lazily evaluated in a getter
        +const _request = Symbol('request')
        +const _response = Symbol('response')
        +const _policy = Symbol('policy')
        +
        +class CacheEntry {
        +  constructor ({ entry, request, response, options }) {
        +    this.entry = entry
        +    this.options = options
        +    this.key = entry ? entry.key : cacheKey(request)
        +
        +    // these properties are behind getters that lazily evaluate
        +    this[_request] = request
        +    this[_response] = response
        +    this[_policy] = null
        +  }
        +
        +  // returns a CacheEntry instance that satisfies the given request
        +  // or undefined if no existing entry satisfies
        +  static async find (request, options) {
        +    try {
        +      // compacts the index and returns an array of unique entries
        +      var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => {
        +        const entryA = new CacheEntry({ entry: A, options })
        +        const entryB = new CacheEntry({ entry: B, options })
        +        return entryA.policy.satisfies(entryB.request)
        +      }, {
        +        validateEntry: (entry) => {
        +          // if an integrity is null, it needs to have a status specified
        +          if (entry.integrity === null)
        +            return !!(entry.metadata && entry.metadata.status)
        +
        +          return true
        +        },
        +      })
        +    } catch (err) {
        +      // if the compact request fails, ignore the error and return
        +      return
        +    }
        +
        +    // find the specific entry that satisfies the request
        +    let match
        +    for (const entry of matches) {
        +      const _entry = new CacheEntry({
        +        entry,
        +        options,
        +      })
        +
        +      if (_entry.policy.satisfies(request)) {
        +        match = _entry
        +        break
        +      }
        +    }
        +
        +    return match
        +  }
        +
        +  // if the user made a PUT/POST/PATCH then we invalidate our
        +  // cache for the same url by deleting the index entirely
        +  static async invalidate (request, options) {
        +    const key = cacheKey(request)
        +    try {
        +      await cacache.rm.entry(options.cachePath, key, { removeFully: true })
        +    } catch (err) {
        +      // ignore errors
        +    }
        +  }
        +
        +  get request () {
        +    if (!this[_request]) {
        +      this[_request] = new Request(this.entry.metadata.url, {
        +        method: 'GET',
        +        headers: this.entry.metadata.reqHeaders,
        +      })
        +    }
        +
        +    return this[_request]
        +  }
        +
        +  get response () {
        +    if (!this[_response]) {
        +      this[_response] = new Response(null, {
        +        url: this.entry.metadata.url,
        +        counter: this.options.counter,
        +        status: this.entry.metadata.status || 200,
        +        headers: {
        +          ...this.entry.metadata.resHeaders,
        +          'content-length': this.entry.size,
        +        },
        +      })
        +    }
        +
        +    return this[_response]
        +  }
        +
        +  get policy () {
        +    if (!this[_policy]) {
        +      this[_policy] = new CachePolicy({
        +        entry: this.entry,
        +        request: this.request,
        +        response: this.response,
        +        options: this.options,
        +      })
        +    }
        +
        +    return this[_policy]
        +  }
        +
        +  // wraps the response in a pipeline that stores the data
        +  // in the cache while the user consumes it
        +  async store (status) {
        +    // if we got a status other than 200, 301, or 308,
        +    // or the CachePolicy forbid storage, append the
        +    // cache status header and return it untouched
        +    if (this.request.method !== 'GET' || ![200, 301, 308].includes(this.response.status) || !this.policy.storable()) {
        +      this.response.headers.set('x-local-cache-status', 'skip')
        +      return this.response
        +    }
        +
        +    const size = this.response.headers.get('content-length')
        +    const fitsInMemory = !!size && Number(size) < MAX_MEM_SIZE
        +    const shouldBuffer = this.options.memoize !== false && fitsInMemory
        +    const cacheOpts = {
        +      algorithms: this.options.algorithms,
        +      metadata: getMetadata(this.request, this.response, this.options),
        +      size,
        +      memoize: fitsInMemory && this.options.memoize,
        +    }
        +
        +    let body = null
        +    // we only set a body if the status is a 200, redirects are
        +    // stored as metadata only
        +    if (this.response.status === 200) {
        +      let cacheWriteResolve, cacheWriteReject
        +      const cacheWritePromise = new Promise((resolve, reject) => {
        +        cacheWriteResolve = resolve
        +        cacheWriteReject = reject
        +      })
        +
        +      body = new MinipassPipeline(new MinipassFlush({
        +        flush () {
        +          return cacheWritePromise
        +        },
        +      }))
        +
        +      let abortStream, onResume
        +      if (shouldBuffer) {
        +        // if the result fits in memory, use a collect stream to gather
        +        // the response and write it to cacache while also passing it through
        +        // to the user
        +        onResume = () => {
        +          const collector = new MinipassCollect.PassThrough()
        +          abortStream = collector
        +          collector.on('collect', (data) => {
        +            // TODO if the cache write fails, log a warning but return the response anyway
        +            cacache.put(this.options.cachePath, this.key, data, cacheOpts).then(cacheWriteResolve, cacheWriteReject)
        +          })
        +          body.unshift(collector)
        +          body.unshift(this.response.body)
        +        }
        +      } else {
        +        // if it does not fit in memory, create a tee stream and use
        +        // that to pipe to both the cache and the user simultaneously
        +        onResume = () => {
        +          const tee = new Minipass()
        +          const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts)
        +          abortStream = cacheStream
        +          tee.pipe(cacheStream)
        +          // TODO if the cache write fails, log a warning but return the response anyway
        +          cacheStream.promise().then(cacheWriteResolve, cacheWriteReject)
        +          body.unshift(tee)
        +          body.unshift(this.response.body)
        +        }
        +      }
        +
        +      body.once('resume', onResume)
        +      body.once('end', () => body.removeListener('resume', onResume))
        +      this.response.body.on('error', (err) => {
        +        // the abortStream will either be a MinipassCollect if we buffer
        +        // or a cacache write stream, either way be sure to listen for
        +        // errors from the actual response and avoid writing data that we
        +        // know to be invalid to the cache
        +        abortStream.destroy(err)
        +      })
        +    } else
        +      await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts)
        +
        +    // note: we do not set the x-local-cache-hash header because we do not know
        +    // the hash value until after the write to the cache completes, which doesn't
        +    // happen until after the response has been sent and it's too late to write
        +    // the header anyway
        +    this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
        +    this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
        +    this.response.headers.set('x-local-cache-mode', shouldBuffer ? 'buffer' : 'stream')
        +    this.response.headers.set('x-local-cache-status', status)
        +    this.response.headers.set('x-local-cache-time', new Date().toISOString())
        +    const newResponse = new Response(body, {
        +      url: this.response.url,
        +      status: this.response.status,
        +      headers: this.response.headers,
        +      counter: this.options.counter,
        +    })
        +    return newResponse
        +  }
        +
        +  // use the cached data to create a response and return it
        +  async respond (method, options, status) {
        +    let response
        +    const size = Number(this.response.headers.get('content-length'))
        +    const fitsInMemory = !!size && size < MAX_MEM_SIZE
        +    const shouldBuffer = this.options.memoize !== false && fitsInMemory
        +    if (method === 'HEAD' || [301, 308].includes(this.response.status)) {
        +      // if the request is a HEAD, or the response is a redirect,
        +      // then the metadata in the entry already includes everything
        +      // we need to build a response
        +      response = this.response
        +    } else {
        +      // we're responding with a full cached response, so create a body
        +      // that reads from cacache and attach it to a new Response
        +      const body = new Minipass()
        +      const removeOnResume = () => body.removeListener('resume', onResume)
        +      let onResume
        +      if (shouldBuffer) {
        +        onResume = async () => {
        +          removeOnResume()
        +          try {
        +            const content = await cacache.get.byDigest(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
        +            body.end(content)
        +          } catch (err) {
        +            body.emit('error', err)
        +          }
        +        }
        +      } else {
        +        onResume = () => {
        +          const cacheStream = cacache.get.stream.byDigest(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
        +          cacheStream.on('error', (err) => body.emit('error', err))
        +          cacheStream.pipe(body)
        +        }
        +      }
        +
        +      body.once('resume', onResume)
        +      body.once('end', removeOnResume)
        +      response = new Response(body, {
        +        url: this.entry.metadata.url,
        +        counter: options.counter,
        +        status: 200,
        +        headers: {
        +          ...this.policy.responseHeaders(),
        +        },
        +      })
        +    }
        +
        +    response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
        +    response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity))
        +    response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
        +    response.headers.set('x-local-cache-mode', shouldBuffer ? 'buffer' : 'stream')
        +    response.headers.set('x-local-cache-status', status)
        +    response.headers.set('x-local-cache-time', new Date(this.entry.time).toUTCString())
        +    return response
        +  }
        +
        +  // use the provided request along with this cache entry to
        +  // revalidate the stored response. returns a response, either
        +  // from the cache or from the update
        +  async revalidate (request, options) {
        +    const revalidateRequest = new Request(request, {
        +      headers: this.policy.revalidationHeaders(request),
        +    })
        +
        +    try {
        +      // NOTE: be sure to remove the headers property from the
        +      // user supplied options, since we have already defined
        +      // them on the new request object. if they're still in the
        +      // options then those will overwrite the ones from the policy
        +      var response = await remote(revalidateRequest, {
        +        ...options,
        +        headers: undefined,
        +      })
        +    } catch (err) {
        +      // if the network fetch fails, return the stale
        +      // cached response unless it has a cache-control
        +      // of 'must-revalidate'
        +      if (!this.policy.mustRevalidate)
        +        return this.respond(request.method, options, 'stale')
        +
        +      throw err
        +    }
        +
        +    if (this.policy.revalidated(revalidateRequest, response)) {
        +      // we got a 304, write a new index to the cache and respond from cache
        +      const metadata = getMetadata(request, response, options)
        +      // 304 responses do not include headers that are specific to the response data
        +      // since they do not include a body, so we copy values for headers that were
        +      // in the old cache entry to the new one, if the new metadata does not already
        +      // include that header
        +      for (const name of KEEP_RESPONSE_HEADERS) {
        +        if (!hasOwnProperty(metadata.resHeaders, name) && hasOwnProperty(this.entry.metadata.resHeaders, name))
        +          metadata.resHeaders[name] = this.entry.metadata.resHeaders[name]
        +      }
        +
        +      try {
        +        await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, {
        +          size: this.entry.size,
        +          metadata,
        +        })
        +      } catch (err) {
        +        // if updating the cache index fails, we ignore it and
        +        // respond anyway
        +      }
        +      return this.respond(request.method, options, 'revalidated')
        +    }
        +
        +    // if we got a modified response, create a new entry based on it
        +    const newEntry = new CacheEntry({
        +      request,
        +      response,
        +      options,
        +    })
        +
        +    // respond with the new entry while writing it to the cache
        +    return newEntry.store('updated')
        +  }
        +}
        +
        +module.exports = CacheEntry
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/make-fetch-happen/lib/cache/errors.js
        new file mode 100644
        index 00000000000000..31e97c4b033c09
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/cache/errors.js
        @@ -0,0 +1,10 @@
        +class NotCachedError extends Error {
        +  constructor (url) {
        +    super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`)
        +    this.code = 'ENOTCACHED'
        +  }
        +}
        +
        +module.exports = {
        +  NotCachedError,
        +}
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/make-fetch-happen/lib/cache/index.js
        new file mode 100644
        index 00000000000000..00df31dd15023e
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/cache/index.js
        @@ -0,0 +1,46 @@
        +const { NotCachedError } = require('./errors.js')
        +const CacheEntry = require('./entry.js')
        +const remote = require('../remote.js')
        +
        +// do whatever is necessary to get a Response and return it
        +const cacheFetch = async (request, options) => {
        +  // try to find a cached entry that satisfies this request
        +  const entry = await CacheEntry.find(request, options)
        +  if (!entry) {
        +    // no cached result, if the cache mode is only-if-cached that's a failure
        +    if (options.cache === 'only-if-cached')
        +      throw new NotCachedError(request.url)
        +
        +    // otherwise, we make a request, store it and return it
        +    const response = await remote(request, options)
        +    const entry = new CacheEntry({ request, response, options })
        +    return entry.store('miss')
        +  }
        +
        +  // we have a cached response that satisfies this request, however
        +  // if the cache mode is reload the user explicitly wants us to revalidate
        +  if (options.cache === 'reload')
        +    return entry.revalidate(request, options)
        +
        +  // if the cache mode is either force-cache or only-if-cached we will only
        +  // respond with a cached entry, even if it's stale. set the status to the
        +  // appropriate value based on whether revalidation is needed and respond
        +  // from the cache
        +  const _needsRevalidation = entry.policy.needsRevalidation(request)
        +  if (options.cache === 'force-cache' ||
        +      options.cache === 'only-if-cached' ||
        +      !_needsRevalidation)
        +    return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit')
        +
        +  // cache entry might be stale, revalidate it and return a response
        +  return entry.revalidate(request, options)
        +}
        +
        +cacheFetch.invalidate = async (request, options) => {
        +  if (!options.cachePath)
        +    return
        +
        +  return CacheEntry.invalidate(request, options)
        +}
        +
        +module.exports = cacheFetch
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/make-fetch-happen/lib/cache/key.js
        new file mode 100644
        index 00000000000000..f7684d562b7fae
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/cache/key.js
        @@ -0,0 +1,17 @@
        +const { URL, format } = require('url')
        +
        +// options passed to url.format() when generating a key
        +const formatOptions = {
        +  auth: false,
        +  fragment: false,
        +  search: true,
        +  unicode: false,
        +}
        +
        +// returns a string to be used as the cache key for the Request
        +const cacheKey = (request) => {
        +  const parsed = new URL(request.url)
        +  return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}`
        +}
        +
        +module.exports = cacheKey
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/make-fetch-happen/lib/cache/policy.js
        new file mode 100644
        index 00000000000000..189dce80ee68ed
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/cache/policy.js
        @@ -0,0 +1,161 @@
        +const CacheSemantics = require('http-cache-semantics')
        +const Negotiator = require('negotiator')
        +const ssri = require('ssri')
        +
        +// HACK: negotiator lazy loads several of its own modules
        +// as a micro optimization. we need to be sure that they're
        +// in memory as soon as possible at startup so that we do
        +// not try to lazy load them after the directory has been
        +// retired during a self update of the npm CLI, we do this
        +// by calling all of the methods that trigger a lazy load
        +// on a fake instance.
        +const preloadNegotiator = new Negotiator({ headers: {} })
        +preloadNegotiator.charsets()
        +preloadNegotiator.encodings()
        +preloadNegotiator.languages()
        +preloadNegotiator.mediaTypes()
        +
        +// options passed to http-cache-semantics constructor
        +const policyOptions = {
        +  shared: false,
        +  ignoreCargoCult: true,
        +}
        +
        +// a fake empty response, used when only testing the
        +// request for storability
        +const emptyResponse = { status: 200, headers: {} }
        +
        +// returns a plain object representation of the Request
        +const requestObject = (request) => {
        +  const _obj = {
        +    method: request.method,
        +    url: request.url,
        +    headers: {},
        +  }
        +
        +  request.headers.forEach((value, key) => {
        +    _obj.headers[key] = value
        +  })
        +
        +  return _obj
        +}
        +
        +// returns a plain object representation of the Response
        +const responseObject = (response) => {
        +  const _obj = {
        +    status: response.status,
        +    headers: {},
        +  }
        +
        +  response.headers.forEach((value, key) => {
        +    _obj.headers[key] = value
        +  })
        +
        +  return _obj
        +}
        +
        +class CachePolicy {
        +  constructor ({ entry, request, response, options }) {
        +    this.entry = entry
        +    this.request = requestObject(request)
        +    this.response = responseObject(response)
        +    this.options = options
        +    this.policy = new CacheSemantics(this.request, this.response, policyOptions)
        +
        +    if (this.entry) {
        +      // if we have an entry, copy the timestamp to the _responseTime
        +      // this is necessary because the CacheSemantics constructor forces
        +      // the value to Date.now() which means a policy created from a
        +      // cache entry is likely to always identify itself as stale
        +      this.policy._responseTime = this.entry.time
        +    }
        +  }
        +
        +  // static method to quickly determine if a request alone is storable
        +  static storable (request, options) {
        +    // no cachePath means no caching
        +    if (!options.cachePath)
        +      return false
        +
        +    // user explicitly asked not to cache
        +    if (options.cache === 'no-store')
        +      return false
        +
        +    // we only cache GET and HEAD requests
        +    if (!['GET', 'HEAD'].includes(request.method))
        +      return false
        +
        +    // otherwise, let http-cache-semantics make the decision
        +    // based on the request's headers
        +    const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions)
        +    return policy.storable()
        +  }
        +
        +  // returns true if the policy satisfies the request
        +  satisfies (request) {
        +    const _req = requestObject(request)
        +    if (this.request.headers.host !== _req.headers.host)
        +      return false
        +
        +    const negotiatorA = new Negotiator(this.request)
        +    const negotiatorB = new Negotiator(_req)
        +
        +    if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes()))
        +      return false
        +
        +    if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages()))
        +      return false
        +
        +    if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings()))
        +      return false
        +
        +    if (this.options.integrity)
        +      return ssri.parse(this.options.integrity).match(this.entry.integrity)
        +
        +    return true
        +  }
        +
        +  // returns true if the request and response allow caching
        +  storable () {
        +    return this.policy.storable()
        +  }
        +
        +  // NOTE: this is a hack to avoid parsing the cache-control
        +  // header ourselves, it returns true if the response's
        +  // cache-control contains must-revalidate
        +  get mustRevalidate () {
        +    return !!this.policy._rescc['must-revalidate']
        +  }
        +
        +  // returns true if the cached response requires revalidation
        +  // for the given request
        +  needsRevalidation (request) {
        +    const _req = requestObject(request)
        +    // force method to GET because we only cache GETs
        +    // but can serve a HEAD from a cached GET
        +    _req.method = 'GET'
        +    return !this.policy.satisfiesWithoutRevalidation(_req)
        +  }
        +
        +  responseHeaders () {
        +    return this.policy.responseHeaders()
        +  }
        +
        +  // returns a new object containing the appropriate headers
        +  // to send a revalidation request
        +  revalidationHeaders (request) {
        +    const _req = requestObject(request)
        +    return this.policy.revalidationHeaders(_req)
        +  }
        +
        +  // returns true if the request/response was revalidated
        +  // successfully. returns false if a new response was received
        +  revalidated (request, response) {
        +    const _req = requestObject(request)
        +    const _res = responseObject(response)
        +    const policy = this.policy.revalidatedPolicy(_req, _res)
        +    return !policy.modified
        +  }
        +}
        +
        +module.exports = CachePolicy
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/make-fetch-happen/lib/fetch.js
        new file mode 100644
        index 00000000000000..dfded79295da1d
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/fetch.js
        @@ -0,0 +1,100 @@
        +'use strict'
        +
        +const { FetchError, Request, isRedirect } = require('minipass-fetch')
        +const url = require('url')
        +
        +const CachePolicy = require('./cache/policy.js')
        +const cache = require('./cache/index.js')
        +const remote = require('./remote.js')
        +
        +// given a Request, a Response and user options
        +// return true if the response is a redirect that
        +// can be followed. we throw errors that will result
        +// in the fetch being rejected if the redirect is
        +// possible but invalid for some reason
        +const canFollowRedirect = (request, response, options) => {
        +  if (!isRedirect(response.status))
        +    return false
        +
        +  if (options.redirect === 'manual')
        +    return false
        +
        +  if (options.redirect === 'error')
        +    throw new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect', { code: 'ENOREDIRECT' })
        +
        +  if (!response.headers.has('location'))
        +    throw new FetchError(`redirect location header missing for: ${request.url}`, 'no-location', { code: 'EINVALIDREDIRECT' })
        +
        +  if (request.counter >= request.follow)
        +    throw new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect', { code: 'EMAXREDIRECT' })
        +
        +  return true
        +}
        +
        +// given a Request, a Response, and the user's options return an object
        +// with a new Request and a new options object that will be used for
        +// following the redirect
        +const getRedirect = (request, response, options) => {
        +  const _opts = { ...options }
        +  const location = response.headers.get('location')
        +  const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url)
        +  // Comment below is used under the following license:
        +  // Copyright (c) 2010-2012 Mikeal Rogers
        +  // Licensed under the Apache License, Version 2.0 (the "License");
        +  // you may not use this file except in compliance with the License.
        +  // You may obtain a copy of the License at
        +  // http://www.apache.org/licenses/LICENSE-2.0
        +  // Unless required by applicable law or agreed to in writing,
        +  // software distributed under the License is distributed on an "AS
        +  // IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
        +  // express or implied. See the License for the specific language
        +  // governing permissions and limitations under the License.
        +
        +  // Remove authorization if changing hostnames (but not if just
        +  // changing ports or protocols).  This matches the behavior of request:
        +  // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138
        +  if (new url.URL(request.url).hostname !== redirectUrl.hostname)
        +    request.headers.delete('authorization')
        +
        +  // for POST request with 301/302 response, or any request with 303 response,
        +  // use GET when following redirect
        +  if (response.status === 303 || (request.method === 'POST' && [301, 302].includes(response.status))) {
        +    _opts.method = 'GET'
        +    _opts.body = null
        +    request.headers.delete('content-length')
        +  }
        +
        +  _opts.headers = {}
        +  request.headers.forEach((value, key) => {
        +    _opts.headers[key] = value
        +  })
        +
        +  _opts.counter = ++request.counter
        +  const redirectReq = new Request(url.format(redirectUrl), _opts)
        +  return {
        +    request: redirectReq,
        +    options: _opts,
        +  }
        +}
        +
        +const fetch = async (request, options) => {
        +  const response = CachePolicy.storable(request, options)
        +    ? await cache(request, options)
        +    : await remote(request, options)
        +
        +  // if the request wasn't a GET or HEAD, and the response
        +  // status is between 200 and 399 inclusive, invalidate the
        +  // request url
        +  if (!['GET', 'HEAD'].includes(request.method) &&
        +      response.status >= 200 &&
        +      response.status <= 399)
        +    await cache.invalidate(request, options)
        +
        +  if (!canFollowRedirect(request, response, options))
        +    return response
        +
        +  const redirect = getRedirect(request, response, options)
        +  return fetch(redirect.request, redirect.options)
        +}
        +
        +module.exports = fetch
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/make-fetch-happen/lib/index.js
        new file mode 100644
        index 00000000000000..6028bc0725129a
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/index.js
        @@ -0,0 +1,40 @@
        +const { FetchError, Headers, Request, Response } = require('minipass-fetch')
        +
        +const configureOptions = require('./options.js')
        +const fetch = require('./fetch.js')
        +
        +const makeFetchHappen = (url, opts) => {
        +  const options = configureOptions(opts)
        +
        +  const request = new Request(url, options)
        +  return fetch(request, options)
        +}
        +
        +makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}) => {
        +  if (typeof defaultUrl === 'object') {
        +    defaultOptions = defaultUrl
        +    defaultUrl = null
        +  }
        +
        +  const defaultedFetch = (url, options = {}) => {
        +    const finalUrl = url || defaultUrl
        +    const finalOptions = {
        +      ...defaultOptions,
        +      ...options,
        +      headers: {
        +        ...defaultOptions.headers,
        +        ...options.headers,
        +      },
        +    }
        +    return makeFetchHappen(finalUrl, finalOptions)
        +  }
        +
        +  defaultedFetch.defaults = makeFetchHappen.defaults
        +  return defaultedFetch
        +}
        +
        +module.exports = makeFetchHappen
        +module.exports.FetchError = FetchError
        +module.exports.Headers = Headers
        +module.exports.Request = Request
        +module.exports.Response = Response
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/make-fetch-happen/lib/options.js
        new file mode 100644
        index 00000000000000..08891754868a50
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/options.js
        @@ -0,0 +1,45 @@
        +const conditionalHeaders = [
        +  'if-modified-since',
        +  'if-none-match',
        +  'if-unmodified-since',
        +  'if-match',
        +  'if-range',
        +]
        +
        +const configureOptions = (opts) => {
        +  const options = { ...opts }
        +  options.method = options.method ? options.method.toUpperCase() : 'GET'
        +  if (Object.prototype.hasOwnProperty.call(options, 'strictSSL'))
        +    options.rejectUnauthorized = options.strictSSL
        +
        +  if (!options.retry)
        +    options.retry = { retries: 0 }
        +  else if (typeof options.retry === 'string') {
        +    const retries = parseInt(options.retry, 10)
        +    if (isFinite(retries))
        +      options.retry = { retries }
        +    else
        +      options.retry = { retries: 0 }
        +  } else if (typeof options.retry === 'number')
        +    options.retry = { retries: options.retry }
        +  else
        +    options.retry = { retries: 0, ...options.retry }
        +
        +  options.cache = options.cache || 'default'
        +  if (options.cache === 'default') {
        +    const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => {
        +      return conditionalHeaders.includes(name.toLowerCase())
        +    })
        +    if (hasConditionalHeader)
        +      options.cache = 'no-store'
        +  }
        +
        +  // cacheManager is deprecated, but if it's set and
        +  // cachePath is not we should copy it to the new field
        +  if (options.cacheManager && !options.cachePath)
        +    options.cachePath = options.cacheManager
        +
        +  return options
        +}
        +
        +module.exports = configureOptions
        diff --git a/deps/npm/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/make-fetch-happen/lib/remote.js
        new file mode 100644
        index 00000000000000..e37f39de845f38
        --- /dev/null
        +++ b/deps/npm/node_modules/make-fetch-happen/lib/remote.js
        @@ -0,0 +1,101 @@
        +const Minipass = require('minipass')
        +const MinipassPipeline = require('minipass-pipeline')
        +const fetch = require('minipass-fetch')
        +const promiseRetry = require('promise-retry')
        +const ssri = require('ssri')
        +
        +const getAgent = require('./agent.js')
        +const pkg = require('../package.json')
        +
        +const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})`
        +
        +const RETRY_ERRORS = [
        +  'ECONNRESET', // remote socket closed on us
        +  'ECONNREFUSED', // remote host refused to open connection
        +  'EADDRINUSE', // failed to bind to a local port (proxy?)
        +  'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW
        +  // Known codes we do NOT retry on:
        +  // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline)
        +]
        +
        +const RETRY_TYPES = [
        +  'request-timeout',
        +]
        +
        +// make a request directly to the remote source,
        +// retrying certain classes of errors as well as
        +// following redirects (through the cache if necessary)
        +// and verifying response integrity
        +const remoteFetch = (request, options) => {
        +  const agent = getAgent(request.url, options)
        +  if (!request.headers.has('connection'))
        +    request.headers.set('connection', agent ? 'keep-alive' : 'close')
        +
        +  if (!request.headers.has('user-agent'))
        +    request.headers.set('user-agent', USER_AGENT)
        +
        +  // keep our own options since we're overriding the agent
        +  // and the redirect mode
        +  const _opts = {
        +    ...options,
        +    agent,
        +    redirect: 'manual',
        +  }
        +
        +  return promiseRetry(async (retryHandler, attemptNum) => {
        +    const req = new fetch.Request(request, _opts)
        +    try {
        +      let res = await fetch(req, _opts)
        +      if (_opts.integrity && res.status === 200) {
        +        // we got a 200 response and the user has specified an expected
        +        // integrity value, so wrap the response in an ssri stream to verify it
        +        const integrityStream = ssri.integrityStream({ integrity: _opts.integrity })
        +        res = new fetch.Response(new MinipassPipeline(res.body, integrityStream), res)
        +      }
        +
        +      res.headers.set('x-fetch-attempts', attemptNum)
        +
        +      // do not retry POST requests, or requests with a streaming body
        +      // do retry requests with a 408, 420, 429 or 500+ status in the response
        +      const isStream = Minipass.isStream(req.body)
        +      const isRetriable = req.method !== 'POST' &&
        +          !isStream &&
        +          ([408, 420, 429].includes(res.status) || res.status >= 500)
        +
        +      if (isRetriable) {
        +        if (typeof options.onRetry === 'function')
        +          options.onRetry(res)
        +
        +        return retryHandler(res)
        +      }
        +
        +      return res
        +    } catch (err) {
        +      const code = (err.code === 'EPROMISERETRY')
        +        ? err.retried.code
        +        : err.code
        +
        +      // err.retried will be the thing that was thrown from above
        +      // if it's a response, we just got a bad status code and we
        +      // can re-throw to allow the retry
        +      const isRetryError = err.retried instanceof fetch.Response ||
        +        (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type))
        +
        +      if (req.method === 'POST' || isRetryError)
        +        throw err
        +
        +      if (typeof options.onRetry === 'function')
        +        options.onRetry(err)
        +
        +      return retryHandler(err)
        +    }
        +  }, options.retry).catch((err) => {
        +    // don't reject for http errors, just return them
        +    if (err.status >= 400 && err.type !== 'system')
        +      return err
        +
        +    throw err
        +  })
        +}
        +
        +module.exports = remoteFetch
        diff --git a/deps/npm/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/make-fetch-happen/package.json
        index 7e854dcdf08805..af97a161c6088b 100644
        --- a/deps/npm/node_modules/make-fetch-happen/package.json
        +++ b/deps/npm/node_modules/make-fetch-happen/package.json
        @@ -1,21 +1,19 @@
         {
           "name": "make-fetch-happen",
        -  "version": "8.0.14",
        +  "version": "9.0.2",
           "description": "Opinionated, caching, retrying fetch client",
        -  "main": "index.js",
        +  "main": "lib/index.js",
           "files": [
        -    "*.js",
        -    "lib",
        -    "utils"
        +    "lib"
           ],
           "scripts": {
             "preversion": "npm t",
             "postversion": "npm publish",
             "prepublishOnly": "git push --follow-tags",
        -    "test": "tap test/*.js",
        +    "test": "tap",
             "posttest": "npm run lint",
             "eslint": "eslint",
        -    "lint": "npm run eslint -- *.js utils test",
        +    "lint": "npm run eslint -- lib test",
             "lintfix": "npm run lint -- --fix"
           },
           "repository": "https://github.com/npm/make-fetch-happen",
        @@ -36,7 +34,7 @@
           "license": "ISC",
           "dependencies": {
             "agentkeepalive": "^4.1.3",
        -    "cacache": "^15.0.5",
        +    "cacache": "^15.2.0",
             "http-cache-semantics": "^4.1.0",
             "http-proxy-agent": "^4.0.1",
             "https-proxy-agent": "^5.0.0",
        @@ -47,26 +45,32 @@
             "minipass-fetch": "^1.3.2",
             "minipass-flush": "^1.0.5",
             "minipass-pipeline": "^1.2.4",
        +    "negotiator": "^0.6.2",
             "promise-retry": "^2.0.1",
             "socks-proxy-agent": "^5.0.0",
             "ssri": "^8.0.0"
           },
           "devDependencies": {
        -    "eslint": "^7.14.0",
        -    "eslint-plugin-import": "^2.22.1",
        +    "eslint": "^7.26.0",
        +    "eslint-plugin-import": "^2.23.2",
             "eslint-plugin-node": "^11.1.0",
        -    "eslint-plugin-promise": "^4.2.1",
        +    "eslint-plugin-promise": "^5.1.0",
             "eslint-plugin-standard": "^5.0.0",
             "mkdirp": "^1.0.4",
        -    "nock": "^11.9.1",
        +    "nock": "^13.0.11",
             "npmlog": "^4.1.2",
             "require-inject": "^1.4.2",
        -    "rimraf": "^2.7.1",
        +    "rimraf": "^3.0.2",
             "safe-buffer": "^5.2.1",
        -    "standard-version": "^7.1.0",
        -    "tap": "^14.11.0"
        +    "standard-version": "^9.3.0",
        +    "tap": "^15.0.9"
           },
           "engines": {
             "node": ">= 10"
        +  },
        +  "tap": {
        +    "color": 1,
        +    "files": "test/*.js",
        +    "check-coverage": true
           }
         }
        diff --git a/deps/npm/node_modules/make-fetch-happen/utils/configure-options.js b/deps/npm/node_modules/make-fetch-happen/utils/configure-options.js
        deleted file mode 100644
        index 75ea5d15ecda01..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/utils/configure-options.js
        +++ /dev/null
        @@ -1,32 +0,0 @@
        -'use strict'
        -
        -const initializeCache = require('./initialize-cache')
        -
        -module.exports = function configureOptions (_opts) {
        -  const opts = Object.assign({}, _opts || {})
        -  opts.method = (opts.method || 'GET').toUpperCase()
        -
        -  if (!opts.retry) {
        -    // opts.retry was falsy; set default
        -    opts.retry = { retries: 0 }
        -  } else {
        -    if (typeof opts.retry !== 'object') {
        -      // Shorthand
        -      if (typeof opts.retry === 'number')
        -        opts.retry = { retries: opts.retry }
        -
        -      if (typeof opts.retry === 'string') {
        -        const value = parseInt(opts.retry, 10)
        -        opts.retry = (value) ? { retries: value } : { retries: 0 }
        -      }
        -    } else {
        -      // Set default retries
        -      opts.retry = Object.assign({}, { retries: 0 }, opts.retry)
        -    }
        -  }
        -
        -  if (opts.cacheManager)
        -    initializeCache(opts)
        -
        -  return opts
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/utils/initialize-cache.js b/deps/npm/node_modules/make-fetch-happen/utils/initialize-cache.js
        deleted file mode 100644
        index 9f96bf56226ef5..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/utils/initialize-cache.js
        +++ /dev/null
        @@ -1,26 +0,0 @@
        -'use strict'
        -
        -const isHeaderConditional = require('./is-header-conditional')
        -// Default cacache-based cache
        -const Cache = require('../cache')
        -
        -module.exports = function initializeCache (opts) {
        -  /**
        -   * NOTE: `opts.cacheManager` is the path to cache
        -   * We're making the assumption that if `opts.cacheManager` *isn't* a string,
        -   * it's a cache object
        -   */
        -  if (typeof opts.cacheManager === 'string') {
        -    // Need to make a cache object
        -    opts.cacheManager = new Cache(opts.cacheManager, opts)
        -  }
        -
        -  opts.cache = opts.cache || 'default'
        -
        -  if (opts.cache === 'default' && isHeaderConditional(opts.headers)) {
        -    // If header list contains `If-Modified-Since`, `If-None-Match`,
        -    // `If-Unmodified-Since`, `If-Match`, or `If-Range`, fetch will set cache
        -    // mode to "no-store" if it is "default".
        -    opts.cache = 'no-store'
        -  }
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/utils/is-header-conditional.js b/deps/npm/node_modules/make-fetch-happen/utils/is-header-conditional.js
        deleted file mode 100644
        index 5081e0ce127e26..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/utils/is-header-conditional.js
        +++ /dev/null
        @@ -1,17 +0,0 @@
        -'use strict'
        -
        -module.exports = function isHeaderConditional (headers) {
        -  if (!headers || typeof headers !== 'object')
        -    return false
        -
        -  const modifiers = [
        -    'if-modified-since',
        -    'if-none-match',
        -    'if-unmodified-since',
        -    'if-match',
        -    'if-range',
        -  ]
        -
        -  return Object.keys(headers)
        -    .some(h => modifiers.indexOf(h.toLowerCase()) !== -1)
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/utils/iterable-to-object.js b/deps/npm/node_modules/make-fetch-happen/utils/iterable-to-object.js
        deleted file mode 100644
        index 1fe5ba65448d60..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/utils/iterable-to-object.js
        +++ /dev/null
        @@ -1,9 +0,0 @@
        -'use strict'
        -
        -module.exports = function iterableToObject (iter) {
        -  const obj = {}
        -  for (const k of iter.keys())
        -    obj[k] = iter.get(k)
        -
        -  return obj
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/utils/make-policy.js b/deps/npm/node_modules/make-fetch-happen/utils/make-policy.js
        deleted file mode 100644
        index 5e884847dd8f45..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/utils/make-policy.js
        +++ /dev/null
        @@ -1,19 +0,0 @@
        -'use strict'
        -
        -const CachePolicy = require('http-cache-semantics')
        -
        -const iterableToObject = require('./iterable-to-object')
        -
        -module.exports = function makePolicy (req, res) {
        -  const _req = {
        -    url: req.url,
        -    method: req.method,
        -    headers: iterableToObject(req.headers),
        -  }
        -  const _res = {
        -    status: res.status,
        -    headers: iterableToObject(res.headers),
        -  }
        -
        -  return new CachePolicy(_req, _res, { shared: false })
        -}
        diff --git a/deps/npm/node_modules/make-fetch-happen/warning.js b/deps/npm/node_modules/make-fetch-happen/warning.js
        deleted file mode 100644
        index 2b96024714e3be..00000000000000
        --- a/deps/npm/node_modules/make-fetch-happen/warning.js
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -const url = require('url')
        -
        -module.exports = setWarning
        -
        -function setWarning (reqOrRes, code, message, replace) {
        -  //   Warning    = "Warning" ":" 1#warning-value
        -  // warning-value = warn-code SP warn-agent SP warn-text [SP warn-date]
        -  // warn-code  = 3DIGIT
        -  // warn-agent = ( host [ ":" port ] ) | pseudonym
        -  //                 ; the name or pseudonym of the server adding
        -  //                 ; the Warning header, for use in debugging
        -  // warn-text  = quoted-string
        -  // warn-date  = <"> HTTP-date <">
        -  // (https://tools.ietf.org/html/rfc2616#section-14.46)
        -  const host = new url.URL(reqOrRes.url).host
        -  const jsonMessage = JSON.stringify(message)
        -  const jsonDate = JSON.stringify(new Date().toUTCString())
        -  const header = replace ? 'set' : 'append'
        -
        -  reqOrRes.headers[header](
        -    'Warning',
        -    `${code} ${host} ${jsonMessage} ${jsonDate}`
        -  )
        -}
        diff --git a/deps/npm/node_modules/mime-db/HISTORY.md b/deps/npm/node_modules/mime-db/HISTORY.md
        index 1555055e8a7956..ff9438ee9c075b 100644
        --- a/deps/npm/node_modules/mime-db/HISTORY.md
        +++ b/deps/npm/node_modules/mime-db/HISTORY.md
        @@ -1,3 +1,10 @@
        +1.48.0 / 2021-05-30
        +===================
        +
        +  * Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
        +  * Add new upstream MIME types
        +  * Mark `text/yaml` as compressible
        +
         1.47.0 / 2021-04-01
         ===================
         
        diff --git a/deps/npm/node_modules/mime-db/db.json b/deps/npm/node_modules/mime-db/db.json
        index 63c189ea2687ba..067e0ce8151a4d 100644
        --- a/deps/npm/node_modules/mime-db/db.json
        +++ b/deps/npm/node_modules/mime-db/db.json
        @@ -11,6 +11,14 @@
             "source": "iana",
             "compressible": true
           },
        +  "application/3gpphal+json": {
        +    "source": "iana",
        +    "compressible": true
        +  },
        +  "application/3gpphalforms+json": {
        +    "source": "iana",
        +    "compressible": true
        +  },
           "application/a2l": {
             "source": "iana"
           },
        @@ -999,6 +1007,9 @@
           "application/nss": {
             "source": "iana"
           },
        +  "application/oauth-authz-req+jwt": {
        +    "source": "iana"
        +  },
           "application/ocsp-request": {
             "source": "iana"
           },
        @@ -1342,6 +1353,10 @@
             "source": "iana",
             "compressible": true
           },
        +  "application/sarif-external-properties+json": {
        +    "source": "iana",
        +    "compressible": true
        +  },
           "application/sbe": {
             "source": "iana"
           },
        @@ -1696,6 +1711,9 @@
           "application/vnd.3gpp-v2x-local-service-information": {
             "source": "iana"
           },
        +  "application/vnd.3gpp.5gnas": {
        +    "source": "iana"
        +  },
           "application/vnd.3gpp.access-transfer-events+xml": {
             "source": "iana",
             "compressible": true
        @@ -1708,9 +1726,15 @@
             "source": "iana",
             "compressible": true
           },
        +  "application/vnd.3gpp.gtpc": {
        +    "source": "iana"
        +  },
           "application/vnd.3gpp.interworking-data": {
             "source": "iana"
           },
        +  "application/vnd.3gpp.lpp": {
        +    "source": "iana"
        +  },
           "application/vnd.3gpp.mc-signalling-ear": {
             "source": "iana"
           },
        @@ -1820,6 +1844,12 @@
             "source": "iana",
             "compressible": true
           },
        +  "application/vnd.3gpp.ngap": {
        +    "source": "iana"
        +  },
        +  "application/vnd.3gpp.pfcp": {
        +    "source": "iana"
        +  },
           "application/vnd.3gpp.pic-bw-large": {
             "source": "iana",
             "extensions": ["plb"]
        @@ -1832,6 +1862,9 @@
             "source": "iana",
             "extensions": ["pvb"]
           },
        +  "application/vnd.3gpp.s1ap": {
        +    "source": "iana"
        +  },
           "application/vnd.3gpp.sms": {
             "source": "iana"
           },
        @@ -2322,6 +2355,9 @@
           "application/vnd.cryptomator.encrypted": {
             "source": "iana"
           },
        +  "application/vnd.cryptomator.vault": {
        +    "source": "iana"
        +  },
           "application/vnd.ctc-posml": {
             "source": "iana",
             "extensions": ["pml"]
        @@ -2817,6 +2853,19 @@
             "source": "iana",
             "extensions": ["fsc"]
           },
        +  "application/vnd.fujifilm.fb.docuworks": {
        +    "source": "iana"
        +  },
        +  "application/vnd.fujifilm.fb.docuworks.binder": {
        +    "source": "iana"
        +  },
        +  "application/vnd.fujifilm.fb.docuworks.container": {
        +    "source": "iana"
        +  },
        +  "application/vnd.fujifilm.fb.jfi+xml": {
        +    "source": "iana",
        +    "compressible": true
        +  },
           "application/vnd.fujitsu.oasys": {
             "source": "iana",
             "extensions": ["oas"]
        @@ -3427,7 +3476,8 @@
             "extensions": ["portpkg"]
           },
           "application/vnd.mapbox-vector-tile": {
        -    "source": "iana"
        +    "source": "iana",
        +    "extensions": ["mvt"]
           },
           "application/vnd.marlin.drm.actiontoken+xml": {
             "source": "iana",
        @@ -5438,6 +5488,7 @@
             "source": "iana"
           },
           "application/wasm": {
        +    "source": "iana",
             "compressible": true,
             "extensions": ["wasm"]
           },
        @@ -7400,6 +7451,9 @@
             "source": "iana",
             "extensions": ["x_t"]
           },
        +  "model/vnd.pytha.pyox": {
        +    "source": "iana"
        +  },
           "model/vnd.rosette.annotated-data-model": {
             "source": "iana"
           },
        @@ -7682,6 +7736,7 @@
             "source": "iana"
           },
           "text/shex": {
        +    "source": "iana",
             "extensions": ["shex"]
           },
           "text/slim": {
        @@ -7953,6 +8008,7 @@
             "source": "iana"
           },
           "text/yaml": {
        +    "compressible": true,
             "extensions": ["yaml","yml"]
           },
           "video/1d-interleaved-parityfec": {
        diff --git a/deps/npm/node_modules/mime-db/package.json b/deps/npm/node_modules/mime-db/package.json
        index bd6403fb68f9f1..d4395a727b8888 100644
        --- a/deps/npm/node_modules/mime-db/package.json
        +++ b/deps/npm/node_modules/mime-db/package.json
        @@ -1,7 +1,7 @@
         {
           "name": "mime-db",
           "description": "Media Type Database",
        -  "version": "1.47.0",
        +  "version": "1.48.0",
           "contributors": [
             "Douglas Christopher Wilson ",
             "Jonathan Ong  (http://jongleberry.com)",
        @@ -22,16 +22,16 @@
             "bluebird": "3.7.2",
             "co": "4.6.0",
             "cogent": "1.0.1",
        -    "csv-parse": "4.15.3",
        -    "eslint": "7.23.0",
        +    "csv-parse": "4.15.4",
        +    "eslint": "7.27.0",
             "eslint-config-standard": "15.0.1",
        -    "eslint-plugin-import": "2.22.1",
        -    "eslint-plugin-markdown": "2.0.0",
        +    "eslint-plugin-import": "2.23.4",
        +    "eslint-plugin-markdown": "2.2.0",
             "eslint-plugin-node": "11.1.0",
        -    "eslint-plugin-promise": "4.3.1",
        +    "eslint-plugin-promise": "5.1.0",
             "eslint-plugin-standard": "4.1.0",
             "gnode": "0.1.2",
        -    "mocha": "8.3.2",
        +    "mocha": "8.4.0",
             "nyc": "15.1.0",
             "raw-body": "2.4.1",
             "stream-to-array": "2.3.0"
        diff --git a/deps/npm/node_modules/mime-types/HISTORY.md b/deps/npm/node_modules/mime-types/HISTORY.md
        index 38472bee131e46..19e45a15fcc7f4 100644
        --- a/deps/npm/node_modules/mime-types/HISTORY.md
        +++ b/deps/npm/node_modules/mime-types/HISTORY.md
        @@ -1,3 +1,11 @@
        +2.1.31 / 2021-06-01
        +===================
        +
        +  * deps: mime-db@1.48.0
        +    - Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
        +    - Add new upstream MIME types
        +    - Mark `text/yaml` as compressible
        +
         2.1.30 / 2021-04-02
         ===================
         
        diff --git a/deps/npm/node_modules/mime-types/package.json b/deps/npm/node_modules/mime-types/package.json
        index ea53dd22aa1d38..a271000ec92389 100644
        --- a/deps/npm/node_modules/mime-types/package.json
        +++ b/deps/npm/node_modules/mime-types/package.json
        @@ -1,7 +1,7 @@
         {
           "name": "mime-types",
           "description": "The ultimate javascript content-type utility.",
        -  "version": "2.1.30",
        +  "version": "2.1.31",
           "contributors": [
             "Douglas Christopher Wilson ",
             "Jeremiah Senkpiel  (https://searchbeam.jit.su)",
        @@ -14,17 +14,17 @@
           ],
           "repository": "jshttp/mime-types",
           "dependencies": {
        -    "mime-db": "1.47.0"
        +    "mime-db": "1.48.0"
           },
           "devDependencies": {
        -    "eslint": "7.23.0",
        +    "eslint": "7.27.0",
             "eslint-config-standard": "14.1.1",
        -    "eslint-plugin-import": "2.22.1",
        -    "eslint-plugin-markdown": "2.0.0",
        +    "eslint-plugin-import": "2.23.4",
        +    "eslint-plugin-markdown": "2.2.0",
             "eslint-plugin-node": "11.1.0",
        -    "eslint-plugin-promise": "4.3.1",
        +    "eslint-plugin-promise": "5.1.0",
             "eslint-plugin-standard": "4.1.0",
        -    "mocha": "8.3.2",
        +    "mocha": "8.4.0",
             "nyc": "15.1.0"
           },
           "files": [
        diff --git a/deps/npm/node_modules/mkdirp/README.markdown b/deps/npm/node_modules/mkdirp/readme.markdown
        similarity index 100%
        rename from deps/npm/node_modules/mkdirp/README.markdown
        rename to deps/npm/node_modules/mkdirp/readme.markdown
        diff --git a/deps/npm/node_modules/negotiator/HISTORY.md b/deps/npm/node_modules/negotiator/HISTORY.md
        new file mode 100644
        index 00000000000000..6d06c76aaa9650
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/HISTORY.md
        @@ -0,0 +1,103 @@
        +0.6.2 / 2019-04-29
        +==================
        +
        +  * Fix sorting charset, encoding, and language with extra parameters
        +
        +0.6.1 / 2016-05-02
        +==================
        +
        +  * perf: improve `Accept` parsing speed
        +  * perf: improve `Accept-Charset` parsing speed
        +  * perf: improve `Accept-Encoding` parsing speed
        +  * perf: improve `Accept-Language` parsing speed
        +
        +0.6.0 / 2015-09-29
        +==================
        +
        +  * Fix including type extensions in parameters in `Accept` parsing
        +  * Fix parsing `Accept` parameters with quoted equals
        +  * Fix parsing `Accept` parameters with quoted semicolons
        +  * Lazy-load modules from main entry point
        +  * perf: delay type concatenation until needed
        +  * perf: enable strict mode
        +  * perf: hoist regular expressions
        +  * perf: remove closures getting spec properties
        +  * perf: remove a closure from media type parsing
        +  * perf: remove property delete from media type parsing
        +
        +0.5.3 / 2015-05-10
        +==================
        +
        +  * Fix media type parameter matching to be case-insensitive
        +
        +0.5.2 / 2015-05-06
        +==================
        +
        +  * Fix comparing media types with quoted values
        +  * Fix splitting media types with quoted commas
        +
        +0.5.1 / 2015-02-14
        +==================
        +
        +  * Fix preference sorting to be stable for long acceptable lists
        +
        +0.5.0 / 2014-12-18
        +==================
        +
        +  * Fix list return order when large accepted list
        +  * Fix missing identity encoding when q=0 exists
        +  * Remove dynamic building of Negotiator class
        +
        +0.4.9 / 2014-10-14
        +==================
        +
        +  * Fix error when media type has invalid parameter
        +
        +0.4.8 / 2014-09-28
        +==================
        +
        +  * Fix all negotiations to be case-insensitive
        +  * Stable sort preferences of same quality according to client order
        +  * Support Node.js 0.6
        +
        +0.4.7 / 2014-06-24
        +==================
        +
        +  * Handle invalid provided languages
        +  * Handle invalid provided media types
        +
        +0.4.6 / 2014-06-11
        +==================
        +
        +  *  Order by specificity when quality is the same
        +
        +0.4.5 / 2014-05-29
        +==================
        +
        +  * Fix regression in empty header handling
        +
        +0.4.4 / 2014-05-29
        +==================
        +
        +  * Fix behaviors when headers are not present
        +
        +0.4.3 / 2014-04-16
        +==================
        +
        +  * Handle slashes on media params correctly
        +
        +0.4.2 / 2014-02-28
        +==================
        +
        +  * Fix media type sorting
        +  * Handle media types params strictly
        +
        +0.4.1 / 2014-01-16
        +==================
        +
        +  * Use most specific matches
        +
        +0.4.0 / 2014-01-09
        +==================
        +
        +  * Remove preferred prefix from methods
        diff --git a/deps/npm/node_modules/negotiator/LICENSE b/deps/npm/node_modules/negotiator/LICENSE
        new file mode 100644
        index 00000000000000..ea6b9e2e9ac251
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/LICENSE
        @@ -0,0 +1,24 @@
        +(The MIT License)
        +
        +Copyright (c) 2012-2014 Federico Romero
        +Copyright (c) 2012-2014 Isaac Z. Schlueter
        +Copyright (c) 2014-2015 Douglas Christopher Wilson
        +
        +Permission is hereby granted, free of charge, to any person obtaining
        +a copy of this software and associated documentation files (the
        +'Software'), to deal in the Software without restriction, including
        +without limitation the rights to use, copy, modify, merge, publish,
        +distribute, sublicense, and/or sell copies of the Software, and to
        +permit persons to whom the Software is furnished to do so, subject to
        +the following conditions:
        +
        +The above copyright notice and this permission notice shall be
        +included in all copies or substantial portions of the Software.
        +
        +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
        +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
        +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
        +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
        +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
        +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
        +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        diff --git a/deps/npm/node_modules/negotiator/README.md b/deps/npm/node_modules/negotiator/README.md
        new file mode 100644
        index 00000000000000..04a67ff7656709
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/README.md
        @@ -0,0 +1,203 @@
        +# negotiator
        +
        +[![NPM Version][npm-image]][npm-url]
        +[![NPM Downloads][downloads-image]][downloads-url]
        +[![Node.js Version][node-version-image]][node-version-url]
        +[![Build Status][travis-image]][travis-url]
        +[![Test Coverage][coveralls-image]][coveralls-url]
        +
        +An HTTP content negotiator for Node.js
        +
        +## Installation
        +
        +```sh
        +$ npm install negotiator
        +```
        +
        +## API
        +
        +```js
        +var Negotiator = require('negotiator')
        +```
        +
        +### Accept Negotiation
        +
        +```js
        +availableMediaTypes = ['text/html', 'text/plain', 'application/json']
        +
        +// The negotiator constructor receives a request object
        +negotiator = new Negotiator(request)
        +
        +// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8'
        +
        +negotiator.mediaTypes()
        +// -> ['text/html', 'image/jpeg', 'application/*']
        +
        +negotiator.mediaTypes(availableMediaTypes)
        +// -> ['text/html', 'application/json']
        +
        +negotiator.mediaType(availableMediaTypes)
        +// -> 'text/html'
        +```
        +
        +You can check a working example at `examples/accept.js`.
        +
        +#### Methods
        +
        +##### mediaType()
        +
        +Returns the most preferred media type from the client.
        +
        +##### mediaType(availableMediaType)
        +
        +Returns the most preferred media type from a list of available media types.
        +
        +##### mediaTypes()
        +
        +Returns an array of preferred media types ordered by the client preference.
        +
        +##### mediaTypes(availableMediaTypes)
        +
        +Returns an array of preferred media types ordered by priority from a list of
        +available media types.
        +
        +### Accept-Language Negotiation
        +
        +```js
        +negotiator = new Negotiator(request)
        +
        +availableLanguages = ['en', 'es', 'fr']
        +
        +// Let's say Accept-Language header is 'en;q=0.8, es, pt'
        +
        +negotiator.languages()
        +// -> ['es', 'pt', 'en']
        +
        +negotiator.languages(availableLanguages)
        +// -> ['es', 'en']
        +
        +language = negotiator.language(availableLanguages)
        +// -> 'es'
        +```
        +
        +You can check a working example at `examples/language.js`.
        +
        +#### Methods
        +
        +##### language()
        +
        +Returns the most preferred language from the client.
        +
        +##### language(availableLanguages)
        +
        +Returns the most preferred language from a list of available languages.
        +
        +##### languages()
        +
        +Returns an array of preferred languages ordered by the client preference.
        +
        +##### languages(availableLanguages)
        +
        +Returns an array of preferred languages ordered by priority from a list of
        +available languages.
        +
        +### Accept-Charset Negotiation
        +
        +```js
        +availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5']
        +
        +negotiator = new Negotiator(request)
        +
        +// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2'
        +
        +negotiator.charsets()
        +// -> ['utf-8', 'iso-8859-1', 'utf-7']
        +
        +negotiator.charsets(availableCharsets)
        +// -> ['utf-8', 'iso-8859-1']
        +
        +negotiator.charset(availableCharsets)
        +// -> 'utf-8'
        +```
        +
        +You can check a working example at `examples/charset.js`.
        +
        +#### Methods
        +
        +##### charset()
        +
        +Returns the most preferred charset from the client.
        +
        +##### charset(availableCharsets)
        +
        +Returns the most preferred charset from a list of available charsets.
        +
        +##### charsets()
        +
        +Returns an array of preferred charsets ordered by the client preference.
        +
        +##### charsets(availableCharsets)
        +
        +Returns an array of preferred charsets ordered by priority from a list of
        +available charsets.
        +
        +### Accept-Encoding Negotiation
        +
        +```js
        +availableEncodings = ['identity', 'gzip']
        +
        +negotiator = new Negotiator(request)
        +
        +// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5'
        +
        +negotiator.encodings()
        +// -> ['gzip', 'identity', 'compress']
        +
        +negotiator.encodings(availableEncodings)
        +// -> ['gzip', 'identity']
        +
        +negotiator.encoding(availableEncodings)
        +// -> 'gzip'
        +```
        +
        +You can check a working example at `examples/encoding.js`.
        +
        +#### Methods
        +
        +##### encoding()
        +
        +Returns the most preferred encoding from the client.
        +
        +##### encoding(availableEncodings)
        +
        +Returns the most preferred encoding from a list of available encodings.
        +
        +##### encodings()
        +
        +Returns an array of preferred encodings ordered by the client preference.
        +
        +##### encodings(availableEncodings)
        +
        +Returns an array of preferred encodings ordered by priority from a list of
        +available encodings.
        +
        +## See Also
        +
        +The [accepts](https://npmjs.org/package/accepts#readme) module builds on
        +this module and provides an alternative interface, mime type validation,
        +and more.
        +
        +## License
        +
        +[MIT](LICENSE)
        +
        +[npm-image]: https://img.shields.io/npm/v/negotiator.svg
        +[npm-url]: https://npmjs.org/package/negotiator
        +[node-version-image]: https://img.shields.io/node/v/negotiator.svg
        +[node-version-url]: https://nodejs.org/en/download/
        +[travis-image]: https://img.shields.io/travis/jshttp/negotiator/master.svg
        +[travis-url]: https://travis-ci.org/jshttp/negotiator
        +[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg
        +[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master
        +[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg
        +[downloads-url]: https://npmjs.org/package/negotiator
        diff --git a/deps/npm/node_modules/negotiator/index.js b/deps/npm/node_modules/negotiator/index.js
        new file mode 100644
        index 00000000000000..8d4f6a226cb0d8
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/index.js
        @@ -0,0 +1,124 @@
        +/*!
        + * negotiator
        + * Copyright(c) 2012 Federico Romero
        + * Copyright(c) 2012-2014 Isaac Z. Schlueter
        + * Copyright(c) 2015 Douglas Christopher Wilson
        + * MIT Licensed
        + */
        +
        +'use strict';
        +
        +/**
        + * Cached loaded submodules.
        + * @private
        + */
        +
        +var modules = Object.create(null);
        +
        +/**
        + * Module exports.
        + * @public
        + */
        +
        +module.exports = Negotiator;
        +module.exports.Negotiator = Negotiator;
        +
        +/**
        + * Create a Negotiator instance from a request.
        + * @param {object} request
        + * @public
        + */
        +
        +function Negotiator(request) {
        +  if (!(this instanceof Negotiator)) {
        +    return new Negotiator(request);
        +  }
        +
        +  this.request = request;
        +}
        +
        +Negotiator.prototype.charset = function charset(available) {
        +  var set = this.charsets(available);
        +  return set && set[0];
        +};
        +
        +Negotiator.prototype.charsets = function charsets(available) {
        +  var preferredCharsets = loadModule('charset').preferredCharsets;
        +  return preferredCharsets(this.request.headers['accept-charset'], available);
        +};
        +
        +Negotiator.prototype.encoding = function encoding(available) {
        +  var set = this.encodings(available);
        +  return set && set[0];
        +};
        +
        +Negotiator.prototype.encodings = function encodings(available) {
        +  var preferredEncodings = loadModule('encoding').preferredEncodings;
        +  return preferredEncodings(this.request.headers['accept-encoding'], available);
        +};
        +
        +Negotiator.prototype.language = function language(available) {
        +  var set = this.languages(available);
        +  return set && set[0];
        +};
        +
        +Negotiator.prototype.languages = function languages(available) {
        +  var preferredLanguages = loadModule('language').preferredLanguages;
        +  return preferredLanguages(this.request.headers['accept-language'], available);
        +};
        +
        +Negotiator.prototype.mediaType = function mediaType(available) {
        +  var set = this.mediaTypes(available);
        +  return set && set[0];
        +};
        +
        +Negotiator.prototype.mediaTypes = function mediaTypes(available) {
        +  var preferredMediaTypes = loadModule('mediaType').preferredMediaTypes;
        +  return preferredMediaTypes(this.request.headers.accept, available);
        +};
        +
        +// Backwards compatibility
        +Negotiator.prototype.preferredCharset = Negotiator.prototype.charset;
        +Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets;
        +Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding;
        +Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings;
        +Negotiator.prototype.preferredLanguage = Negotiator.prototype.language;
        +Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages;
        +Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType;
        +Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes;
        +
        +/**
        + * Load the given module.
        + * @private
        + */
        +
        +function loadModule(moduleName) {
        +  var module = modules[moduleName];
        +
        +  if (module !== undefined) {
        +    return module;
        +  }
        +
        +  // This uses a switch for static require analysis
        +  switch (moduleName) {
        +    case 'charset':
        +      module = require('./lib/charset');
        +      break;
        +    case 'encoding':
        +      module = require('./lib/encoding');
        +      break;
        +    case 'language':
        +      module = require('./lib/language');
        +      break;
        +    case 'mediaType':
        +      module = require('./lib/mediaType');
        +      break;
        +    default:
        +      throw new Error('Cannot find module \'' + moduleName + '\'');
        +  }
        +
        +  // Store to prevent invoking require()
        +  modules[moduleName] = module;
        +
        +  return module;
        +}
        diff --git a/deps/npm/node_modules/negotiator/lib/charset.js b/deps/npm/node_modules/negotiator/lib/charset.js
        new file mode 100644
        index 00000000000000..cdd014803474a4
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/lib/charset.js
        @@ -0,0 +1,169 @@
        +/**
        + * negotiator
        + * Copyright(c) 2012 Isaac Z. Schlueter
        + * Copyright(c) 2014 Federico Romero
        + * Copyright(c) 2014-2015 Douglas Christopher Wilson
        + * MIT Licensed
        + */
        +
        +'use strict';
        +
        +/**
        + * Module exports.
        + * @public
        + */
        +
        +module.exports = preferredCharsets;
        +module.exports.preferredCharsets = preferredCharsets;
        +
        +/**
        + * Module variables.
        + * @private
        + */
        +
        +var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
        +
        +/**
        + * Parse the Accept-Charset header.
        + * @private
        + */
        +
        +function parseAcceptCharset(accept) {
        +  var accepts = accept.split(',');
        +
        +  for (var i = 0, j = 0; i < accepts.length; i++) {
        +    var charset = parseCharset(accepts[i].trim(), i);
        +
        +    if (charset) {
        +      accepts[j++] = charset;
        +    }
        +  }
        +
        +  // trim accepts
        +  accepts.length = j;
        +
        +  return accepts;
        +}
        +
        +/**
        + * Parse a charset from the Accept-Charset header.
        + * @private
        + */
        +
        +function parseCharset(str, i) {
        +  var match = simpleCharsetRegExp.exec(str);
        +  if (!match) return null;
        +
        +  var charset = match[1];
        +  var q = 1;
        +  if (match[2]) {
        +    var params = match[2].split(';')
        +    for (var j = 0; j < params.length; j++) {
        +      var p = params[j].trim().split('=');
        +      if (p[0] === 'q') {
        +        q = parseFloat(p[1]);
        +        break;
        +      }
        +    }
        +  }
        +
        +  return {
        +    charset: charset,
        +    q: q,
        +    i: i
        +  };
        +}
        +
        +/**
        + * Get the priority of a charset.
        + * @private
        + */
        +
        +function getCharsetPriority(charset, accepted, index) {
        +  var priority = {o: -1, q: 0, s: 0};
        +
        +  for (var i = 0; i < accepted.length; i++) {
        +    var spec = specify(charset, accepted[i], index);
        +
        +    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
        +      priority = spec;
        +    }
        +  }
        +
        +  return priority;
        +}
        +
        +/**
        + * Get the specificity of the charset.
        + * @private
        + */
        +
        +function specify(charset, spec, index) {
        +  var s = 0;
        +  if(spec.charset.toLowerCase() === charset.toLowerCase()){
        +    s |= 1;
        +  } else if (spec.charset !== '*' ) {
        +    return null
        +  }
        +
        +  return {
        +    i: index,
        +    o: spec.i,
        +    q: spec.q,
        +    s: s
        +  }
        +}
        +
        +/**
        + * Get the preferred charsets from an Accept-Charset header.
        + * @public
        + */
        +
        +function preferredCharsets(accept, provided) {
        +  // RFC 2616 sec 14.2: no header = *
        +  var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || '');
        +
        +  if (!provided) {
        +    // sorted list of all charsets
        +    return accepts
        +      .filter(isQuality)
        +      .sort(compareSpecs)
        +      .map(getFullCharset);
        +  }
        +
        +  var priorities = provided.map(function getPriority(type, index) {
        +    return getCharsetPriority(type, accepts, index);
        +  });
        +
        +  // sorted list of accepted charsets
        +  return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) {
        +    return provided[priorities.indexOf(priority)];
        +  });
        +}
        +
        +/**
        + * Compare two specs.
        + * @private
        + */
        +
        +function compareSpecs(a, b) {
        +  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
        +}
        +
        +/**
        + * Get full charset string.
        + * @private
        + */
        +
        +function getFullCharset(spec) {
        +  return spec.charset;
        +}
        +
        +/**
        + * Check if a spec has any quality.
        + * @private
        + */
        +
        +function isQuality(spec) {
        +  return spec.q > 0;
        +}
        diff --git a/deps/npm/node_modules/negotiator/lib/encoding.js b/deps/npm/node_modules/negotiator/lib/encoding.js
        new file mode 100644
        index 00000000000000..8432cd77b8a969
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/lib/encoding.js
        @@ -0,0 +1,184 @@
        +/**
        + * negotiator
        + * Copyright(c) 2012 Isaac Z. Schlueter
        + * Copyright(c) 2014 Federico Romero
        + * Copyright(c) 2014-2015 Douglas Christopher Wilson
        + * MIT Licensed
        + */
        +
        +'use strict';
        +
        +/**
        + * Module exports.
        + * @public
        + */
        +
        +module.exports = preferredEncodings;
        +module.exports.preferredEncodings = preferredEncodings;
        +
        +/**
        + * Module variables.
        + * @private
        + */
        +
        +var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
        +
        +/**
        + * Parse the Accept-Encoding header.
        + * @private
        + */
        +
        +function parseAcceptEncoding(accept) {
        +  var accepts = accept.split(',');
        +  var hasIdentity = false;
        +  var minQuality = 1;
        +
        +  for (var i = 0, j = 0; i < accepts.length; i++) {
        +    var encoding = parseEncoding(accepts[i].trim(), i);
        +
        +    if (encoding) {
        +      accepts[j++] = encoding;
        +      hasIdentity = hasIdentity || specify('identity', encoding);
        +      minQuality = Math.min(minQuality, encoding.q || 1);
        +    }
        +  }
        +
        +  if (!hasIdentity) {
        +    /*
        +     * If identity doesn't explicitly appear in the accept-encoding header,
        +     * it's added to the list of acceptable encoding with the lowest q
        +     */
        +    accepts[j++] = {
        +      encoding: 'identity',
        +      q: minQuality,
        +      i: i
        +    };
        +  }
        +
        +  // trim accepts
        +  accepts.length = j;
        +
        +  return accepts;
        +}
        +
        +/**
        + * Parse an encoding from the Accept-Encoding header.
        + * @private
        + */
        +
        +function parseEncoding(str, i) {
        +  var match = simpleEncodingRegExp.exec(str);
        +  if (!match) return null;
        +
        +  var encoding = match[1];
        +  var q = 1;
        +  if (match[2]) {
        +    var params = match[2].split(';');
        +    for (var j = 0; j < params.length; j++) {
        +      var p = params[j].trim().split('=');
        +      if (p[0] === 'q') {
        +        q = parseFloat(p[1]);
        +        break;
        +      }
        +    }
        +  }
        +
        +  return {
        +    encoding: encoding,
        +    q: q,
        +    i: i
        +  };
        +}
        +
        +/**
        + * Get the priority of an encoding.
        + * @private
        + */
        +
        +function getEncodingPriority(encoding, accepted, index) {
        +  var priority = {o: -1, q: 0, s: 0};
        +
        +  for (var i = 0; i < accepted.length; i++) {
        +    var spec = specify(encoding, accepted[i], index);
        +
        +    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
        +      priority = spec;
        +    }
        +  }
        +
        +  return priority;
        +}
        +
        +/**
        + * Get the specificity of the encoding.
        + * @private
        + */
        +
        +function specify(encoding, spec, index) {
        +  var s = 0;
        +  if(spec.encoding.toLowerCase() === encoding.toLowerCase()){
        +    s |= 1;
        +  } else if (spec.encoding !== '*' ) {
        +    return null
        +  }
        +
        +  return {
        +    i: index,
        +    o: spec.i,
        +    q: spec.q,
        +    s: s
        +  }
        +};
        +
        +/**
        + * Get the preferred encodings from an Accept-Encoding header.
        + * @public
        + */
        +
        +function preferredEncodings(accept, provided) {
        +  var accepts = parseAcceptEncoding(accept || '');
        +
        +  if (!provided) {
        +    // sorted list of all encodings
        +    return accepts
        +      .filter(isQuality)
        +      .sort(compareSpecs)
        +      .map(getFullEncoding);
        +  }
        +
        +  var priorities = provided.map(function getPriority(type, index) {
        +    return getEncodingPriority(type, accepts, index);
        +  });
        +
        +  // sorted list of accepted encodings
        +  return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) {
        +    return provided[priorities.indexOf(priority)];
        +  });
        +}
        +
        +/**
        + * Compare two specs.
        + * @private
        + */
        +
        +function compareSpecs(a, b) {
        +  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
        +}
        +
        +/**
        + * Get full encoding string.
        + * @private
        + */
        +
        +function getFullEncoding(spec) {
        +  return spec.encoding;
        +}
        +
        +/**
        + * Check if a spec has any quality.
        + * @private
        + */
        +
        +function isQuality(spec) {
        +  return spec.q > 0;
        +}
        diff --git a/deps/npm/node_modules/negotiator/lib/language.js b/deps/npm/node_modules/negotiator/lib/language.js
        new file mode 100644
        index 00000000000000..62f737f0060219
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/lib/language.js
        @@ -0,0 +1,179 @@
        +/**
        + * negotiator
        + * Copyright(c) 2012 Isaac Z. Schlueter
        + * Copyright(c) 2014 Federico Romero
        + * Copyright(c) 2014-2015 Douglas Christopher Wilson
        + * MIT Licensed
        + */
        +
        +'use strict';
        +
        +/**
        + * Module exports.
        + * @public
        + */
        +
        +module.exports = preferredLanguages;
        +module.exports.preferredLanguages = preferredLanguages;
        +
        +/**
        + * Module variables.
        + * @private
        + */
        +
        +var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
        +
        +/**
        + * Parse the Accept-Language header.
        + * @private
        + */
        +
        +function parseAcceptLanguage(accept) {
        +  var accepts = accept.split(',');
        +
        +  for (var i = 0, j = 0; i < accepts.length; i++) {
        +    var language = parseLanguage(accepts[i].trim(), i);
        +
        +    if (language) {
        +      accepts[j++] = language;
        +    }
        +  }
        +
        +  // trim accepts
        +  accepts.length = j;
        +
        +  return accepts;
        +}
        +
        +/**
        + * Parse a language from the Accept-Language header.
        + * @private
        + */
        +
        +function parseLanguage(str, i) {
        +  var match = simpleLanguageRegExp.exec(str);
        +  if (!match) return null;
        +
        +  var prefix = match[1],
        +    suffix = match[2],
        +    full = prefix;
        +
        +  if (suffix) full += "-" + suffix;
        +
        +  var q = 1;
        +  if (match[3]) {
        +    var params = match[3].split(';')
        +    for (var j = 0; j < params.length; j++) {
        +      var p = params[j].split('=');
        +      if (p[0] === 'q') q = parseFloat(p[1]);
        +    }
        +  }
        +
        +  return {
        +    prefix: prefix,
        +    suffix: suffix,
        +    q: q,
        +    i: i,
        +    full: full
        +  };
        +}
        +
        +/**
        + * Get the priority of a language.
        + * @private
        + */
        +
        +function getLanguagePriority(language, accepted, index) {
        +  var priority = {o: -1, q: 0, s: 0};
        +
        +  for (var i = 0; i < accepted.length; i++) {
        +    var spec = specify(language, accepted[i], index);
        +
        +    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
        +      priority = spec;
        +    }
        +  }
        +
        +  return priority;
        +}
        +
        +/**
        + * Get the specificity of the language.
        + * @private
        + */
        +
        +function specify(language, spec, index) {
        +  var p = parseLanguage(language)
        +  if (!p) return null;
        +  var s = 0;
        +  if(spec.full.toLowerCase() === p.full.toLowerCase()){
        +    s |= 4;
        +  } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {
        +    s |= 2;
        +  } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {
        +    s |= 1;
        +  } else if (spec.full !== '*' ) {
        +    return null
        +  }
        +
        +  return {
        +    i: index,
        +    o: spec.i,
        +    q: spec.q,
        +    s: s
        +  }
        +};
        +
        +/**
        + * Get the preferred languages from an Accept-Language header.
        + * @public
        + */
        +
        +function preferredLanguages(accept, provided) {
        +  // RFC 2616 sec 14.4: no header = *
        +  var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || '');
        +
        +  if (!provided) {
        +    // sorted list of all languages
        +    return accepts
        +      .filter(isQuality)
        +      .sort(compareSpecs)
        +      .map(getFullLanguage);
        +  }
        +
        +  var priorities = provided.map(function getPriority(type, index) {
        +    return getLanguagePriority(type, accepts, index);
        +  });
        +
        +  // sorted list of accepted languages
        +  return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) {
        +    return provided[priorities.indexOf(priority)];
        +  });
        +}
        +
        +/**
        + * Compare two specs.
        + * @private
        + */
        +
        +function compareSpecs(a, b) {
        +  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
        +}
        +
        +/**
        + * Get full language string.
        + * @private
        + */
        +
        +function getFullLanguage(spec) {
        +  return spec.full;
        +}
        +
        +/**
        + * Check if a spec has any quality.
        + * @private
        + */
        +
        +function isQuality(spec) {
        +  return spec.q > 0;
        +}
        diff --git a/deps/npm/node_modules/negotiator/lib/mediaType.js b/deps/npm/node_modules/negotiator/lib/mediaType.js
        new file mode 100644
        index 00000000000000..67309dd75f1b62
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/lib/mediaType.js
        @@ -0,0 +1,294 @@
        +/**
        + * negotiator
        + * Copyright(c) 2012 Isaac Z. Schlueter
        + * Copyright(c) 2014 Federico Romero
        + * Copyright(c) 2014-2015 Douglas Christopher Wilson
        + * MIT Licensed
        + */
        +
        +'use strict';
        +
        +/**
        + * Module exports.
        + * @public
        + */
        +
        +module.exports = preferredMediaTypes;
        +module.exports.preferredMediaTypes = preferredMediaTypes;
        +
        +/**
        + * Module variables.
        + * @private
        + */
        +
        +var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
        +
        +/**
        + * Parse the Accept header.
        + * @private
        + */
        +
        +function parseAccept(accept) {
        +  var accepts = splitMediaTypes(accept);
        +
        +  for (var i = 0, j = 0; i < accepts.length; i++) {
        +    var mediaType = parseMediaType(accepts[i].trim(), i);
        +
        +    if (mediaType) {
        +      accepts[j++] = mediaType;
        +    }
        +  }
        +
        +  // trim accepts
        +  accepts.length = j;
        +
        +  return accepts;
        +}
        +
        +/**
        + * Parse a media type from the Accept header.
        + * @private
        + */
        +
        +function parseMediaType(str, i) {
        +  var match = simpleMediaTypeRegExp.exec(str);
        +  if (!match) return null;
        +
        +  var params = Object.create(null);
        +  var q = 1;
        +  var subtype = match[2];
        +  var type = match[1];
        +
        +  if (match[3]) {
        +    var kvps = splitParameters(match[3]).map(splitKeyValuePair);
        +
        +    for (var j = 0; j < kvps.length; j++) {
        +      var pair = kvps[j];
        +      var key = pair[0].toLowerCase();
        +      var val = pair[1];
        +
        +      // get the value, unwrapping quotes
        +      var value = val && val[0] === '"' && val[val.length - 1] === '"'
        +        ? val.substr(1, val.length - 2)
        +        : val;
        +
        +      if (key === 'q') {
        +        q = parseFloat(value);
        +        break;
        +      }
        +
        +      // store parameter
        +      params[key] = value;
        +    }
        +  }
        +
        +  return {
        +    type: type,
        +    subtype: subtype,
        +    params: params,
        +    q: q,
        +    i: i
        +  };
        +}
        +
        +/**
        + * Get the priority of a media type.
        + * @private
        + */
        +
        +function getMediaTypePriority(type, accepted, index) {
        +  var priority = {o: -1, q: 0, s: 0};
        +
        +  for (var i = 0; i < accepted.length; i++) {
        +    var spec = specify(type, accepted[i], index);
        +
        +    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
        +      priority = spec;
        +    }
        +  }
        +
        +  return priority;
        +}
        +
        +/**
        + * Get the specificity of the media type.
        + * @private
        + */
        +
        +function specify(type, spec, index) {
        +  var p = parseMediaType(type);
        +  var s = 0;
        +
        +  if (!p) {
        +    return null;
        +  }
        +
        +  if(spec.type.toLowerCase() == p.type.toLowerCase()) {
        +    s |= 4
        +  } else if(spec.type != '*') {
        +    return null;
        +  }
        +
        +  if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
        +    s |= 2
        +  } else if(spec.subtype != '*') {
        +    return null;
        +  }
        +
        +  var keys = Object.keys(spec.params);
        +  if (keys.length > 0) {
        +    if (keys.every(function (k) {
        +      return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase();
        +    })) {
        +      s |= 1
        +    } else {
        +      return null
        +    }
        +  }
        +
        +  return {
        +    i: index,
        +    o: spec.i,
        +    q: spec.q,
        +    s: s,
        +  }
        +}
        +
        +/**
        + * Get the preferred media types from an Accept header.
        + * @public
        + */
        +
        +function preferredMediaTypes(accept, provided) {
        +  // RFC 2616 sec 14.2: no header = */*
        +  var accepts = parseAccept(accept === undefined ? '*/*' : accept || '');
        +
        +  if (!provided) {
        +    // sorted list of all types
        +    return accepts
        +      .filter(isQuality)
        +      .sort(compareSpecs)
        +      .map(getFullType);
        +  }
        +
        +  var priorities = provided.map(function getPriority(type, index) {
        +    return getMediaTypePriority(type, accepts, index);
        +  });
        +
        +  // sorted list of accepted types
        +  return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) {
        +    return provided[priorities.indexOf(priority)];
        +  });
        +}
        +
        +/**
        + * Compare two specs.
        + * @private
        + */
        +
        +function compareSpecs(a, b) {
        +  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
        +}
        +
        +/**
        + * Get full type string.
        + * @private
        + */
        +
        +function getFullType(spec) {
        +  return spec.type + '/' + spec.subtype;
        +}
        +
        +/**
        + * Check if a spec has any quality.
        + * @private
        + */
        +
        +function isQuality(spec) {
        +  return spec.q > 0;
        +}
        +
        +/**
        + * Count the number of quotes in a string.
        + * @private
        + */
        +
        +function quoteCount(string) {
        +  var count = 0;
        +  var index = 0;
        +
        +  while ((index = string.indexOf('"', index)) !== -1) {
        +    count++;
        +    index++;
        +  }
        +
        +  return count;
        +}
        +
        +/**
        + * Split a key value pair.
        + * @private
        + */
        +
        +function splitKeyValuePair(str) {
        +  var index = str.indexOf('=');
        +  var key;
        +  var val;
        +
        +  if (index === -1) {
        +    key = str;
        +  } else {
        +    key = str.substr(0, index);
        +    val = str.substr(index + 1);
        +  }
        +
        +  return [key, val];
        +}
        +
        +/**
        + * Split an Accept header into media types.
        + * @private
        + */
        +
        +function splitMediaTypes(accept) {
        +  var accepts = accept.split(',');
        +
        +  for (var i = 1, j = 0; i < accepts.length; i++) {
        +    if (quoteCount(accepts[j]) % 2 == 0) {
        +      accepts[++j] = accepts[i];
        +    } else {
        +      accepts[j] += ',' + accepts[i];
        +    }
        +  }
        +
        +  // trim accepts
        +  accepts.length = j + 1;
        +
        +  return accepts;
        +}
        +
        +/**
        + * Split a string of parameters.
        + * @private
        + */
        +
        +function splitParameters(str) {
        +  var parameters = str.split(';');
        +
        +  for (var i = 1, j = 0; i < parameters.length; i++) {
        +    if (quoteCount(parameters[j]) % 2 == 0) {
        +      parameters[++j] = parameters[i];
        +    } else {
        +      parameters[j] += ';' + parameters[i];
        +    }
        +  }
        +
        +  // trim parameters
        +  parameters.length = j + 1;
        +
        +  for (var i = 0; i < parameters.length; i++) {
        +    parameters[i] = parameters[i].trim();
        +  }
        +
        +  return parameters;
        +}
        diff --git a/deps/npm/node_modules/negotiator/package.json b/deps/npm/node_modules/negotiator/package.json
        new file mode 100644
        index 00000000000000..0c7ff3c2e64682
        --- /dev/null
        +++ b/deps/npm/node_modules/negotiator/package.json
        @@ -0,0 +1,42 @@
        +{
        +  "name": "negotiator",
        +  "description": "HTTP content negotiation",
        +  "version": "0.6.2",
        +  "contributors": [
        +    "Douglas Christopher Wilson ",
        +    "Federico Romero ",
        +    "Isaac Z. Schlueter  (http://blog.izs.me/)"
        +  ],
        +  "license": "MIT",
        +  "keywords": [
        +    "http",
        +    "content negotiation",
        +    "accept",
        +    "accept-language",
        +    "accept-encoding",
        +    "accept-charset"
        +  ],
        +  "repository": "jshttp/negotiator",
        +  "devDependencies": {
        +    "eslint": "5.16.0",
        +    "eslint-plugin-markdown": "1.0.0",
        +    "mocha": "6.1.4",
        +    "nyc": "14.0.0"
        +  },
        +  "files": [
        +    "lib/",
        +    "HISTORY.md",
        +    "LICENSE",
        +    "index.js",
        +    "README.md"
        +  ],
        +  "engines": {
        +    "node": ">= 0.6"
        +  },
        +  "scripts": {
        +    "lint": "eslint --plugin markdown --ext js,md .",
        +    "test": "mocha --reporter spec --check-leaks --bail test/",
        +    "test-cov": "nyc --reporter=html --reporter=text npm test",
        +    "test-travis": "nyc --reporter=text npm test"
        +  }
        +}
        diff --git a/deps/npm/node_modules/npm-audit-report/CHANGELOG.md b/deps/npm/node_modules/npm-audit-report/CHANGELOG.md
        deleted file mode 100644
        index 58819a43b4d110..00000000000000
        --- a/deps/npm/node_modules/npm-audit-report/CHANGELOG.md
        +++ /dev/null
        @@ -1,81 +0,0 @@
        -# Change Log
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -
        -## [1.3.3](https://github.com/npm/npm-audit-report/compare/v1.3.2...v1.3.3) (2020-03-26)
        -
        -
        -
        -
        -## [1.3.2](https://github.com/npm/npm-audit-report/compare/v1.3.1...v1.3.2) (2018-12-18)
        -
        -
        -### Bug Fixes
        -
        -* **parseable:** add support for critical vulns and more resolves on update/install action ([#28](https://github.com/npm/npm-audit-report/issues/28)) ([5e27893](https://github.com/npm/npm-audit-report/commit/5e27893))
        -* **security:** audit fix ([ff9faf3](https://github.com/npm/npm-audit-report/commit/ff9faf3))
        -* **urls:** Replace hardcoded URL to advisory with a URL from audit response ([#34](https://github.com/npm/npm-audit-report/issues/34)) ([e2fe95b](https://github.com/npm/npm-audit-report/commit/e2fe95b))
        -
        -
        -
        -
        -## [1.3.1](https://github.com/npm/npm-audit-report/compare/v1.3.0...v1.3.1) (2018-07-10)
        -
        -
        -
        -
        -# [1.3.0](https://github.com/npm/npm-audit-report/compare/v1.2.1...v1.3.0) (2018-07-09)
        -
        -
        -### Bug Fixes
        -
        -* **deps:** remove object.values dependency ([2c5374a](https://github.com/npm/npm-audit-report/commit/2c5374a))
        -* **detail:** Fix info-level severity ([#18](https://github.com/npm/npm-audit-report/issues/18)) ([807db5a](https://github.com/npm/npm-audit-report/commit/807db5a))
        -* **tests:** a test should not cause side-effects in other tests ([#23](https://github.com/npm/npm-audit-report/issues/23)) ([a94449f](https://github.com/npm/npm-audit-report/commit/a94449f))
        -
        -
        -### Features
        -
        -* **output:** add `parseable` tabular output format support ([#21](https://github.com/npm/npm-audit-report/issues/21)) ([1c9aaf4](https://github.com/npm/npm-audit-report/commit/1c9aaf4))
        -
        -
        -
        -
        -## [1.2.1](https://github.com/npm/npm-audit-report/compare/v1.2.0...v1.2.1) (2018-05-17)
        -
        -
        -### Bug Fixes
        -
        -* **detail:** count id+path instead of just id ([99880fd](https://github.com/npm/npm-audit-report/commit/99880fd))
        -
        -
        -
        -
        -# [1.2.0](https://github.com/npm/npm-audit-report/compare/v1.1.0...v1.2.0) (2018-05-16)
        -
        -
        -### Bug Fixes
        -
        -* **full-report:** Fix install flag for devDependencies ([#14](https://github.com/npm/npm-audit-report/issues/14)) ([30e5f30](https://github.com/npm/npm-audit-report/commit/30e5f30))
        -
        -
        -### Features
        -
        -* **detail:** consistified full report with install report ([#15](https://github.com/npm/npm-audit-report/issues/15)) ([6df6810](https://github.com/npm/npm-audit-report/commit/6df6810))
        -* **install:** include `npm audit` recommendation too ([32fb153](https://github.com/npm/npm-audit-report/commit/32fb153))
        -
        -
        -
        -
        -# [1.1.0](https://github.com/npm/npm-audit-report/compare/v1.0.9...v1.1.0) (2018-05-10)
        -
        -
        -### Bug Fixes
        -
        -* **install:** not enough data for this conditional ([6ddc30c](https://github.com/npm/npm-audit-report/commit/6ddc30c))
        -
        -
        -### Features
        -
        -* **report:** compress and reformat human-readable install report ([74d5203](https://github.com/npm/npm-audit-report/commit/74d5203))
        diff --git a/deps/npm/node_modules/npm-audit-report/lib/index.js b/deps/npm/node_modules/npm-audit-report/lib/index.js
        index 464004c17518a9..9ee86be7915d8d 100644
        --- a/deps/npm/node_modules/npm-audit-report/lib/index.js
        +++ b/deps/npm/node_modules/npm-audit-report/lib/index.js
        @@ -15,9 +15,11 @@ module.exports = Object.assign((data, options = {}) => {
             color = true,
             unicode = true,
             indent = 2,
        -    auditLevel = 'low'
           } = options
         
        +  // CLI defaults this to `null` so the defaulting method above doesn't work
        +  const auditLevel = options.auditLevel || 'low'
        +
           if (!data)
             throw Object.assign(
               new TypeError('ENOAUDITDATA'),
        diff --git a/deps/npm/node_modules/npm-audit-report/package.json b/deps/npm/node_modules/npm-audit-report/package.json
        index 66b4a6aa74b2c1..c819b9608412ac 100644
        --- a/deps/npm/node_modules/npm-audit-report/package.json
        +++ b/deps/npm/node_modules/npm-audit-report/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "npm-audit-report",
        -  "version": "2.1.4",
        +  "version": "2.1.5",
           "description": "Given a response from the npm security api, render it into a variety of security reports",
           "main": "lib/index.js",
           "scripts": {
        @@ -26,8 +26,8 @@
             "chalk": "^4.0.0"
           },
           "devDependencies": {
        -    "tap": "^14.10.7",
        -    "require-inject": "^1.4.4"
        +    "require-inject": "^1.4.4",
        +    "tap": "^14.10.7"
           },
           "directories": {
             "lib": "lib",
        diff --git a/deps/npm/node_modules/npm-package-arg/CHANGELOG.md b/deps/npm/node_modules/npm-package-arg/CHANGELOG.md
        deleted file mode 100644
        index 390a3a3c4f2de0..00000000000000
        --- a/deps/npm/node_modules/npm-package-arg/CHANGELOG.md
        +++ /dev/null
        @@ -1,52 +0,0 @@
        -# Changelog
        -
        -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
        -
        -## [8.0.0](https://github.com/npm/npm-package-arg/compare/v7.0.0...v8.0.0) (2019-12-15)
        -
        -
        -### ⚠ BREAKING CHANGES
        -
        -* Dropping support for node 6 and 8.  It'll probably
        -still work on those versions, but they are no longer supported or
        -tested, since npm v7 is moving away from them.
        -
        -* drop support for node 6 and 8 ([ba85e68](https://github.com/npm/npm-package-arg/commit/ba85e68555d6270f672c3d59da17672f744d0376))
        -
        -
        -# [7.0.0](https://github.com/npm/npm-package-arg/compare/v6.1.1...v7.0.0) (2019-11-11)
        -
        -
        -### deps
        -
        -* bump hosted-git-info to 3.0.2 ([68a4fc3](https://github.com/npm/npm-package-arg/commit/68a4fc3)), closes [/github.com/npm/hosted-git-info/pull/38#issuecomment-520243803](https://github.com//github.com/npm/hosted-git-info/pull/38/issues/issuecomment-520243803)
        -
        -
        -### BREAKING CHANGES
        -
        -* this drops support for ancient node versions.
        -
        -
        -
        -
        -## [6.1.1](https://github.com/npm/npm-package-arg/compare/v6.1.0...v6.1.1) (2019-08-21)
        -
        -
        -### Bug Fixes
        -
        -* preserve drive letter on windows git file:// urls ([3909203](https://github.com/npm/npm-package-arg/commit/3909203))
        -
        -
        -
        -
        -# [6.1.0](https://github.com/npm/npm-package-arg/compare/v6.0.0...v6.1.0) (2018-04-10)
        -
        -
        -### Bug Fixes
        -
        -* **git:** Fix gitRange for git+ssh for private git ([#33](https://github.com/npm/npm-package-arg/issues/33)) ([647a0b3](https://github.com/npm/npm-package-arg/commit/647a0b3))
        -
        -
        -### Features
        -
        -* **alias:** add `npm:` registry alias spec ([#34](https://github.com/npm/npm-package-arg/issues/34)) ([ab99f8e](https://github.com/npm/npm-package-arg/commit/ab99f8e))
        diff --git a/deps/npm/node_modules/npm-package-arg/npa.js b/deps/npm/node_modules/npm-package-arg/npa.js
        index 6018dd608ed334..3a01d4d9071929 100644
        --- a/deps/npm/node_modules/npm-package-arg/npa.js
        +++ b/deps/npm/node_modules/npm-package-arg/npa.js
        @@ -3,16 +3,12 @@ module.exports = npa
         module.exports.resolve = resolve
         module.exports.Result = Result
         
        -let url
        -let HostedGit
        -let semver
        -let path_
        -function path () {
        -  if (!path_) path_ = require('path')
        -  return path_
        -}
        -let validatePackageName
        -let os
        +const url = require('url')
        +const HostedGit = require('hosted-git-info')
        +const semver = require('semver')
        +const path = require('path')
        +const validatePackageName = require('validate-npm-package-name')
        +const { homedir } = require('os')
         
         const isWindows = process.platform === 'win32' || global.FAKE_WINDOWS
         const hasSlashes = isWindows ? /\\|[/]/ : /[/]/
        @@ -24,33 +20,30 @@ function npa (arg, where) {
           let name
           let spec
           if (typeof arg === 'object') {
        -    if (arg instanceof Result && (!where || where === arg.where)) {
        +    if (arg instanceof Result && (!where || where === arg.where))
               return arg
        -    } else if (arg.name && arg.rawSpec) {
        +    else if (arg.name && arg.rawSpec)
               return npa.resolve(arg.name, arg.rawSpec, where || arg.where)
        -    } else {
        +    else
               return npa(arg.raw, where || arg.where)
        -    }
           }
           const nameEndsAt = arg[0] === '@' ? arg.slice(1).indexOf('@') + 1 : arg.indexOf('@')
           const namePart = nameEndsAt > 0 ? arg.slice(0, nameEndsAt) : arg
        -  if (isURL.test(arg)) {
        +  if (isURL.test(arg))
             spec = arg
        -  } else if (isGit.test(arg)) {
        +  else if (isGit.test(arg))
             spec = `git+ssh://${arg}`
        -  } else if (namePart[0] !== '@' && (hasSlashes.test(namePart) || isFilename.test(namePart))) {
        +  else if (namePart[0] !== '@' && (hasSlashes.test(namePart) || isFilename.test(namePart)))
             spec = arg
        -  } else if (nameEndsAt > 0) {
        +  else if (nameEndsAt > 0) {
             name = namePart
             spec = arg.slice(nameEndsAt + 1)
           } else {
        -    if (!validatePackageName) validatePackageName = require('validate-npm-package-name')
             const valid = validatePackageName(arg)
        -    if (valid.validForOldPackages) {
        +    if (valid.validForOldPackages)
               name = arg
        -    } else {
        +    else
               spec = arg
        -    }
           }
           return resolve(name, spec, where, arg)
         }
        @@ -62,27 +55,29 @@ function resolve (name, spec, where, arg) {
             raw: arg,
             name: name,
             rawSpec: spec,
        -    fromArgument: arg != null
        +    fromArgument: arg != null,
           })
         
        -  if (name) res.setName(name)
        +  if (name)
        +    res.setName(name)
         
        -  if (spec && (isFilespec.test(spec) || /^file:/i.test(spec))) {
        +  if (spec && (isFilespec.test(spec) || /^file:/i.test(spec)))
             return fromFile(res, where)
        -  } else if (spec && /^npm:/i.test(spec)) {
        +  else if (spec && /^npm:/i.test(spec))
             return fromAlias(res, where)
        -  }
        -  if (!HostedGit) HostedGit = require('hosted-git-info')
        -  const hosted = HostedGit.fromUrl(spec, { noGitPlus: true, noCommittish: true })
        -  if (hosted) {
        +
        +  const hosted = HostedGit.fromUrl(spec, {
        +    noGitPlus: true,
        +    noCommittish: true,
        +  })
        +  if (hosted)
             return fromHostedGit(res, hosted)
        -  } else if (spec && isURL.test(spec)) {
        +  else if (spec && isURL.test(spec))
             return fromURL(res)
        -  } else if (spec && (hasSlashes.test(spec) || isFilename.test(spec))) {
        +  else if (spec && (hasSlashes.test(spec) || isFilename.test(spec)))
             return fromFile(res, where)
        -  } else {
        +  else
             return fromRegistry(res)
        -  }
         }
         
         function invalidPackageName (name, valid) {
        @@ -100,29 +95,29 @@ function Result (opts) {
           this.type = opts.type
           this.registry = opts.registry
           this.where = opts.where
        -  if (opts.raw == null) {
        +  if (opts.raw == null)
             this.raw = opts.name ? opts.name + '@' + opts.rawSpec : opts.rawSpec
        -  } else {
        +  else
             this.raw = opts.raw
        -  }
        +
           this.name = undefined
           this.escapedName = undefined
           this.scope = undefined
           this.rawSpec = opts.rawSpec == null ? '' : opts.rawSpec
           this.saveSpec = opts.saveSpec
           this.fetchSpec = opts.fetchSpec
        -  if (opts.name) this.setName(opts.name)
        +  if (opts.name)
        +    this.setName(opts.name)
           this.gitRange = opts.gitRange
           this.gitCommittish = opts.gitCommittish
           this.hosted = opts.hosted
         }
         
         Result.prototype.setName = function (name) {
        -  if (!validatePackageName) validatePackageName = require('validate-npm-package-name')
           const valid = validatePackageName(name)
        -  if (!valid.validForOldPackages) {
        +  if (!valid.validForOldPackages)
             throw invalidPackageName(name, valid)
        -  }
        +
           this.name = name
           this.scope = name[0] === '@' ? name.slice(0, name.indexOf('/')) : undefined
           // scoped packages in couch must have slash url-encoded, e.g. @foo%2Fbar
        @@ -132,9 +127,11 @@ Result.prototype.setName = function (name) {
         
         Result.prototype.toString = function () {
           const full = []
        -  if (this.name != null && this.name !== '') full.push(this.name)
        +  if (this.name != null && this.name !== '')
        +    full.push(this.name)
           const spec = this.saveSpec || this.fetchSpec || this.rawSpec
        -  if (spec != null && spec !== '') full.push(spec)
        +  if (spec != null && spec !== '')
        +    full.push(spec)
           return full.length ? full.join('@') : this.raw
         }
         
        @@ -148,45 +145,47 @@ function setGitCommittish (res, committish) {
           if (committish != null && committish.length >= 7 && committish.slice(0, 7) === 'semver:') {
             res.gitRange = decodeURIComponent(committish.slice(7))
             res.gitCommittish = null
        -  } else {
        +  } else
             res.gitCommittish = committish === '' ? null : committish
        -  }
        +
           return res
         }
         
         const isAbsolutePath = /^[/]|^[A-Za-z]:/
         
         function resolvePath (where, spec) {
        -  if (isAbsolutePath.test(spec)) return spec
        -  return path().resolve(where, spec)
        +  if (isAbsolutePath.test(spec))
        +    return spec
        +  return path.resolve(where, spec)
         }
         
         function isAbsolute (dir) {
        -  if (dir[0] === '/') return true
        -  if (/^[A-Za-z]:/.test(dir)) return true
        +  if (dir[0] === '/')
        +    return true
        +  if (/^[A-Za-z]:/.test(dir))
        +    return true
           return false
         }
         
         function fromFile (res, where) {
        -  if (!where) where = process.cwd()
        +  if (!where)
        +    where = process.cwd()
           res.type = isFilename.test(res.rawSpec) ? 'file' : 'directory'
           res.where = where
         
           const spec = res.rawSpec.replace(/\\/g, '/')
             .replace(/^file:[/]*([A-Za-z]:)/, '$1') // drive name paths on windows
        -    .replace(/^file:(?:[/]*([~./]))?/, '$1')
        +    .replace(/^file:(?:[/]*(~\/|\.*\/|[/]))?/, '$1')
           if (/^~[/]/.test(spec)) {
             // this is needed for windows and for file:~/foo/bar
        -    if (!os) os = require('os')
        -    res.fetchSpec = resolvePath(os.homedir(), spec.slice(2))
        +    res.fetchSpec = resolvePath(homedir(), spec.slice(2))
             res.saveSpec = 'file:' + spec
           } else {
             res.fetchSpec = resolvePath(where, spec)
        -    if (isAbsolute(spec)) {
        +    if (isAbsolute(spec))
               res.saveSpec = 'file:' + spec
        -    } else {
        -      res.saveSpec = 'file:' + path().relative(where, res.fetchSpec)
        -    }
        +    else
        +      res.saveSpec = 'file:' + path.relative(where, res.fetchSpec)
           }
           return res
         }
        @@ -217,12 +216,12 @@ function matchGitScp (spec) {
           const matched = spec.match(/^git\+ssh:\/\/([^:#]+:[^#]+(?:\.git)?)(?:#(.*))?$/i)
           return matched && !matched[1].match(/:[0-9]+\/?.*$/i) && {
             fetchSpec: matched[1],
        -    gitCommittish: matched[2] == null ? null : matched[2]
        +    gitCommittish: matched[2] == null ? null : matched[2],
           }
         }
         
         function fromURL (res) {
        -  if (!url) url = require('url')
        +  // eslint-disable-next-line node/no-deprecated-api
           const urlparse = url.parse(res.rawSpec)
           res.saveSpec = res.rawSpec
           // check the protocol, and then see if it's git or not
        @@ -233,9 +232,10 @@ function fromURL (res) {
             case 'git+rsync:':
             case 'git+ftp:':
             case 'git+file:':
        -    case 'git+ssh:':
        +    case 'git+ssh:': {
               res.type = 'git'
        -      const match = urlparse.protocol === 'git+ssh:' && matchGitScp(res.rawSpec)
        +      const match = urlparse.protocol === 'git+ssh:' ? matchGitScp(res.rawSpec)
        +        : null
               if (match) {
                 setGitCommittish(res, match.gitCommittish)
                 res.fetchSpec = match.fetchSpec
        @@ -251,6 +251,7 @@ function fromURL (res) {
                 res.fetchSpec = url.format(urlparse)
               }
               break
        +    }
             case 'http:':
             case 'https:':
               res.type = 'remote'
        @@ -266,12 +267,12 @@ function fromURL (res) {
         
         function fromAlias (res, where) {
           const subSpec = npa(res.rawSpec.substr(4), where)
        -  if (subSpec.type === 'alias') {
        +  if (subSpec.type === 'alias')
             throw new Error('nested aliases not supported')
        -  }
        -  if (!subSpec.registry) {
        +
        +  if (!subSpec.registry)
             throw new Error('aliases only work for registry deps')
        -  }
        +
           res.subSpec = subSpec
           res.registry = true
           res.type = 'alias'
        @@ -282,22 +283,21 @@ function fromAlias (res, where) {
         
         function fromRegistry (res) {
           res.registry = true
        -  const spec = res.rawSpec === '' ? 'latest' : res.rawSpec
        +  const spec = res.rawSpec === '' ? 'latest' : res.rawSpec.trim()
           // no save spec for registry components as we save based on the fetched
           // version, not on the argument so this can't compute that.
           res.saveSpec = null
           res.fetchSpec = spec
        -  if (!semver) semver = require('semver')
           const version = semver.valid(spec, true)
           const range = semver.validRange(spec, true)
        -  if (version) {
        +  if (version)
             res.type = 'version'
        -  } else if (range) {
        +  else if (range)
             res.type = 'range'
        -  } else {
        -    if (encodeURIComponent(spec) !== spec) {
        +  else {
        +    if (encodeURIComponent(spec) !== spec)
               throw invalidTagName(spec)
        -    }
        +
             res.type = 'tag'
           }
           return res
        diff --git a/deps/npm/node_modules/npm-package-arg/package.json b/deps/npm/node_modules/npm-package-arg/package.json
        index ed3b364442c2cc..a237928943ccb5 100644
        --- a/deps/npm/node_modules/npm-package-arg/package.json
        +++ b/deps/npm/node_modules/npm-package-arg/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "npm-package-arg",
        -  "version": "8.1.2",
        +  "version": "8.1.4",
           "description": "Parse the things that can be arguments to `npm install`",
           "main": "npa.js",
           "directories": {
        @@ -15,14 +15,20 @@
             "validate-npm-package-name": "^3.0.0"
           },
           "devDependencies": {
        -    "tap": "^14.11.0"
        +    "@npmcli/lint": "^1.0.1",
        +    "tap": "^15.0.9"
           },
           "scripts": {
             "preversion": "npm test",
             "postversion": "npm publish",
             "prepublishOnly": "git push origin --follow-tags",
             "test": "tap",
        -    "snap": "tap"
        +    "snap": "tap",
        +    "npmclilint": "npmcli-lint",
        +    "lint": "npm run npmclilint -- \"*.*js\" \"test/**/*.*js\"",
        +    "lintfix": "npm run lint -- --fix",
        +    "posttest": "npm run lint --",
        +    "postsnap": "npm run lintfix --"
           },
           "repository": {
             "type": "git",
        diff --git a/deps/npm/node_modules/npm-profile/CHANGELOG.md b/deps/npm/node_modules/npm-profile/CHANGELOG.md
        deleted file mode 100644
        index 3205cf532299bf..00000000000000
        --- a/deps/npm/node_modules/npm-profile/CHANGELOG.md
        +++ /dev/null
        @@ -1,62 +0,0 @@
        -# v5.0.0 (2020-02-27)
        -
        -- Drop the CLI from the project, just maintain the library
        -- Drop support for EOL Node.js versions
        -- Remove `Promise` option, just use native Promises
        -- Remove `figgy-pudding`
        -- Use `npm-registry-fetch` v8
        -- fix: do not try to open invalid URLs for WebLogin
        -
        -# v4.0.3 (2020-02-27)
        -
        -- fix: do not try to open invalid URLs for WebLogin
        -
        -# v4.0.2 (2019-07-16)
        -
        -- Update `npm-registry-fetch` to 4.0.0
        -
        -# v4.0.1 (2018-08-29)
        -
        -- `opts.password` needs to be base64-encoded when passed in for login
        -- Bump `npm-registry-fetch` dep because we depend on `opts.forceAuth`
        -
        -# v4.0.0 (2018-08-28)
        -
        -## BREAKING CHANGES:
        -
        -- Networking and auth-related options now use the latest [`npm-registry-fetch` config format](https://www.npmjs.com/package/npm-registry-fetch#fetch-opts).
        -
        -# v3.0.2 (2018-06-07)
        -
        -- Allow newer make-fetch-happen.
        -- Report 500s from weblogin end point as unsupported.
        -- EAUTHUNKNOWN errors were incorrectly reported as EAUTHIP.
        -
        -# v3.0.1 (2018-02-18)
        -
        -- Log `npm-notice` headers
        -
        -# v3.0.0 (2018-02-18)
        -
        -## BREAKING CHANGES:
        -
        -- profile.login() and profile.adduser() take 2 functions: opener() and
        -  prompter().  opener is used when we get the url couplet from the
        -  registry.  prompter is used if web-based login fails.
        -- Non-200 status codes now always throw.  Previously if the `content.error`
        -  property was set, `content` would be returned. Content is available on the
        -  thrown error object in the `body` property.
        -
        -## FEATURES:
        -
        -- The previous adduser is available as adduserCouch
        -- The previous login is available as loginCouch
        -- New loginWeb and adduserWeb commands added, which take an opener
        -  function to open up the web browser.
        -- General errors have better error message reporting
        -
        -## FIXES:
        -
        -- General errors now correctly include the URL.
        -- Missing user errors from Couch are now thrown. (As was always intended.)
        -- Many errors have better stacktrace filtering.
        diff --git a/deps/npm/node_modules/npm-profile/package.json b/deps/npm/node_modules/npm-profile/package.json
        index 7e2acc4d075255..43cc7c921bb049 100644
        --- a/deps/npm/node_modules/npm-profile/package.json
        +++ b/deps/npm/node_modules/npm-profile/package.json
        @@ -1,12 +1,12 @@
         {
           "name": "npm-profile",
        -  "version": "5.0.3",
        +  "version": "5.0.4",
           "description": "Library for updating an npmjs.com profile",
           "keywords": [],
           "author": "Rebecca Turner  (http://re-becca.org/)",
           "license": "ISC",
           "dependencies": {
        -    "npm-registry-fetch": "^10.0.0"
        +    "npm-registry-fetch": "^11.0.0"
           },
           "main": "index.js",
           "repository": {
        diff --git a/deps/npm/node_modules/npm-registry-fetch/README.md b/deps/npm/node_modules/npm-registry-fetch/README.md
        index 5ce9770c604cf7..efc3b1f644b5d0 100644
        --- a/deps/npm/node_modules/npm-registry-fetch/README.md
        +++ b/deps/npm/node_modules/npm-registry-fetch/README.md
        @@ -390,7 +390,7 @@ invocations of the CLI).
         * Type: String
         * Default: null
         
        -If provided, it will be sent in the `npm-command` header.  This yeader is
        +If provided, it will be sent in the `npm-command` header.  This header is
         used by the npm registry to identify the npm command that caused this
         request to be made.
         
        @@ -516,10 +516,7 @@ If the request URI already has a query string, it will be merged with
         * Default: `'https://registry.npmjs.org'`
         
         Registry configuration for a request. If a request URL only includes the URL
        -path, this registry setting will be prepended. This configuration is also used
        -to determine authentication details, so even if the request URL references a
        -completely different host, `opts.registry` will be used to find the auth details
        -for that request.
        +path, this registry setting will be prepended.
         
         See also [`opts.scope`](#opts-scope), [`opts.spec`](#opts-spec), and
         [`opts.:registry`](#opts-scope-registry) which can all affect the actual
        diff --git a/deps/npm/node_modules/npm-registry-fetch/check-response.js b/deps/npm/node_modules/npm-registry-fetch/check-response.js
        index 7610e0d7a7ad2e..8bd85661ee8cae 100644
        --- a/deps/npm/node_modules/npm-registry-fetch/check-response.js
        +++ b/deps/npm/node_modules/npm-registry-fetch/check-response.js
        @@ -1,46 +1,46 @@
         'use strict'
         
         const errors = require('./errors.js')
        -const LRU = require('lru-cache')
         const { Response } = require('minipass-fetch')
         const defaultOpts = require('./default-opts.js')
         
        -const checkResponse = async ({ method, uri, res, registry, startTime, auth, opts }) => {
        -  opts = { ...defaultOpts, ...opts }
        -  if (res.headers.has('npm-notice') && !res.headers.has('x-local-cache'))
        -    opts.log.notice('', res.headers.get('npm-notice'))
        +const checkResponse =
        +  async ({ method, uri, res, registry, startTime, auth, opts }) => {
        +    opts = { ...defaultOpts, ...opts }
        +    if (res.headers.has('npm-notice') && !res.headers.has('x-local-cache'))
        +      opts.log.notice('', res.headers.get('npm-notice'))
         
        -  checkWarnings(res, registry, opts)
        -  if (res.status >= 400) {
        -    logRequest(method, res, startTime, opts)
        -    if (auth && auth.scopeAuthKey && !auth.token && !auth.auth) {
        +    if (res.status >= 400) {
        +      logRequest(method, res, startTime, opts)
        +      if (auth && auth.scopeAuthKey && !auth.token && !auth.auth) {
               // we didn't have auth for THIS request, but we do have auth for
               // requests to the registry indicated by the spec's scope value.
               // Warn the user.
        -      opts.log.warn('registry', `No auth for URI, but auth present for scoped registry.
        +        opts.log.warn('registry', `No auth for URI, but auth present for scoped registry.
         
         URI: ${uri}
         Scoped Registry Key: ${auth.scopeAuthKey}
         
         More info here: https://github.com/npm/cli/wiki/No-auth-for-URI,-but-auth-present-for-scoped-registry`)
        +      }
        +      return checkErrors(method, res, startTime, opts)
        +    } else {
        +      res.body.on('end', () => logRequest(method, res, startTime, opts))
        +      if (opts.ignoreBody) {
        +        res.body.resume()
        +        return new Response(null, res)
        +      }
        +      return res
             }
        -    return checkErrors(method, res, startTime, opts)
        -  } else {
        -    res.body.on('end', () => logRequest(method, res, startTime, opts))
        -    if (opts.ignoreBody) {
        -      res.body.resume()
        -      return new Response(null, res)
        -    }
        -    return res
           }
        -}
         module.exports = checkResponse
         
         function logRequest (method, res, startTime, opts) {
           const elapsedTime = Date.now() - startTime
           const attempt = res.headers.get('x-fetch-attempts')
           const attemptStr = attempt && attempt > 1 ? ` attempt #${attempt}` : ''
        -  const cacheStr = res.headers.get('x-local-cache') ? ' (from cache)' : ''
        +  const cacheStatus = res.headers.get('x-local-cache-status')
        +  const cacheStr = cacheStatus ? ` (cache ${cacheStatus})` : ''
         
           let urlStr
           try {
        @@ -60,46 +60,6 @@ function logRequest (method, res, startTime, opts) {
           )
         }
         
        -const WARNING_REGEXP = /^\s*(\d{3})\s+(\S+)\s+"(.*)"\s+"([^"]+)"/
        -const BAD_HOSTS = new LRU({ max: 50 })
        -
        -function checkWarnings (res, registry, opts) {
        -  if (res.headers.has('warning') && !BAD_HOSTS.has(registry)) {
        -    const warnings = {}
        -    // note: headers.raw() will preserve case, so we might have a
        -    // key on the object like 'WaRnInG' if that was used first
        -    for (const [key, value] of Object.entries(res.headers.raw())) {
        -      if (key.toLowerCase() !== 'warning')
        -        continue
        -      value.forEach(w => {
        -        const match = w.match(WARNING_REGEXP)
        -        if (match) {
        -          warnings[match[1]] = {
        -            code: match[1],
        -            host: match[2],
        -            message: match[3],
        -            date: new Date(match[4]),
        -          }
        -        }
        -      })
        -    }
        -    BAD_HOSTS.set(registry, true)
        -    if (warnings['199']) {
        -      if (warnings['199'].message.match(/ENOTFOUND/))
        -        opts.log.warn('registry', `Using stale data from ${registry} because the host is inaccessible -- are you offline?`)
        -      else
        -        opts.log.warn('registry', `Unexpected warning for ${registry}: ${warnings['199'].message}`)
        -    }
        -    if (warnings['111']) {
        -      // 111 Revalidation failed -- we're using stale data
        -      opts.log.warn(
        -        'registry',
        -        `Using stale data from ${registry} due to a request error during revalidation.`
        -      )
        -    }
        -  }
        -}
        -
         function checkErrors (method, res, startTime, opts) {
           return res.buffer()
             .catch(() => null)
        @@ -126,7 +86,8 @@ function checkErrors (method, res, startTime, opts) {
                   )
                 }
               } else if (res.status === 401 && body != null && /one-time pass/.test(body.toString('utf8'))) {
        -        // Heuristic for malformed OTP responses that don't include the www-authenticate header.
        +        // Heuristic for malformed OTP responses that don't include the
        +        // www-authenticate header.
                 throw new errors.HttpErrorAuthOTP(
                   method, res, parsed, opts.spec
                 )
        diff --git a/deps/npm/node_modules/npm-registry-fetch/index.js b/deps/npm/node_modules/npm-registry-fetch/index.js
        index 5411b51e58abca..35fab75bcade98 100644
        --- a/deps/npm/node_modules/npm-registry-fetch/index.js
        +++ b/deps/npm/node_modules/npm-registry-fetch/index.js
        @@ -160,7 +160,8 @@ function fetchJSON (uri, opts) {
         }
         
         module.exports.json.stream = fetchJSONStream
        -function fetchJSONStream (uri, jsonPath, /* istanbul ignore next */ opts_ = {}) {
        +function fetchJSONStream (uri, jsonPath,
        +  /* istanbul ignore next */ opts_ = {}) {
           const opts = { ...defaultOpts, ...opts_ }
           const parser = JSONStream.parse(jsonPath, opts.mapJSON)
           regFetch(uri, opts).then(res =>
        diff --git a/deps/npm/node_modules/npm-registry-fetch/package.json b/deps/npm/node_modules/npm-registry-fetch/package.json
        index d32f82c075ae76..e4eaabaa5b09a6 100644
        --- a/deps/npm/node_modules/npm-registry-fetch/package.json
        +++ b/deps/npm/node_modules/npm-registry-fetch/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "npm-registry-fetch",
        -  "version": "10.1.2",
        +  "version": "11.0.0",
           "description": "Fetch-based http client for use with npm registry APIs",
           "main": "index.js",
           "files": [
        @@ -8,13 +8,15 @@
           ],
           "scripts": {
             "eslint": "eslint",
        -    "lint": "npm run eslint -- *.js test/*.js",
        +    "lint": "npm run npmclilint -- \"*.*js\" \"test/**/*.*js\"",
             "lintfix": "npm run lint -- --fix",
             "prepublishOnly": "git push origin --follow-tags",
             "preversion": "npm test",
             "postversion": "npm publish",
             "test": "tap",
        -    "posttest": "npm run lint"
        +    "posttest": "npm run lint --",
        +    "npmclilint": "npmcli-lint",
        +    "postsnap": "npm run lintfix --"
           },
           "repository": "https://github.com/npm/npm-registry-fetch",
           "keywords": [
        @@ -29,8 +31,7 @@
           },
           "license": "ISC",
           "dependencies": {
        -    "lru-cache": "^6.0.0",
        -    "make-fetch-happen": "^8.0.9",
        +    "make-fetch-happen": "^9.0.1",
             "minipass": "^3.1.3",
             "minipass-fetch": "^1.3.0",
             "minipass-json-stream": "^1.0.1",
        @@ -38,17 +39,11 @@
             "npm-package-arg": "^8.0.0"
           },
           "devDependencies": {
        +    "@npmcli/lint": "^1.0.1",
             "cacache": "^15.0.0",
        -    "eslint": "^6.8.0",
        -    "eslint-plugin-import": "^2.18.2",
        -    "eslint-plugin-node": "^10.0.0",
        -    "eslint-plugin-promise": "^4.2.1",
        -    "eslint-plugin-standard": "^4.0.1",
        -    "mkdirp": "^0.5.1",
        -    "nock": "^11.7.0",
        +    "nock": "^13.1.0",
             "npmlog": "^4.1.2",
             "require-inject": "^1.4.4",
        -    "rimraf": "^2.6.2",
             "ssri": "^8.0.0",
             "tap": "^15.0.4"
           },
        diff --git a/deps/npm/node_modules/pacote/package.json b/deps/npm/node_modules/pacote/package.json
        index 2461b055bfd13c..7472c6eeab0cc8 100644
        --- a/deps/npm/node_modules/pacote/package.json
        +++ b/deps/npm/node_modules/pacote/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "pacote",
        -  "version": "11.3.3",
        +  "version": "11.3.4",
           "description": "JavaScript package downloader",
           "author": "Isaac Z. Schlueter  (https://izs.me)",
           "bin": {
        @@ -46,7 +46,7 @@
             "npm-package-arg": "^8.0.1",
             "npm-packlist": "^2.1.4",
             "npm-pick-manifest": "^6.0.0",
        -    "npm-registry-fetch": "^10.0.0",
        +    "npm-registry-fetch": "^11.0.0",
             "promise-retry": "^2.0.1",
             "read-package-json-fast": "^2.0.1",
             "rimraf": "^3.0.2",
        diff --git a/deps/npm/node_modules/path-parse/.travis.yml b/deps/npm/node_modules/path-parse/.travis.yml
        deleted file mode 100644
        index dae31da968ba1f..00000000000000
        --- a/deps/npm/node_modules/path-parse/.travis.yml
        +++ /dev/null
        @@ -1,9 +0,0 @@
        -language: node_js
        -node_js:
        -  - "0.12"
        -  - "0.11"
        -  - "0.10"
        -  - "0.10.12"
        -  - "0.8"
        -  - "0.6"
        -  - "iojs"
        diff --git a/deps/npm/node_modules/path-parse/index.js b/deps/npm/node_modules/path-parse/index.js
        index 3b7601fe494eed..ffb22a1ead9a3e 100644
        --- a/deps/npm/node_modules/path-parse/index.js
        +++ b/deps/npm/node_modules/path-parse/index.js
        @@ -2,29 +2,14 @@
         
         var isWindows = process.platform === 'win32';
         
        -// Regex to split a windows path into three parts: [*, device, slash,
        -// tail] windows-only
        -var splitDeviceRe =
        -    /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
        -
        -// Regex to split the tail part of the above into [*, dir, basename, ext]
        -var splitTailRe =
        -    /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;
        +// Regex to split a windows path into into [dir, root, basename, name, ext]
        +var splitWindowsRe =
        +    /^(((?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?[\\\/]?)(?:[^\\\/]*[\\\/])*)((\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))[\\\/]*$/;
         
         var win32 = {};
         
        -// Function to split a filename into [root, dir, basename, ext]
         function win32SplitPath(filename) {
        -  // Separate device+slash from tail
        -  var result = splitDeviceRe.exec(filename),
        -      device = (result[1] || '') + (result[2] || ''),
        -      tail = result[3] || '';
        -  // Split the tail into dir, basename and extension
        -  var result2 = splitTailRe.exec(tail),
        -      dir = result2[1],
        -      basename = result2[2],
        -      ext = result2[3];
        -  return [device, dir, basename, ext];
        +  return splitWindowsRe.exec(filename).slice(1);
         }
         
         win32.parse = function(pathString) {
        @@ -34,24 +19,24 @@ win32.parse = function(pathString) {
             );
           }
           var allParts = win32SplitPath(pathString);
        -  if (!allParts || allParts.length !== 4) {
        +  if (!allParts || allParts.length !== 5) {
             throw new TypeError("Invalid path '" + pathString + "'");
           }
           return {
        -    root: allParts[0],
        -    dir: allParts[0] + allParts[1].slice(0, -1),
        +    root: allParts[1],
        +    dir: allParts[0] === allParts[1] ? allParts[0] : allParts[0].slice(0, -1),
             base: allParts[2],
        -    ext: allParts[3],
        -    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
        +    ext: allParts[4],
        +    name: allParts[3]
           };
         };
         
         
         
        -// Split a filename into [root, dir, basename, ext], unix version
        +// Split a filename into [dir, root, basename, name, ext], unix version
         // 'root' is just a slash, or nothing.
         var splitPathRe =
        -    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
        +    /^((\/?)(?:[^\/]*\/)*)((\.{1,2}|[^\/]+?|)(\.[^.\/]*|))[\/]*$/;
         var posix = {};
         
         
        @@ -67,19 +52,16 @@ posix.parse = function(pathString) {
             );
           }
           var allParts = posixSplitPath(pathString);
        -  if (!allParts || allParts.length !== 4) {
        +  if (!allParts || allParts.length !== 5) {
             throw new TypeError("Invalid path '" + pathString + "'");
           }
        -  allParts[1] = allParts[1] || '';
        -  allParts[2] = allParts[2] || '';
        -  allParts[3] = allParts[3] || '';
         
           return {
        -    root: allParts[0],
        -    dir: allParts[0] + allParts[1].slice(0, -1),
        +    root: allParts[1],
        +    dir: allParts[0].slice(0, -1),
             base: allParts[2],
        -    ext: allParts[3],
        -    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
        +    ext: allParts[4],
        +    name: allParts[3],
           };
         };
         
        diff --git a/deps/npm/node_modules/path-parse/package.json b/deps/npm/node_modules/path-parse/package.json
        index 21332bb14f8b7f..36c23f84e7063c 100644
        --- a/deps/npm/node_modules/path-parse/package.json
        +++ b/deps/npm/node_modules/path-parse/package.json
        @@ -1,6 +1,6 @@
         {
           "name": "path-parse",
        -  "version": "1.0.6",
        +  "version": "1.0.7",
           "description": "Node.js path.parse() ponyfill",
           "main": "index.js",
           "scripts": {
        diff --git a/deps/npm/node_modules/path-parse/test.js b/deps/npm/node_modules/path-parse/test.js
        deleted file mode 100644
        index 0b30c123936395..00000000000000
        --- a/deps/npm/node_modules/path-parse/test.js
        +++ /dev/null
        @@ -1,77 +0,0 @@
        -var assert = require('assert');
        -var pathParse = require('./index');
        -
        -var winParseTests = [
        -  [{ root: 'C:\\', dir: 'C:\\path\\dir', base: 'index.html', ext: '.html', name: 'index' }, 'C:\\path\\dir\\index.html'],
        -  [{ root: 'C:\\', dir: 'C:\\another_path\\DIR\\1\\2\\33', base: 'index', ext: '', name: 'index' }, 'C:\\another_path\\DIR\\1\\2\\33\\index'],
        -  [{ root: '', dir: 'another_path\\DIR with spaces\\1\\2\\33', base: 'index', ext: '', name: 'index' }, 'another_path\\DIR with spaces\\1\\2\\33\\index'],
        -  [{ root: '\\', dir: '\\foo', base: 'C:', ext: '', name: 'C:' }, '\\foo\\C:'],
        -  [{ root: '', dir: '', base: 'file', ext: '', name: 'file' }, 'file'],
        -  [{ root: '', dir: '.', base: 'file', ext: '', name: 'file' }, '.\\file'],
        -
        -  // unc
        -  [{ root: '\\\\server\\share\\', dir: '\\\\server\\share\\', base: 'file_path', ext: '', name: 'file_path' }, '\\\\server\\share\\file_path'],
        -  [{ root: '\\\\server two\\shared folder\\', dir: '\\\\server two\\shared folder\\', base: 'file path.zip', ext: '.zip', name: 'file path' }, '\\\\server two\\shared folder\\file path.zip'],
        -  [{ root: '\\\\teela\\admin$\\', dir: '\\\\teela\\admin$\\', base: 'system32', ext: '', name: 'system32' }, '\\\\teela\\admin$\\system32'],
        -  [{ root: '\\\\?\\UNC\\', dir: '\\\\?\\UNC\\server', base: 'share', ext: '', name: 'share' }, '\\\\?\\UNC\\server\\share']
        -];
        -
        -var winSpecialCaseFormatTests = [
        -  [{dir: 'some\\dir'}, 'some\\dir\\'],
        -  [{base: 'index.html'}, 'index.html'],
        -  [{}, '']
        -];
        -
        -var unixParseTests = [
        -  [{ root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' }, '/home/user/dir/file.txt'],
        -  [{ root: '/', dir: '/home/user/a dir', base: 'another File.zip', ext: '.zip', name: 'another File' }, '/home/user/a dir/another File.zip'],
        -  [{ root: '/', dir: '/home/user/a dir/', base: 'another&File.', ext: '.', name: 'another&File' }, '/home/user/a dir//another&File.'],
        -  [{ root: '/', dir: '/home/user/a$$$dir/', base: 'another File.zip', ext: '.zip', name: 'another File' }, '/home/user/a$$$dir//another File.zip'],
        -  [{ root: '', dir: 'user/dir', base: 'another File.zip', ext: '.zip', name: 'another File' }, 'user/dir/another File.zip'],
        -  [{ root: '', dir: '', base: 'file', ext: '', name: 'file' }, 'file'],
        -  [{ root: '', dir: '', base: '.\\file', ext: '', name: '.\\file' }, '.\\file'],
        -  [{ root: '', dir: '.', base: 'file', ext: '', name: 'file' }, './file'],
        -  [{ root: '', dir: '', base: 'C:\\foo', ext: '', name: 'C:\\foo' }, 'C:\\foo']
        -];
        -
        -var unixSpecialCaseFormatTests = [
        -  [{dir: 'some/dir'}, 'some/dir/'],
        -  [{base: 'index.html'}, 'index.html'],
        -  [{}, '']
        -];
        -
        -var errors = [
        -  {input: null, message: /Parameter 'pathString' must be a string, not/},
        -  {input: {}, message: /Parameter 'pathString' must be a string, not object/},
        -  {input: true, message: /Parameter 'pathString' must be a string, not boolean/},
        -  {input: 1, message: /Parameter 'pathString' must be a string, not number/},
        -  {input: undefined, message: /Parameter 'pathString' must be a string, not undefined/},
        -];
        -
        -checkParseFormat(pathParse.win32, winParseTests);
        -checkParseFormat(pathParse.posix, unixParseTests);
        -checkErrors(pathParse.win32);
        -checkErrors(pathParse.posix);
        -
        -function checkErrors(parse) {
        -  errors.forEach(function(errorCase) {
        -    try {
        -      parse(errorCase.input);
        -    } catch(err) {
        -      assert.ok(err instanceof TypeError);
        -      assert.ok(
        -        errorCase.message.test(err.message),
        -        'expected ' + errorCase.message + ' to match ' + err.message
        -      );
        -      return;
        -    }
        -
        -    assert.fail('should have thrown');
        -  });
        -}
        -
        -function checkParseFormat(parse, testCases) {
        -  testCases.forEach(function(testCase) {
        -    assert.deepEqual(parse(testCase[1]), testCase[0]);
        -  });
        -}
        diff --git a/deps/npm/node_modules/form-data/License b/deps/npm/node_modules/request/node_modules/form-data/License
        similarity index 100%
        rename from deps/npm/node_modules/form-data/License
        rename to deps/npm/node_modules/request/node_modules/form-data/License
        diff --git a/deps/npm/node_modules/form-data/README.md b/deps/npm/node_modules/request/node_modules/form-data/README.md
        similarity index 100%
        rename from deps/npm/node_modules/form-data/README.md
        rename to deps/npm/node_modules/request/node_modules/form-data/README.md
        diff --git a/deps/npm/node_modules/form-data/README.md.bak b/deps/npm/node_modules/request/node_modules/form-data/README.md.bak
        similarity index 100%
        rename from deps/npm/node_modules/form-data/README.md.bak
        rename to deps/npm/node_modules/request/node_modules/form-data/README.md.bak
        diff --git a/deps/npm/node_modules/form-data/lib/browser.js b/deps/npm/node_modules/request/node_modules/form-data/lib/browser.js
        similarity index 100%
        rename from deps/npm/node_modules/form-data/lib/browser.js
        rename to deps/npm/node_modules/request/node_modules/form-data/lib/browser.js
        diff --git a/deps/npm/node_modules/form-data/lib/form_data.js b/deps/npm/node_modules/request/node_modules/form-data/lib/form_data.js
        similarity index 100%
        rename from deps/npm/node_modules/form-data/lib/form_data.js
        rename to deps/npm/node_modules/request/node_modules/form-data/lib/form_data.js
        diff --git a/deps/npm/node_modules/form-data/lib/populate.js b/deps/npm/node_modules/request/node_modules/form-data/lib/populate.js
        similarity index 100%
        rename from deps/npm/node_modules/form-data/lib/populate.js
        rename to deps/npm/node_modules/request/node_modules/form-data/lib/populate.js
        diff --git a/deps/npm/node_modules/form-data/package.json b/deps/npm/node_modules/request/node_modules/form-data/package.json
        similarity index 100%
        rename from deps/npm/node_modules/form-data/package.json
        rename to deps/npm/node_modules/request/node_modules/form-data/package.json
        diff --git a/deps/npm/node_modules/form-data/yarn.lock b/deps/npm/node_modules/request/node_modules/form-data/yarn.lock
        similarity index 100%
        rename from deps/npm/node_modules/form-data/yarn.lock
        rename to deps/npm/node_modules/request/node_modules/form-data/yarn.lock
        diff --git a/deps/npm/node_modules/retry/Readme.md b/deps/npm/node_modules/retry/README.md
        similarity index 99%
        rename from deps/npm/node_modules/retry/Readme.md
        rename to deps/npm/node_modules/retry/README.md
        index 16e28ec267d6da..1c888deee9c9d4 100644
        --- a/deps/npm/node_modules/retry/Readme.md
        +++ b/deps/npm/node_modules/retry/README.md
        @@ -66,7 +66,7 @@ Creates a new `RetryOperation` object. `options` is the same as `retry.timeouts(
         
         * `forever`: Whether to retry forever, defaults to `false`.
         * `unref`: Whether to [unref](https://nodejs.org/api/timers.html#timers_unref) the setTimeout's, defaults to `false`.
        -* `maxRetryTime`: The maximum time (in milliseconds) that the retried operation is allowed to run. Default is `Infinity`.  
        +* `maxRetryTime`: The maximum time (in milliseconds) that the retried operation is allowed to run. Default is `Infinity`.
         
         ### retry.timeouts([options])
         
        diff --git a/deps/npm/node_modules/spdx-license-ids/README.md b/deps/npm/node_modules/spdx-license-ids/README.md
        index 699514d1a28aa5..e9b5aa6372c9c7 100644
        --- a/deps/npm/node_modules/spdx-license-ids/README.md
        +++ b/deps/npm/node_modules/spdx-license-ids/README.md
        @@ -7,7 +7,7 @@ A list of [SPDX license](https://spdx.org/licenses/) identifiers
         
         ## Installation
         
        -[Download JSON directly](https://raw.githubusercontent.com/shinnn/spdx-license-ids/master/index.json), or [use](https://docs.npmjs.com/cli/install) [npm](https://docs.npmjs.com/about-npm/):
        +[Download JSON directly](https://raw.githubusercontent.com/shinnn/spdx-license-ids/main/index.json), or [use](https://docs.npmjs.com/cli/install) [npm](https://docs.npmjs.com/about-npm/):
         
         ```
         npm install spdx-license-ids
        diff --git a/deps/npm/node_modules/spdx-license-ids/index.json b/deps/npm/node_modules/spdx-license-ids/index.json
        index 864d2410c83a90..c2d5e017b29673 100644
        --- a/deps/npm/node_modules/spdx-license-ids/index.json
        +++ b/deps/npm/node_modules/spdx-license-ids/index.json
        @@ -42,11 +42,14 @@
         	"BSD-3-Clause-Attribution",
         	"BSD-3-Clause-Clear",
         	"BSD-3-Clause-LBNL",
        +	"BSD-3-Clause-Modification",
        +	"BSD-3-Clause-No-Military-License",
         	"BSD-3-Clause-No-Nuclear-License",
         	"BSD-3-Clause-No-Nuclear-License-2014",
         	"BSD-3-Clause-No-Nuclear-Warranty",
         	"BSD-3-Clause-Open-MPI",
         	"BSD-4-Clause",
        +	"BSD-4-Clause-Shortened",
         	"BSD-4-Clause-UC",
         	"BSD-Protection",
         	"BSD-Source-Code",
        @@ -59,6 +62,7 @@
         	"BitTorrent-1.1",
         	"BlueOak-1.0.0",
         	"Borceux",
        +	"C-UDA-1.0",
         	"CAL-1.0",
         	"CAL-1.0-Combined-Work-Exception",
         	"CATOSL-1.1",
        @@ -93,6 +97,7 @@
         	"CC-BY-SA-1.0",
         	"CC-BY-SA-2.0",
         	"CC-BY-SA-2.0-UK",
        +	"CC-BY-SA-2.1-JP",
         	"CC-BY-SA-2.5",
         	"CC-BY-SA-3.0",
         	"CC-BY-SA-3.0-AT",
        @@ -101,6 +106,7 @@
         	"CC0-1.0",
         	"CDDL-1.0",
         	"CDDL-1.1",
        +	"CDL-1.0",
         	"CDLA-Permissive-1.0",
         	"CDLA-Sharing-1.0",
         	"CECILL-1.0",
        @@ -129,6 +135,7 @@
         	"Cube",
         	"D-FSL-1.0",
         	"DOC",
        +	"DRL-1.0",
         	"DSDP",
         	"Dotseqn",
         	"ECL-1.0",
        @@ -151,7 +158,9 @@
         	"FTL",
         	"Fair",
         	"Frameworx-1.0",
        +	"FreeBSD-DOC",
         	"FreeImage",
        +	"GD",
         	"GFDL-1.1-invariants-only",
         	"GFDL-1.1-invariants-or-later",
         	"GFDL-1.1-no-invariants-only",
        @@ -227,6 +236,7 @@
         	"MIT",
         	"MIT-0",
         	"MIT-CMU",
        +	"MIT-Modern-Variant",
         	"MIT-advertising",
         	"MIT-enna",
         	"MIT-feh",
        @@ -246,6 +256,7 @@
         	"MulanPSL-2.0",
         	"Multics",
         	"Mup",
        +	"NAIST-2003",
         	"NASA-1.3",
         	"NBPL-1.0",
         	"NCGL-UK-2.0",
        @@ -280,6 +291,7 @@
         	"OFL-1.1-RFN",
         	"OFL-1.1-no-RFN",
         	"OGC-1.0",
        +	"OGDL-Taiwan-1.0",
         	"OGL-Canada-2.0",
         	"OGL-UK-1.0",
         	"OGL-UK-2.0",
        diff --git a/deps/npm/node_modules/spdx-license-ids/package.json b/deps/npm/node_modules/spdx-license-ids/package.json
        index eea631250e53e7..5639091b877045 100644
        --- a/deps/npm/node_modules/spdx-license-ids/package.json
        +++ b/deps/npm/node_modules/spdx-license-ids/package.json
        @@ -1,6 +1,6 @@
         {
         	"name": "spdx-license-ids",
        -	"version": "3.0.7",
        +	"version": "3.0.9",
         	"description": "A list of SPDX license identifiers",
         	"repository": "jslicense/spdx-license-ids",
         	"author": "Shinnosuke Watanabe (https://github.com/shinnn)",
        diff --git a/deps/npm/package.json b/deps/npm/package.json
        index d7f46589a4d2b7..3f54979cb954ec 100644
        --- a/deps/npm/package.json
        +++ b/deps/npm/package.json
        @@ -1,7 +1,10 @@
         {
        -  "version": "7.14.0",
        +  "version": "7.16.0",
           "name": "npm",
           "description": "a package manager for JavaScript",
        +  "workspaces": [
        +    "docs"
        +  ],
           "keywords": [
             "install",
             "modules",
        @@ -42,7 +45,7 @@
             "./package.json": "./package.json"
           },
           "dependencies": {
        -    "@npmcli/arborist": "^2.6.0",
        +    "@npmcli/arborist": "^2.6.1",
             "@npmcli/ci-detect": "^1.2.0",
             "@npmcli/config": "^2.2.0",
             "@npmcli/run-script": "^1.8.5",
        @@ -51,7 +54,7 @@
             "ansistyles": "~0.1.3",
             "archy": "~1.0.0",
             "byte-size": "^7.0.1",
        -    "cacache": "^15.1.0",
        +    "cacache": "^15.2.0",
             "chalk": "^4.1.0",
             "chownr": "^2.0.0",
             "cli-columns": "^3.1.2",
        @@ -67,7 +70,7 @@
             "leven": "^3.1.0",
             "libnpmaccess": "^4.0.2",
             "libnpmdiff": "^2.0.4",
        -    "libnpmexec": "^1.1.1",
        +    "libnpmexec": "^1.2.0",
             "libnpmfund": "^1.1.0",
             "libnpmhook": "^6.0.2",
             "libnpmorg": "^2.0.2",
        @@ -76,7 +79,7 @@
             "libnpmsearch": "^3.1.1",
             "libnpmteam": "^2.0.3",
             "libnpmversion": "^1.2.0",
        -    "make-fetch-happen": "^8.0.14",
        +    "make-fetch-happen": "^9.0.1",
             "minipass": "^3.1.3",
             "minipass-pipeline": "^1.2.4",
             "mkdirp": "^1.0.4",
        @@ -84,11 +87,11 @@
             "ms": "^2.1.2",
             "node-gyp": "^7.1.2",
             "nopt": "^5.0.0",
        -    "npm-audit-report": "^2.1.4",
        -    "npm-package-arg": "^8.1.2",
        +    "npm-audit-report": "^2.1.5",
        +    "npm-package-arg": "^8.1.4",
             "npm-pick-manifest": "^6.1.1",
             "npm-profile": "^5.0.3",
        -    "npm-registry-fetch": "^10.1.2",
        +    "npm-registry-fetch": "^11.0.0",
             "npm-user-validate": "^1.0.1",
             "npmlog": "~4.1.2",
             "opener": "^1.5.2",
        @@ -180,18 +183,13 @@
             "write-file-atomic"
           ],
           "devDependencies": {
        -    "@mdx-js/mdx": "^1.6.22",
        -    "cmark-gfm": "^0.8.5",
             "eslint": "^7.26.0",
        -    "eslint-plugin-import": "^2.22.1",
        +    "eslint-plugin-import": "^2.23.4",
             "eslint-plugin-node": "^11.1.0",
             "eslint-plugin-promise": "^5.1.0",
             "eslint-plugin-standard": "^5.0.0",
        -    "jsdom": "^16.5.2",
        -    "licensee": "^8.1.0",
        -    "marked-man": "^0.7.0",
        -    "tap": "^15.0.9",
        -    "yaml": "^1.10.2"
        +    "licensee": "^8.2.0",
        +    "tap": "^15.0.9"
           },
           "scripts": {
             "dumpconf": "env | grep npm | sort | uniq",
        @@ -212,10 +210,6 @@
             "resetdeps": "bash scripts/resetdeps.sh",
             "smoke-tests": "tap smoke-tests/index.js"
           },
        -  "//": [
        -    "XXX temporarily only run unit tests while v7 beta is in progress",
        -    "Remove the 'files' below once we're done porting old tests over"
        -  ],
           "tap": {
             "test-env": [
               "LC_ALL=sk"
        diff --git a/deps/npm/tap-snapshots/test/lib/dist-tag.js.test.cjs b/deps/npm/tap-snapshots/test/lib/dist-tag.js.test.cjs
        index 86a9c84eb1eb63..7eceb0250d926b 100644
        --- a/deps/npm/tap-snapshots/test/lib/dist-tag.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/dist-tag.js.test.cjs
        @@ -6,7 +6,8 @@
          */
         'use strict'
         exports[`test/lib/dist-tag.js TAP add missing args > should exit usage error message 1`] = `
        -npm dist-tag
        +Error:
        +Usage: npm dist-tag
         
         Modify package distribution tags
         
        @@ -21,11 +22,14 @@ Options:
         
         alias: dist-tags
         
        -Run "npm help dist-tag" for more info
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
         `
         
         exports[`test/lib/dist-tag.js TAP add missing pkg name > should exit usage error message 1`] = `
        -npm dist-tag
        +Error:
        +Usage: npm dist-tag
         
         Modify package distribution tags
         
        @@ -40,7 +44,9 @@ Options:
         
         alias: dist-tags
         
        -Run "npm help dist-tag" for more info
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
         `
         
         exports[`test/lib/dist-tag.js TAP add new tag > should return success msg 1`] = `
        @@ -53,7 +59,8 @@ dist-tag add 1.0.0 to @scoped/another@7.7.7
         `
         
         exports[`test/lib/dist-tag.js TAP borked cmd usage > should show usage error 1`] = `
        -npm dist-tag
        +Error:
        +Usage: npm dist-tag
         
         Modify package distribution tags
         
        @@ -68,7 +75,31 @@ Options:
         
         alias: dist-tags
         
        -Run "npm help dist-tag" for more info
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
        +`
        +
        +exports[`test/lib/dist-tag.js TAP ls global > should throw basic usage 1`] = `
        +Error:
        +Usage: npm dist-tag
        +
        +Modify package distribution tags
        +
        +Usage:
        +npm dist-tag add @ []
        +npm dist-tag rm  
        +npm dist-tag ls []
        +
        +Options:
        +[-w|--workspace  [-w|--workspace  ...]]
        +[-ws|--workspaces]
        +
        +alias: dist-tags
        +
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
         `
         
         exports[`test/lib/dist-tag.js TAP ls in current package > should list available tags for current package 1`] = `
        @@ -78,7 +109,8 @@ latest: 1.0.0
         `
         
         exports[`test/lib/dist-tag.js TAP ls on missing name in current package > should throw usage error message 1`] = `
        -npm dist-tag
        +Error:
        +Usage: npm dist-tag
         
         Modify package distribution tags
         
        @@ -93,7 +125,9 @@ Options:
         
         alias: dist-tags
         
        -Run "npm help dist-tag" for more info
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
         `
         
         exports[`test/lib/dist-tag.js TAP ls on missing package > should log no dist-tag found msg 1`] = `
        @@ -133,7 +167,8 @@ exports[`test/lib/dist-tag.js TAP remove existing tag > should return success ms
         `
         
         exports[`test/lib/dist-tag.js TAP remove missing pkg name > should exit usage error message 1`] = `
        -npm dist-tag
        +Error:
        +Usage: npm dist-tag
         
         Modify package distribution tags
         
        @@ -148,7 +183,9 @@ Options:
         
         alias: dist-tags
         
        -Run "npm help dist-tag" for more info
        +Run "npm help dist-tag" for more info {
        +  "code": "EUSAGE",
        +}
         `
         
         exports[`test/lib/dist-tag.js TAP remove non-existing tag > should log error msg 1`] = `
        diff --git a/deps/npm/tap-snapshots/test/lib/init.js.test.cjs b/deps/npm/tap-snapshots/test/lib/init.js.test.cjs
        index 043d8b641dcce1..a7b007ac423005 100644
        --- a/deps/npm/tap-snapshots/test/lib/init.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/init.js.test.cjs
        @@ -6,13 +6,28 @@
          */
         'use strict'
         exports[`test/lib/init.js TAP workspaces no args > should print helper info 1`] = `
        +Array [
        +  Array [
        +    String(
        +      This utility will walk you through creating a package.json file.
        +      It only covers the most common items, and tries to guess sensible defaults.
         
        +      See \`npm help init\` for definitive documentation on these fields
        +      and exactly what they do.
        +
        +      Use \`npm install \` afterwards to install a package and
        +      save it as a dependency in the package.json file.
        +
        +      Press ^C at any time to quit.
        +    ),
        +  ],
        +]
         `
         
         exports[`test/lib/init.js TAP workspaces no args, existing folder > should print helper info 1`] = `
        -
        +Array []
         `
         
         exports[`test/lib/init.js TAP workspaces with arg but missing workspace folder > should print helper info 1`] = `
        -
        +Array []
         `
        diff --git a/deps/npm/tap-snapshots/test/lib/link.js.test.cjs b/deps/npm/tap-snapshots/test/lib/link.js.test.cjs
        index d6dd376593b4df..0e20bcd994e3ab 100644
        --- a/deps/npm/tap-snapshots/test/lib/link.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/link.js.test.cjs
        @@ -14,6 +14,16 @@ exports[`test/lib/link.js TAP link global linked pkg to local nm when using args
         
         `
         
        +exports[`test/lib/link.js TAP link global linked pkg to local workspace using args > should create a local symlink to global pkg 1`] = `
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/@myscope/bar -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/global-prefix/lib/node_modules/@myscope/bar
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/@myscope/linked -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/scoped-linked
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/a -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/global-prefix/lib/node_modules/a
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/link-me-too -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/link-me-too
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/test-pkg-link -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/test-pkg-link
        +{CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/node_modules/x -> {CWD}/test/lib/tap-testdir-link-link-global-linked-pkg-to-local-workspace-using-args/my-project/packages/x
        +
        +`
        +
         exports[`test/lib/link.js TAP link pkg already in global space > should create a local symlink to global pkg 1`] = `
         {CWD}/test/lib/tap-testdir-link-link-pkg-already-in-global-space/my-project/node_modules/@myscope/linked -> {CWD}/test/lib/tap-testdir-link-link-pkg-already-in-global-space/scoped-linked
         
        @@ -28,3 +38,8 @@ exports[`test/lib/link.js TAP link to globalDir when in current working dir of p
         {CWD}/test/lib/tap-testdir-link-link-to-globalDir-when-in-current-working-dir-of-pkg-and-no-args/global-prefix/lib/node_modules/test-pkg-link -> {CWD}/test/lib/tap-testdir-link-link-to-globalDir-when-in-current-working-dir-of-pkg-and-no-args/test-pkg-link
         
         `
        +
        +exports[`test/lib/link.js TAP link ws to globalDir when workspace specified and no args > should create a global link to current pkg 1`] = `
        +{CWD}/test/lib/tap-testdir-link-link-ws-to-globalDir-when-workspace-specified-and-no-args/global-prefix/lib/node_modules/a -> {CWD}/test/lib/tap-testdir-link-link-ws-to-globalDir-when-workspace-specified-and-no-args/test-pkg-link/packages/a
        +
        +`
        diff --git a/deps/npm/tap-snapshots/test/lib/load-all-commands.js.test.cjs b/deps/npm/tap-snapshots/test/lib/load-all-commands.js.test.cjs
        index f2d40d41614946..d40be42868184c 100644
        --- a/deps/npm/tap-snapshots/test/lib/load-all-commands.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/load-all-commands.js.test.cjs
        @@ -521,6 +521,8 @@ Options:
         [--strict-peer-deps] [--package-lock]
         [--omit  [--omit  ...]] [--ignore-scripts]
         [--audit] [--bin-links] [--fund] [--dry-run]
        +[-w|--workspace  [-w|--workspace  ...]]
        +[-ws|--workspaces]
         
         alias: ln
         
        diff --git a/deps/npm/tap-snapshots/test/lib/ls.js.test.cjs b/deps/npm/tap-snapshots/test/lib/ls.js.test.cjs
        index f443d9caba8954..2ed0b4b0013761 100644
        --- a/deps/npm/tap-snapshots/test/lib/ls.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/ls.js.test.cjs
        @@ -70,7 +70,7 @@ test-npm-ls@1.0.0 {CWD}/tap-testdir-ls-ls---dev
         
         exports[`test/lib/ls.js TAP ls --link > should output tree containing linked deps 1`] = `
         test-npm-ls@1.0.0 {CWD}/tap-testdir-ls-ls---link
        -\`-- linked-dep@1.0.0 -> {CWD}/tap-testdir-ls-ls---link/linked-dep
        +\`-- linked-dep@1.0.0 -> ./linked-dep
         
         `
         
        @@ -480,24 +480,24 @@ exports[`test/lib/ls.js TAP ls json read problems > should print empty result 1`
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should filter by parent folder workspace config 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -+-- e@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/e
        -\`-- f@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/f
        ++-- e@1.0.0 -> ./group/e
        +\`-- f@1.0.0 -> ./group/f
         
         `
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should filter single workspace 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -+-- a@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/a
        -| \`-- d@1.0.0 deduped -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        -\`-- d@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        ++-- a@1.0.0 -> ./a
        +| \`-- d@1.0.0 deduped -> ./d
        +\`-- d@1.0.0 -> ./d
         
         `
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should filter using workspace config 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -\`-- a@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/a
        +\`-- a@1.0.0 -> ./a
           +-- c@1.0.0
        -  \`-- d@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        +  \`-- d@1.0.0 -> ./d
             \`-- foo@1.1.1
               \`-- bar@1.0.0
         
        @@ -505,34 +505,34 @@ workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspac
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should list --all workspaces properly 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -+-- a@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/a
        ++-- a@1.0.0 -> ./a
         | +-- c@1.0.0
        -| \`-- d@1.0.0 deduped -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        -+-- b@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/b
        -+-- d@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        +| \`-- d@1.0.0 deduped -> ./d
        ++-- b@1.0.0 -> ./b
        ++-- d@1.0.0 -> ./d
         | \`-- foo@1.1.1
         |   \`-- bar@1.0.0
        -+-- e@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/e
        -\`-- f@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/f
        ++-- e@1.0.0 -> ./group/e
        +\`-- f@1.0.0 -> ./group/f
         
         `
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should list workspaces properly with default configs 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -+-- a@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/a
        ++-- a@1.0.0 -> ./a
         | +-- c@1.0.0
        -| \`-- d@1.0.0 deduped -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        -+-- b@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/b
        -+-- d@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        +| \`-- d@1.0.0 deduped -> ./d
        ++-- b@1.0.0 -> ./b
        ++-- d@1.0.0 -> ./d
         | \`-- foo@1.1.1
        -+-- e@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/e
        -\`-- f@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/group/f
        ++-- e@1.0.0 -> ./group/e
        +\`-- f@1.0.0 -> ./group/f
         
         `
         
         exports[`test/lib/ls.js TAP ls loading a tree containing workspaces > should print all tree and filter by dep within only the ws subtree 1`] = `
         workspaces-tree@1.0.0 {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces
        -\`-- d@1.0.0 -> {CWD}/tap-testdir-ls-ls-loading-a-tree-containing-workspaces/d
        +\`-- d@1.0.0 -> ./d
           \`-- foo@1.1.1
             \`-- bar@1.0.0
         
        @@ -567,8 +567,8 @@ test-npm-ls@1.0.0 {CWD}/tap-testdir-ls-ls-no-args
         exports[`test/lib/ls.js TAP ls print deduped symlinks > should output tree containing linked deps 1`] = `
         print-deduped-symlinks@1.0.0 {CWD}/tap-testdir-ls-ls-print-deduped-symlinks
         +-- a@1.0.0
        -| \`-- b@1.0.0 deduped -> {CWD}/tap-testdir-ls-ls-print-deduped-symlinks/b
        -\`-- b@1.0.0 -> {CWD}/tap-testdir-ls-ls-print-deduped-symlinks/b
        +| \`-- b@1.0.0 deduped -> ./b
        +\`-- b@1.0.0 -> ./b
         
         `
         
        diff --git a/deps/npm/tap-snapshots/test/lib/publish.js.test.cjs b/deps/npm/tap-snapshots/test/lib/publish.js.test.cjs
        index 05f0e6580ab5ac..7a7502e02e338a 100644
        --- a/deps/npm/tap-snapshots/test/lib/publish.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/publish.js.test.cjs
        @@ -5,6 +5,40 @@
          * Make sure to inspect the output below.  Do not ignore changes!
          */
         'use strict'
        +exports[`test/lib/publish.js TAP private workspaces colorless > should output all publishes 1`] = `
        +Array [
        +  "+ @npmcli/b@1.0.0",
        +]
        +`
        +
        +exports[`test/lib/publish.js TAP private workspaces colorless > should publish all non-private workspaces 1`] = `
        +Array [
        +  Object {
        +    "_id": "@npmcli/b@1.0.0",
        +    "name": "@npmcli/b",
        +    "readme": "ERROR: No README data found!",
        +    "version": "1.0.0",
        +  },
        +]
        +`
        +
        +exports[`test/lib/publish.js TAP private workspaces with color > should output all publishes 1`] = `
        +Array [
        +  "+ @npmcli/b@1.0.0",
        +]
        +`
        +
        +exports[`test/lib/publish.js TAP private workspaces with color > should publish all non-private workspaces 1`] = `
        +Array [
        +  Object {
        +    "_id": "@npmcli/b@1.0.0",
        +    "name": "@npmcli/b",
        +    "readme": "ERROR: No README data found!",
        +    "version": "1.0.0",
        +  },
        +]
        +`
        +
         exports[`test/lib/publish.js TAP shows usage with wrong set of arguments > should print usage 1`] = `
         Error: 
         Usage: npm publish
        diff --git a/deps/npm/tap-snapshots/test/lib/utils/config/describe-all.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/config/describe-all.js.test.cjs
        index 48aea03030c1ec..da8cd1794f2acd 100644
        --- a/deps/npm/tap-snapshots/test/lib/utils/config/describe-all.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/utils/config/describe-all.js.test.cjs
        @@ -655,6 +655,8 @@ What level of logs to report. On failure, *all* logs are written to
         Any logs of a higher level than the setting are shown. The default is
         "notice".
         
        +See also the \`foreground-scripts\` config.
        +
         #### \`logs-max\`
         
         * Default: 10
        diff --git a/deps/npm/tap-snapshots/test/lib/utils/npm-usage.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/npm-usage.js.test.cjs
        index a81a8f44b30b90..7fdcf0c5d2dba2 100644
        --- a/deps/npm/tap-snapshots/test/lib/utils/npm-usage.js.test.cjs
        +++ b/deps/npm/tap-snapshots/test/lib/utils/npm-usage.js.test.cjs
        @@ -624,6 +624,8 @@ All commands:
                             [--strict-peer-deps] [--package-lock]
                             [--omit  [--omit  ...]] [--ignore-scripts]
                             [--audit] [--bin-links] [--fund] [--dry-run]
        +                    [-w|--workspace  [-w|--workspace  ...]]
        +                    [-ws|--workspaces]
                             
                             alias: ln
                             
        diff --git a/deps/npm/test/fixtures/mock-npm.js b/deps/npm/test/fixtures/mock-npm.js
        index aa8d44020ee361..c972c35b318611 100644
        --- a/deps/npm/test/fixtures/mock-npm.js
        +++ b/deps/npm/test/fixtures/mock-npm.js
        @@ -4,35 +4,54 @@
         
         const realConfig = require('../../lib/utils/config')
         
        -const mockLog = {
        -  clearProgress: () => {},
        -  disableProgress: () => {},
        -  enableProgress: () => {},
        -  http: () => {},
        -  info: () => {},
        -  levels: [],
        -  notice: () => {},
        -  pause: () => {},
        -  silly: () => {},
        -  verbose: () => {},
        -  warn: () => {},
        -}
        -const mockNpm = (base = {}) => {
        -  const config = base.config || {}
        -  const flatOptions = base.flatOptions || {}
        -  return {
        -    log: mockLog,
        -    ...base,
        -    flatOptions,
        -    config: {
        +class MockNpm {
        +  constructor (base = {}) {
        +    this._mockOutputs = []
        +    this.isMockNpm = true
        +    this.base = base
        +
        +    const config = base.config || {}
        +
        +    for (const attr in base) {
        +      if (attr !== 'config') {
        +        this[attr] = base[attr]
        +      }
        +    }
        +
        +    this.flatOptions = base.flatOptions || {}
        +    this.config = {
               // for now just set `find` to what config.find should return
               // this works cause `find` is not an existing config entry
               find: (k) => ({...realConfig.defaults, ...config})[k],
               get: (k) => ({...realConfig.defaults, ...config})[k],
               set: (k, v) => config[k] = v,
               list: [{ ...realConfig.defaults, ...config}]
        -    },
        +    }
        +    if (!this.log) {
        +      this.log = {
        +        clearProgress: () => {},
        +        disableProgress: () => {},
        +        enableProgress: () => {},
        +        http: () => {},
        +        info: () => {},
        +        levels: [],
        +        notice: () => {},
        +        pause: () => {},
        +        silly: () => {},
        +        verbose: () => {},
        +        warn: () => {},
        +      }
        +    }
        +  }
        +
        +  output(...msg) {
        +    if (this.base.output)
        +      return this.base.output(msg)
        +    this._mockOutputs.push(msg)
           }
         }
         
        -module.exports = mockNpm
        +// TODO export MockNpm, and change tests to use new MockNpm()
        +module.exports = (base = {}) => {
        +  return new MockNpm(base)
        +}
        diff --git a/deps/npm/test/lib/cli.js b/deps/npm/test/lib/cli.js
        index f491c6174b85e2..42e05cc5d14c31 100644
        --- a/deps/npm/test/lib/cli.js
        +++ b/deps/npm/test/lib/cli.js
        @@ -45,6 +45,7 @@ const npmlogMock = {
         
         const cli = t.mock('../../lib/cli.js', {
           '../../lib/npm.js': npmock,
        +  '../../lib/utils/update-notifier.js': async () => null,
           '../../lib/utils/did-you-mean.js': () => '\ntest did you mean',
           '../../lib/utils/unsupported.js': unsupportedMock,
           '../../lib/utils/error-handler.js': errorHandlerMock,
        diff --git a/deps/npm/test/lib/diff.js b/deps/npm/test/lib/diff.js
        index 355095c95786ec..7a52ea5ee0ae14 100644
        --- a/deps/npm/test/lib/diff.js
        +++ b/deps/npm/test/lib/diff.js
        @@ -4,7 +4,7 @@ const mockNpm = require('../fixtures/mock-npm')
         
         const noop = () => null
         let libnpmdiff = noop
        -let rlp = () => 'foo'
        +let rpn = () => 'foo'
         
         const config = {
           global: false,
        @@ -33,7 +33,7 @@ const mocks = {
           npmlog: { info: noop, verbose: noop },
           libnpmdiff: (...args) => libnpmdiff(...args),
           'npm-registry-fetch': async () => ({}),
        -  '../../lib/utils/read-local-package.js': async () => rlp(),
        +  '../../lib/utils/read-package-name.js': async (prefix) => rpn(prefix),
           '../../lib/utils/usage.js': () => 'usage instructions',
         }
         
        @@ -52,7 +52,7 @@ t.afterEach(() => {
           npm.globalDir = __dirname
           npm.prefix = '..'
           libnpmdiff = noop
        -  rlp = () => 'foo'
        +  rpn = () => 'foo'
         })
         
         const Diff = t.mock('../../lib/diff.js', mocks)
        @@ -77,7 +77,7 @@ t.test('no args', t => {
           })
         
           t.test('no args, missing package.json name in cwd', t => {
        -    rlp = () => undefined
        +    rpn = () => undefined
         
             diff.exec([], err => {
               t.match(
        @@ -90,7 +90,7 @@ t.test('no args', t => {
           })
         
           t.test('no args, missing package.json in cwd', t => {
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
         
        @@ -109,14 +109,17 @@ t.test('no args', t => {
         
         t.test('single arg', t => {
           t.test('spec using cwd package name', t => {
        -    t.plan(3)
        +    t.plan(4)
         
        +    rpn = (prefix) => {
        +      t.equal(prefix, path, 'read-package-name gets proper prefix')
        +      return 'foo'
        +    }
             const path = t.testdir({})
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'foo@1.0.0', 'should forward single spec')
               t.equal(b, `file:${path}`, 'should compare to cwd')
               t.match(opts, npm.flatOptions, 'should forward flat options')
        -      t.end()
             }
         
             config.diff = ['foo@1.0.0']
        @@ -124,12 +127,13 @@ t.test('single arg', t => {
             diff.exec([], err => {
               if (err)
                 throw err
        +      t.end()
             })
           })
         
           t.test('unknown spec, no package.json', t => {
             const path = t.testdir({})
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
         
        @@ -182,7 +186,7 @@ t.test('single arg', t => {
           })
         
           t.test('version, no package.json', t => {
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
         
        @@ -273,7 +277,7 @@ t.test('single arg', t => {
         
           t.test('unknown package name, no package.json', t => {
             const path = t.testdir({})
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
         
        @@ -465,7 +469,7 @@ t.test('single arg', t => {
         
             const Diff = t.mock('../../lib/diff.js', {
               ...mocks,
        -      '../../lib/utils/read-local-package.js': async () => 'my-project',
        +      '../../lib/utils/read-package-name.js': async () => 'my-project',
               pacote: {
                 packument: (spec) => {
                   t.equal(spec.name, 'lorem', 'should have expected spec name')
        @@ -502,7 +506,7 @@ t.test('single arg', t => {
         
             const Diff = t.mock('../../lib/diff.js', {
               ...mocks,
        -      '../../lib/utils/read-local-package.js': async () => 'my-project',
        +      '../../lib/utils/read-package-name.js': async () => 'my-project',
               '@npmcli/arborist': class {
                 constructor () {
                   throw new Error('ERR')
        @@ -528,7 +532,7 @@ t.test('single arg', t => {
             t.plan(2)
         
             const path = t.testdir({})
        -    rlp = async () => undefined
        +    rpn = async () => undefined
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'bar@latest', 'should target latest tag of name')
               t.equal(b, `file:${path}`, 'should compare to cwd')
        @@ -547,7 +551,7 @@ t.test('single arg', t => {
             t.plan(2)
         
             const path = t.testdir({})
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'my-project@latest', 'should target latest tag of name')
               t.equal(b, `file:${path}`, 'should compare to cwd')
        @@ -565,7 +569,7 @@ t.test('single arg', t => {
             t.plan(2)
         
             const path = t.testdir({})
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'file:/path/to/other-dir', 'should target dir')
               t.equal(b, `file:${path}`, 'should compare to cwd')
        @@ -580,7 +584,7 @@ t.test('single arg', t => {
           })
         
           t.test('unsupported spec type', t => {
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
         
             config.diff = ['git+https://github.com/user/foo']
         
        @@ -634,7 +638,7 @@ t.test('first arg is a qualified spec', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'bar@2.0.0', 'should set expected first spec')
               t.equal(b, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
        @@ -703,7 +707,7 @@ t.test('first arg is a known dependency name', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
               t.equal(b, 'bar@2.0.0', 'should set expected second spec')
        @@ -743,7 +747,7 @@ t.test('first arg is a known dependency name', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
               t.equal(b, `bar-fork@file:${resolve(path, 'node_modules/bar-fork')}`, 'should target fork local node_modules pkg')
        @@ -777,7 +781,7 @@ t.test('first arg is a known dependency name', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
               t.equal(b, 'bar@2.0.0', 'should use package name from first arg')
        @@ -811,7 +815,7 @@ t.test('first arg is a known dependency name', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
               t.equal(b, 'bar-fork@latest', 'should set expected second spec')
        @@ -865,7 +869,7 @@ t.test('first arg is a valid semver range', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'bar@1.0.0', 'should use name from second arg')
               t.equal(b, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should set expected second spec from nm')
        @@ -882,7 +886,7 @@ t.test('first arg is a valid semver range', t => {
           t.test('second arg is ALSO a semver version', t => {
             t.plan(2)
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'my-project@1.0.0', 'should use name from project dir')
               t.equal(b, 'my-project@2.0.0', 'should use name from project dir')
        @@ -897,7 +901,7 @@ t.test('first arg is a valid semver range', t => {
         
           t.test('second arg is ALSO a semver version BUT cwd not a project dir', t => {
             const path = t.testdir({})
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
         
        @@ -916,7 +920,7 @@ t.test('first arg is a valid semver range', t => {
           t.test('second arg is an unknown dependency name', t => {
             t.plan(2)
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'bar@1.0.0', 'should use name from second arg')
               t.equal(b, 'bar@latest', 'should compare against latest tag')
        @@ -940,7 +944,7 @@ t.test('first arg is a valid semver range', t => {
         
             const Diff = t.mock('../../lib/diff.js', {
               ...mocks,
        -      '../../lib/utils/read-local-package.js': async () => 'my-project',
        +      '../../lib/utils/read-package-name.js': async () => 'my-project',
               '@npmcli/arborist': class {
                 constructor () {
                   throw new Error('ERR')
        @@ -1003,7 +1007,7 @@ t.test('first arg is an unknown dependency name', t => {
               }),
             })
         
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'bar-fork@latest', 'should use latest tag')
               t.equal(b, `bar@file:${resolve(path, 'node_modules/bar')}`, 'should target local node_modules pkg')
        @@ -1051,7 +1055,7 @@ t.test('first arg is an unknown dependency name', t => {
             t.plan(2)
         
             const path = t.testdir({})
        -    rlp = () => {
        +    rpn = () => {
               throw new Error('ERR')
             }
             libnpmdiff = async ([a, b], opts) => {
        @@ -1117,7 +1121,7 @@ t.test('various options', t => {
             t.plan(3)
         
             const path = t.testdir({})
        -    rlp = async () => 'my-project'
        +    rpn = async () => 'my-project'
             libnpmdiff = async ([a, b], opts) => {
               t.equal(a, 'my-project@latest', 'should have default spec')
               t.equal(b, `file:${path}`, 'should compare to cwd')
        diff --git a/deps/npm/test/lib/dist-tag.js b/deps/npm/test/lib/dist-tag.js
        index 6bc17168cdce0f..9af90c309c77ca 100644
        --- a/deps/npm/test/lib/dist-tag.js
        +++ b/deps/npm/test/lib/dist-tag.js
        @@ -93,6 +93,20 @@ t.test('ls in current package', (t) => {
           })
         })
         
        +t.test('ls global', (t) => {
        +  t.teardown(() => {
        +    config.global = false
        +  })
        +  config.global = true
        +  distTag.exec(['ls'], (err) => {
        +    t.matchSnapshot(
        +      err,
        +      'should throw basic usage'
        +    )
        +    t.end()
        +  })
        +})
        +
         t.test('no args in current package', (t) => {
           npm.prefix = t.testdir({
             'package.json': JSON.stringify({
        diff --git a/deps/npm/test/lib/exec.js b/deps/npm/test/lib/exec.js
        index 33e30e24f84e0a..6924783239b49d 100644
        --- a/deps/npm/test/lib/exec.js
        +++ b/deps/npm/test/lib/exec.js
        @@ -1,8 +1,6 @@
         const t = require('tap')
         const mockNpm = require('../fixtures/mock-npm')
         const { resolve, delimiter } = require('path')
        -const OUTPUT = []
        -const output = (...msg) => OUTPUT.push(msg)
         
         const ARB_CTOR = []
         const ARB_ACTUAL_TREE = {}
        @@ -36,6 +34,7 @@ const config = {
           package: [],
           'script-shell': 'shell-cmd',
         }
        +
         const npm = mockNpm({
           flatOptions,
           config,
        @@ -53,7 +52,6 @@ const npm = mockNpm({
               LOG_WARN.push(args)
             },
           },
        -  output,
         })
         
         const RUN_SCRIPTS = []
        @@ -225,7 +223,7 @@ t.test('npm exec , run interactive shell', t => {
             ARB_CTOR.length = 0
             MKDIRPS.length = 0
             ARB_REIFY.length = 0
        -    OUTPUT.length = 0
        +    npm._mockOutputs.length = 0
             exec.exec([], er => {
               if (er)
                 throw er
        @@ -256,7 +254,7 @@ t.test('npm exec , run interactive shell', t => {
             process.stdin.isTTY = true
             run(t, true, () => {
               t.strictSame(LOG_WARN, [])
        -      t.strictSame(OUTPUT, [
        +      t.strictSame(npm._mockOutputs, [
                 [`\nEntering npm script environment at location:\n${process.cwd()}\nType 'exit' or ^D when finished\n`],
               ], 'printed message about interactive shell')
               t.end()
        @@ -270,7 +268,7 @@ t.test('npm exec , run interactive shell', t => {
         
             run(t, true, () => {
               t.strictSame(LOG_WARN, [])
        -      t.strictSame(OUTPUT, [
        +      t.strictSame(npm._mockOutputs, [
                 [`\u001b[0m\u001b[0m\n\u001b[0mEntering npm script environment\u001b[0m\u001b[0m at location:\u001b[0m\n\u001b[0m\u001b[2m${process.cwd()}\u001b[22m\u001b[0m\u001b[1m\u001b[22m\n\u001b[1mType 'exit' or ^D when finished\u001b[22m\n\u001b[1m\u001b[22m`],
               ], 'printed message about interactive shell')
               t.end()
        @@ -282,7 +280,7 @@ t.test('npm exec , run interactive shell', t => {
             process.stdin.isTTY = false
             run(t, true, () => {
               t.strictSame(LOG_WARN, [])
        -      t.strictSame(OUTPUT, [], 'no message about interactive shell')
        +      t.strictSame(npm._mockOutputs, [], 'no message about interactive shell')
               t.end()
             })
           })
        @@ -294,7 +292,7 @@ t.test('npm exec , run interactive shell', t => {
               t.strictSame(LOG_WARN, [
                 ['exec', 'Interactive mode disabled in CI environment'],
               ])
        -      t.strictSame(OUTPUT, [], 'no message about interactive shell')
        +      t.strictSame(npm._mockOutputs, [], 'no message about interactive shell')
               t.end()
             })
           })
        @@ -309,14 +307,14 @@ t.test('npm exec , run interactive shell', t => {
                 throw er
         
               t.match(RUN_SCRIPTS, [{
        -        pkg: { scripts: { npx: undefined } },
        +        pkg: { scripts: { npx: /sh|cmd/ } },
               }])
         
               LOG_WARN.length = 0
               ARB_CTOR.length = 0
               MKDIRPS.length = 0
               ARB_REIFY.length = 0
        -      OUTPUT.length = 0
        +      npm._mockOutputs.length = 0
               RUN_SCRIPTS.length = 0
               t.end()
             })
        @@ -1195,7 +1193,7 @@ t.test('workspaces', t => {
                   return rej(er)
         
                 t.strictSame(LOG_WARN, [])
        -        t.strictSame(OUTPUT, [
        +        t.strictSame(npm._mockOutputs, [
                   [`\nEntering npm script environment in workspace a@1.0.0 at location:\n${resolve(npm.localPrefix, 'packages/a')}\nType 'exit' or ^D when finished\n`],
                 ], 'printed message about interactive shell')
                 res()
        @@ -1203,14 +1201,14 @@ t.test('workspaces', t => {
             })
         
             config.color = true
        -    OUTPUT.length = 0
        +    npm._mockOutputs.length = 0
             await new Promise((res, rej) => {
               exec.execWorkspaces([], ['a'], er => {
                 if (er)
                   return rej(er)
         
                 t.strictSame(LOG_WARN, [])
        -        t.strictSame(OUTPUT, [
        +        t.strictSame(npm._mockOutputs, [
                   [`\u001b[0m\u001b[0m\n\u001b[0mEntering npm script environment\u001b[0m\u001b[0m in workspace \u001b[32ma@1.0.0\u001b[39m at location:\u001b[0m\n\u001b[0m\u001b[2m${resolve(npm.localPrefix, 'packages/a')}\u001b[22m\u001b[0m\u001b[1m\u001b[22m\n\u001b[1mType 'exit' or ^D when finished\u001b[22m\n\u001b[1m\u001b[22m`],
                 ], 'printed message about interactive shell')
                 res()
        diff --git a/deps/npm/test/lib/init.js b/deps/npm/test/lib/init.js
        index 0964bb5cedde69..268b170cb4839c 100644
        --- a/deps/npm/test/lib/init.js
        +++ b/deps/npm/test/lib/init.js
        @@ -3,7 +3,6 @@ const { resolve } = require('path')
         const t = require('tap')
         const mockNpm = require('../fixtures/mock-npm')
         
        -let result = ''
         const npmLog = {
           disableProgress: () => null,
           enableProgress: () => null,
        @@ -19,9 +18,6 @@ const config = {
         const npm = mockNpm({
           config,
           log: npmLog,
        -  output: (...msg) => {
        -    result += msg.join('\n')
        -  },
         })
         const mocks = {
           '../../lib/utils/usage.js': () => 'usage instructions',
        @@ -33,7 +29,6 @@ const _consolelog = console.log
         const noop = () => {}
         
         t.afterEach(() => {
        -  result = ''
           config.yes = true
           config.package = undefined
           npm.log = npmLog
        @@ -322,6 +317,9 @@ t.test('npm init error', t => {
         
         t.test('workspaces', t => {
           t.test('no args', t => {
        +    t.teardown(() => {
        +      npm._mockOutputs.length = 0
        +    })
             npm.localPrefix = t.testdir({
               'package.json': JSON.stringify({
                 name: 'top-level',
        @@ -340,12 +338,15 @@ t.test('workspaces', t => {
               if (err)
                 throw err
         
        -      t.matchSnapshot(result, 'should print helper info')
        +      t.matchSnapshot(npm._mockOutputs, 'should print helper info')
               t.end()
             })
           })
         
           t.test('no args, existing folder', t => {
        +    t.teardown(() => {
        +      npm._mockOutputs.length = 0
        +    })
             // init-package-json prints directly to console.log
             // this avoids poluting test output with those logs
             console.log = noop
        @@ -369,12 +370,15 @@ t.test('workspaces', t => {
               if (err)
                 throw err
         
        -      t.matchSnapshot(result, 'should print helper info')
        +      t.matchSnapshot(npm._mockOutputs, 'should print helper info')
               t.end()
             })
           })
         
           t.test('with arg but missing workspace folder', t => {
        +    t.teardown(() => {
        +      npm._mockOutputs.length = 0
        +    })
             // init-package-json prints directly to console.log
             // this avoids poluting test output with those logs
             console.log = noop
        @@ -401,7 +405,7 @@ t.test('workspaces', t => {
               if (err)
                 throw err
         
        -      t.matchSnapshot(result, 'should print helper info')
        +      t.matchSnapshot(npm._mockOutputs, 'should print helper info')
               t.end()
             })
           })
        diff --git a/deps/npm/test/lib/link.js b/deps/npm/test/lib/link.js
        index d3e66185280ae0..3cad0ff90362d8 100644
        --- a/deps/npm/test/lib/link.js
        +++ b/deps/npm/test/lib/link.js
        @@ -84,6 +84,60 @@ t.test('link to globalDir when in current working dir of pkg and no args', (t) =
           })
         })
         
        +t.test('link ws to globalDir when workspace specified and no args', (t) => {
        +  t.plan(2)
        +
        +  const testdir = t.testdir({
        +    'global-prefix': {
        +      lib: {
        +        node_modules: {
        +          a: {
        +            'package.json': JSON.stringify({
        +              name: 'a',
        +              version: '1.0.0',
        +            }),
        +          },
        +        },
        +      },
        +    },
        +    'test-pkg-link': {
        +      'package.json': JSON.stringify({
        +        name: 'test-pkg-link',
        +        version: '1.0.0',
        +        workspaces: ['packages/*'],
        +      }),
        +      packages: {
        +        a: {
        +          'package.json': JSON.stringify({
        +            name: 'a',
        +            version: '1.0.0',
        +          }),
        +        },
        +      },
        +    },
        +  })
        +  npm.globalDir = resolve(testdir, 'global-prefix', 'lib', 'node_modules')
        +  npm.prefix = resolve(testdir, 'test-pkg-link')
        +  npm.localPrefix = resolve(testdir, 'test-pkg-link')
        +
        +  reifyOutput = async () => {
        +    reifyOutput = undefined
        +
        +    const links = await printLinks({
        +      path: resolve(npm.globalDir, '..'),
        +      global: true,
        +    })
        +
        +    t.matchSnapshot(links, 'should create a global link to current pkg')
        +  }
        +
        +  // link.workspaces = ['a']
        +  // link.workspacePaths = [resolve(testdir, 'test-pkg-link/packages/a')]
        +  link.execWorkspaces([], ['a'], (err) => {
        +    t.error(err, 'should not error out')
        +  })
        +})
        +
         t.test('link global linked pkg to local nm when using args', (t) => {
           t.plan(2)
         
        @@ -192,6 +246,124 @@ t.test('link global linked pkg to local nm when using args', (t) => {
           })
         })
         
        +t.test('link global linked pkg to local workspace using args', (t) => {
        +  t.plan(2)
        +
        +  const testdir = t.testdir({
        +    'global-prefix': {
        +      lib: {
        +        node_modules: {
        +          '@myscope': {
        +            foo: {
        +              'package.json': JSON.stringify({
        +                name: '@myscope/foo',
        +                version: '1.0.0',
        +              }),
        +            },
        +            bar: {
        +              'package.json': JSON.stringify({
        +                name: '@myscope/bar',
        +                version: '1.0.0',
        +              }),
        +            },
        +            linked: t.fixture('symlink', '../../../../scoped-linked'),
        +          },
        +          a: {
        +            'package.json': JSON.stringify({
        +              name: 'a',
        +              version: '1.0.0',
        +            }),
        +          },
        +          b: {
        +            'package.json': JSON.stringify({
        +              name: 'b',
        +              version: '1.0.0',
        +            }),
        +          },
        +          'test-pkg-link': t.fixture('symlink', '../../../test-pkg-link'),
        +        },
        +      },
        +    },
        +    'test-pkg-link': {
        +      'package.json': JSON.stringify({
        +        name: 'test-pkg-link',
        +        version: '1.0.0',
        +      }),
        +    },
        +    'link-me-too': {
        +      'package.json': JSON.stringify({
        +        name: 'link-me-too',
        +        version: '1.0.0',
        +      }),
        +    },
        +    'scoped-linked': {
        +      'package.json': JSON.stringify({
        +        name: '@myscope/linked',
        +        version: '1.0.0',
        +      }),
        +    },
        +    'my-project': {
        +      'package.json': JSON.stringify({
        +        name: 'my-project',
        +        version: '1.0.0',
        +        workspaces: ['packages/*'],
        +      }),
        +      packages: {
        +        x: {
        +          'package.json': JSON.stringify({
        +            name: 'x',
        +            version: '1.0.0',
        +            dependencies: {
        +              foo: '^1.0.0',
        +            },
        +          }),
        +        },
        +      },
        +      node_modules: {
        +        foo: {
        +          'package.json': JSON.stringify({
        +            name: 'foo',
        +            version: '1.0.0',
        +          }),
        +        },
        +      },
        +    },
        +  })
        +  npm.globalDir = resolve(testdir, 'global-prefix', 'lib', 'node_modules')
        +  npm.prefix = resolve(testdir, 'my-project')
        +  npm.localPrefix = resolve(testdir, 'my-project')
        +
        +  const _cwd = process.cwd()
        +  process.chdir(npm.prefix)
        +
        +  reifyOutput = async () => {
        +    reifyOutput = undefined
        +    process.chdir(_cwd)
        +
        +    const links = await printLinks({
        +      path: npm.prefix,
        +    })
        +
        +    t.matchSnapshot(links, 'should create a local symlink to global pkg')
        +  }
        +
        +  // installs examples for:
        +  // - test-pkg-link: pkg linked to globalDir from local fs
        +  // - @myscope/linked: scoped pkg linked to globalDir from local fs
        +  // - @myscope/bar: prev installed scoped package available in globalDir
        +  // - a: prev installed package available in globalDir
        +  // - file:./link-me-too: pkg that needs to be reified in globalDir first
        +  link.execWorkspaces([
        +    'test-pkg-link',
        +    '@myscope/linked',
        +    '@myscope/bar',
        +    'a',
        +    'file:../link-me-too',
        +  ], ['x'], (err) => {
        +    t.error(err, 'should not error out')
        +  })
        +})
        +
         t.test('link pkg already in global space', (t) => {
           t.plan(3)
         
        diff --git a/deps/npm/test/lib/ls.js b/deps/npm/test/lib/ls.js
        index 2cde319463a9ea..ecdede809df207 100644
        --- a/deps/npm/test/lib/ls.js
        +++ b/deps/npm/test/lib/ls.js
        @@ -90,7 +90,12 @@ const diffDepTypesNmFixture = {
         }
         
         let result = ''
        -const LS = require('../../lib/ls.js')
        +const LS = t.mock('../../lib/ls.js', {
        +  path: {
        +    ...require('path'),
        +    sep: '/',
        +  },
        +})
         const config = {
           all: true,
           color: false,
        diff --git a/deps/npm/test/lib/owner.js b/deps/npm/test/lib/owner.js
        index 4af8d1ebbb8fa0..10ceb03030a5ac 100644
        --- a/deps/npm/test/lib/owner.js
        +++ b/deps/npm/test/lib/owner.js
        @@ -1,16 +1,18 @@
         const t = require('tap')
        +const mockNpm = require('../fixtures/mock-npm.js')
         
         let result = ''
        -let readLocalPkgResponse = null
        +let readPackageNamePrefix = null
        +let readPackageNameResponse = null
         
         const noop = () => null
         
        -const npm = {
        -  flatOptions: {},
        +const npm = mockNpm({
           output: (msg) => {
             result = result ? `${result}\n${msg}` : msg
           },
        -}
        +})
        +
         const npmFetch = { json: noop }
         const npmlog = { error: noop, info: noop, verbose: noop }
         const pacote = { packument: noop }
        @@ -20,7 +22,10 @@ const mocks = {
           'npm-registry-fetch': npmFetch,
           pacote,
           '../../lib/utils/otplease.js': async (opts, fn) => fn({ otp: '123456', opts }),
        -  '../../lib/utils/read-local-package.js': async () => readLocalPkgResponse,
        +  '../../lib/utils/read-package-name.js': async (prefix) => {
        +    readPackageNamePrefix = prefix
        +    return readPackageNameResponse
        +  },
           '../../lib/utils/usage.js': () => 'usage instructions',
         }
         
        @@ -47,11 +52,11 @@ t.test('owner no args', t => {
         })
         
         t.test('owner ls no args', t => {
        -  t.plan(4)
        +  t.plan(5)
         
           result = ''
         
        -  readLocalPkgResponse = '@npmcli/map-workspaces'
        +  readPackageNameResponse = '@npmcli/map-workspaces'
           pacote.packument = async (spec, opts) => {
             t.equal(spec.name, '@npmcli/map-workspaces', 'should use expect pkg name')
             t.match(
        @@ -65,14 +70,29 @@ t.test('owner ls no args', t => {
             return { maintainers: npmcliMaintainers }
           }
           t.teardown(() => {
        +    npm.prefix = null
             result = ''
             pacote.packument = noop
        -    readLocalPkgResponse = null
        +    readPackageNameResponse = null
           })
        +  npm.prefix = 'test-npm-prefix'
         
           owner.exec(['ls'], err => {
             t.error(err, 'npm owner ls no args')
             t.matchSnapshot(result, 'should output owners of cwd package')
        +    t.equal(readPackageNamePrefix, 'test-npm-prefix', 'read-package-name gets npm.prefix')
        +  })
        +})
        +
        +t.test('owner ls global', t => {
        +  t.teardown(() => {
        +    npm.config.set('global', false)
        +  })
        +  npm.config.set('global', true)
        +
        +  owner.exec(['ls'], err => {
        +    t.match(err, /usage instructions/, 'should throw usage instructions if no cwd package available')
        +    t.end()
           })
         })
         
        @@ -93,7 +113,7 @@ t.test('owner ls fails to retrieve packument', t => {
           t.plan(4)
         
           result = ''
        -  readLocalPkgResponse = '@npmcli/map-workspaces'
        +  readPackageNameResponse = '@npmcli/map-workspaces'
           pacote.packument = () => {
             throw new Error('ERR')
           }
        @@ -233,7 +253,7 @@ t.test('owner add  ', t => {
         
         t.test('owner add  cwd package', t => {
           result = ''
        -  readLocalPkgResponse = '@npmcli/map-workspaces'
        +  readPackageNameResponse = '@npmcli/map-workspaces'
           npmFetch.json = async (uri, opts) => {
             // retrieve user info from couchdb request
             if (uri === '/-/user/org.couchdb.user:foo') {
        @@ -253,7 +273,7 @@ t.test('owner add  cwd package', t => {
           })
           t.teardown(() => {
             result = ''
        -    readLocalPkgResponse = null
        +    readPackageNameResponse = null
             npmFetch.json = noop
             pacote.packument = noop
           })
        @@ -308,7 +328,7 @@ t.test('owner add   already an owner', t => {
         
         t.test('owner add   fails to retrieve user', t => {
           result = ''
        -  readLocalPkgResponse =
        +  readPackageNameResponse =
           npmFetch.json = async (uri, opts) => {
             // retrieve borked user info from couchdb request
             if (uri === '/-/user/org.couchdb.user:foo')
        @@ -324,7 +344,7 @@ t.test('owner add   fails to retrieve user', t => {
           })
           t.teardown(() => {
             result = ''
        -    readLocalPkgResponse = null
        +    readPackageNameResponse = null
             npmFetch.json = noop
             pacote.packument = noop
           })
        @@ -465,6 +485,18 @@ t.test('owner add no user', t => {
           })
         })
         
        +t.test('owner add no pkg global', t => {
        +  t.teardown(() => {
        +    npm.config.set('global', false)
        +  })
        +  npm.config.set('global', true)
        +
        +  owner.exec(['add', 'gar'], err => {
        +    t.match(err, /usage instructions/, 'should throw usage instructions if user provided')
        +    t.end()
        +  })
        +})
        +
         t.test('owner add  no cwd package', t => {
           result = ''
           t.teardown(() => {
        @@ -581,7 +613,7 @@ t.test('owner rm   not a current owner', t => {
         
         t.test('owner rm  cwd package', t => {
           result = ''
        -  readLocalPkgResponse = '@npmcli/map-workspaces'
        +  readPackageNameResponse = '@npmcli/map-workspaces'
           npmFetch.json = async (uri, opts) => {
             // retrieve user info from couchdb request
             if (uri === '/-/user/org.couchdb.user:ruyadorno') {
        @@ -601,7 +633,7 @@ t.test('owner rm  cwd package', t => {
           })
           t.teardown(() => {
             result = ''
        -    readLocalPkgResponse = null
        +    readPackageNameResponse = null
             npmFetch.json = noop
             pacote.packument = noop
           })
        @@ -615,7 +647,7 @@ t.test('owner rm  cwd package', t => {
         
         t.test('owner rm  only user', t => {
           result = ''
        -  readLocalPkgResponse = 'ipt'
        +  readPackageNameResponse = 'ipt'
           npmFetch.json = async (uri, opts) => {
             // retrieve user info from couchdb request
             if (uri === '/-/user/org.couchdb.user:ruyadorno') {
        @@ -636,7 +668,7 @@ t.test('owner rm  only user', t => {
           })
           t.teardown(() => {
             result = ''
        -    readLocalPkgResponse = null
        +    readPackageNameResponse = null
             npmFetch.json = noop
             pacote.packument = noop
           })
        @@ -664,6 +696,18 @@ t.test('owner rm no user', t => {
           })
         })
         
        +t.test('owner rm no pkg global', t => {
        +  t.teardown(() => {
        +    npm.config.set('global', false)
        +  })
        +  npm.config.set('global', true)
        +
        +  owner.exec(['rm', 'gar'], err => {
        +    t.match(err, /usage instructions/, 'should throw usage instructions if user provided')
        +    t.end()
        +  })
        +})
        +
         t.test('owner rm  no cwd package', t => {
           result = ''
           t.teardown(() => {
        @@ -693,15 +737,15 @@ t.test('completion', async t => {
           // npm owner rm completion is async
           t.test('completion npm owner rm', async t => {
             t.plan(2)
        -    readLocalPkgResponse = '@npmcli/map-workspaces'
        +    readPackageNameResponse = '@npmcli/map-workspaces'
             pacote.packument = async spec => {
        -      t.equal(spec.name, readLocalPkgResponse, 'should use package spec')
        +      t.equal(spec.name, readPackageNameResponse, 'should use package spec')
               return {
                 maintainers: npmcliMaintainers,
               }
             }
             t.teardown(() => {
        -      readLocalPkgResponse = null
        +      readPackageNameResponse = null
               pacote.packument = noop
             })
         
        @@ -718,17 +762,27 @@ t.test('completion', async t => {
             t.end()
           })
         
        +  t.test('completion npm owner rm global', async t => {
        +    t.teardown(() => {
        +      npm.config.set('global', false)
        +    })
        +    npm.config.set('global', true)
        +    const res = await owner.completion({ conf: { argv: { remain: ['npm', 'owner', 'rm'] } } })
        +    t.strictSame(res, [], 'should have no owners to autocomplete if global')
        +    t.end()
        +  })
        +
           t.test('completion npm owner rm no owners found', async t => {
             t.plan(2)
        -    readLocalPkgResponse = '@npmcli/map-workspaces'
        +    readPackageNameResponse = '@npmcli/map-workspaces'
             pacote.packument = async spec => {
        -      t.equal(spec.name, readLocalPkgResponse, 'should use package spec')
        +      t.equal(spec.name, readPackageNameResponse, 'should use package spec')
               return {
                 maintainers: [],
               }
             }
             t.teardown(() => {
        -      readLocalPkgResponse = null
        +      readPackageNameResponse = null
               pacote.packument = noop
             })
         
        diff --git a/deps/npm/test/lib/publish.js b/deps/npm/test/lib/publish.js
        index 80f3f7ccc639e3..e34f00b477ee13 100644
        --- a/deps/npm/test/lib/publish.js
        +++ b/deps/npm/test/lib/publish.js
        @@ -617,3 +617,148 @@ t.test('workspaces', (t) => {
           })
           t.end()
         })
        +
        +t.test('private workspaces', (t) => {
        +  const testDir = t.testdir({
        +    'package.json': JSON.stringify({
        +      name: 'workspaces-project',
        +      version: '1.0.0',
        +      workspaces: ['packages/*'],
        +    }),
        +    packages: {
        +      a: {
        +        'package.json': JSON.stringify({
        +          name: '@npmcli/a',
        +          version: '1.0.0',
        +          private: true,
        +        }),
        +      },
        +      b: {
        +        'package.json': JSON.stringify({
        +          name: '@npmcli/b',
        +          version: '1.0.0',
        +        }),
        +      },
        +    },
        +  })
        +
        +  const publishes = []
        +  const outputs = []
        +  t.beforeEach(() => {
        +    npm.config.set('json', false)
        +    outputs.length = 0
        +    publishes.length = 0
        +  })
        +  const mocks = {
        +    '../../lib/utils/tar.js': {
        +      getContents: (manifest) => ({
        +        id: manifest._id,
        +      }),
        +      logTar: () => {},
        +    },
        +    libnpmpublish: {
        +      publish: (manifest, tarballData, opts) => {
        +        if (manifest.private) {
        +          throw Object.assign(
        +            new Error('private pkg'),
        +            { code: 'EPRIVATE' }
        +          )
        +        }
        +        publishes.push(manifest)
        +      },
        +    },
        +  }
        +  const npm = mockNpm({
        +    output: (o) => {
        +      outputs.push(o)
        +    },
        +  })
        +  npm.localPrefix = testDir
        +  npm.config.getCredentialsByURI = (uri) => {
        +    return { token: 'some.registry.token' }
        +  }
        +
        +  t.test('with color', t => {
        +    const Publish = t.mock('../../lib/publish.js', {
        +      ...mocks,
        +      npmlog: {
        +        notice () {},
        +        verbose () {},
        +        warn (title, msg) {
        +          t.equal(title, 'publish', 'should use publish warn title')
        +          t.match(
        +            msg,
        +            'Skipping workspace \u001b[32m@npmcli/a\u001b[39m, marked as \u001b[1mprivate\u001b[22m',
        +            'should display skip private workspace warn msg'
        +          )
        +        },
        +      },
        +    })
        +    const publish = new Publish(npm)
        +
        +    npm.color = true
        +    publish.execWorkspaces([], [], (err) => {
        +      t.notOk(err)
        +      t.matchSnapshot(publishes, 'should publish all non-private workspaces')
        +      t.matchSnapshot(outputs, 'should output all publishes')
        +      npm.color = false
        +      t.end()
        +    })
        +  })
        +
        +  t.test('colorless', t => {
        +    const Publish = t.mock('../../lib/publish.js', {
        +      ...mocks,
        +      npmlog: {
        +        notice () {},
        +        verbose () {},
        +        warn (title, msg) {
        +          t.equal(title, 'publish', 'should use publish warn title')
        +          t.equal(
        +            msg,
        +            'Skipping workspace @npmcli/a, marked as private',
        +            'should display skip private workspace warn msg'
        +          )
        +        },
        +      },
        +    })
        +    const publish = new Publish(npm)
        +
        +    publish.execWorkspaces([], [], (err) => {
        +      t.notOk(err)
        +      t.matchSnapshot(publishes, 'should publish all non-private workspaces')
        +      t.matchSnapshot(outputs, 'should output all publishes')
        +      t.end()
        +    })
        +  })
        +
        +  t.test('unexpected error', t => {
        +    const Publish = t.mock('../../lib/publish.js', {
        +      ...mocks,
        +      libnpmpublish: {
        +        publish: (manifest, tarballData, opts) => {
        +          if (manifest.private)
        +            throw new Error('ERR')
        +
        +          publishes.push(manifest)
        +        },
        +      },
        +      npmlog: {
        +        notice () {},
        +        verbose () {},
        +      },
        +    })
        +    const publish = new Publish(npm)
        +
        +    publish.execWorkspaces([], [], (err) => {
        +      t.match(
        +        err,
        +        /ERR/,
        +        'should throw unexpected error'
        +      )
        +      t.end()
        +    })
        +  })
        +
        +  t.end()
        +})
        diff --git a/deps/npm/test/lib/utils/read-local-package.js b/deps/npm/test/lib/utils/read-package-name.js
        similarity index 55%
        rename from deps/npm/test/lib/utils/read-local-package.js
        rename to deps/npm/test/lib/utils/read-package-name.js
        index 966e74a7ab7f4c..c8f88bacd4b840 100644
        --- a/deps/npm/test/lib/utils/read-local-package.js
        +++ b/deps/npm/test/lib/utils/read-package-name.js
        @@ -1,13 +1,8 @@
         const t = require('tap')
         const mockNpm = require('../../fixtures/mock-npm')
        +const npm = mockNpm()
         
        -const config = {
        -  json: false,
        -  global: false,
        -}
        -const npm = mockNpm({ config })
        -
        -const readLocalPackageName = require('../../../lib/utils/read-local-package.js')
        +const readPackageName = require('../../../lib/utils/read-package-name.js')
         
         t.test('read local package.json', async (t) => {
           npm.prefix = t.testdir({
        @@ -16,7 +11,7 @@ t.test('read local package.json', async (t) => {
               version: '1.0.0',
             }),
           })
        -  const packageName = await readLocalPackageName(npm)
        +  const packageName = await readPackageName(npm.prefix)
           t.equal(
             packageName,
             'my-local-package',
        @@ -31,22 +26,10 @@ t.test('read local scoped-package.json', async (t) => {
               version: '1.0.0',
             }),
           })
        -  const packageName = await readLocalPackageName(npm)
        +  const packageName = await readPackageName(npm.prefix)
           t.equal(
             packageName,
             '@my-scope/my-local-package',
             'should retrieve scoped package name'
           )
         })
        -
        -t.test('read using --global', async (t) => {
        -  npm.prefix = t.testdir({})
        -  config.global = true
        -  const packageName = await readLocalPackageName(npm)
        -  t.equal(
        -    packageName,
        -    undefined,
        -    'should not retrieve a package name'
        -  )
        -  config.global = false
        -})
        diff --git a/deps/npm/test/lib/utils/reify-output.js b/deps/npm/test/lib/utils/reify-output.js
        index 2142566b90dea6..3ffbdf86a29896 100644
        --- a/deps/npm/test/lib/utils/reify-output.js
        +++ b/deps/npm/test/lib/utils/reify-output.js
        @@ -187,31 +187,154 @@ t.test('print appropriate message for many packages', (t) => {
           })
         })
         
        -t.test('no output when silent', t => {
        -  npm.output = out => {
        -    t.fail('should not get output when silent', { actual: out })
        -  }
        -  t.teardown(() => log.level = 'warn')
        -  log.level = 'silent'
        -  reifyOutput(npm, {
        -    actualTree: { inventory: { size: 999 }, children: [] },
        -    auditReport: {
        -      toJSON: () => {
        -        throw new Error('this should not get called')
        -      },
        -      vulnerabilities: {},
        -      metadata: {
        -        vulnerabilities: {
        -          total: 99,
        -        },
        +t.test('showing and not showing audit report', async t => {
        +  const auditReport = {
        +    toJSON: () => auditReport,
        +    auditReportVersion: 2,
        +    vulnerabilities: {
        +      minimist: {
        +        name: 'minimist',
        +        severity: 'low',
        +        via: [
        +          {
        +            id: 1179,
        +            url: 'https://npmjs.com/advisories/1179',
        +            title: 'Prototype Pollution',
        +            severity: 'low',
        +            vulnerable_versions: '<0.2.1 || >=1.0.0 <1.2.3',
        +          },
        +        ],
        +        effects: [],
        +        range: '<0.2.1 || >=1.0.0 <1.2.3',
        +        nodes: [
        +          'node_modules/minimist',
        +        ],
        +        fixAvailable: true,
               },
             },
        -    diff: {
        -      children: [
        -        { action: 'ADD', ideal: { location: 'loc' } },
        -      ],
        +    metadata: {
        +      vulnerabilities: {
        +        info: 0,
        +        low: 1,
        +        moderate: 0,
        +        high: 0,
        +        critical: 0,
        +        total: 1,
        +      },
        +      dependencies: {
        +        prod: 1,
        +        dev: 0,
        +        optional: 0,
        +        peer: 0,
        +        peerOptional: 0,
        +        total: 1,
        +      },
             },
        +  }
        +
        +  t.test('no output when silent', t => {
        +    npm.output = out => {
        +      t.fail('should not get output when silent', { actual: out })
        +    }
        +    t.teardown(() => log.level = 'warn')
        +    log.level = 'silent'
        +    reifyOutput(npm, {
        +      actualTree: { inventory: { size: 999 }, children: [] },
        +      auditReport,
        +      diff: {
        +        children: [
        +          { action: 'ADD', ideal: { location: 'loc' } },
        +        ],
        +      },
        +    })
        +    t.end()
           })
        +
        +  t.test('output when not silent', t => {
        +    const OUT = []
        +    npm.output = out => {
        +      OUT.push(out)
        +    }
        +    reifyOutput(npm, {
        +      actualTree: { inventory: new Map(), children: [] },
        +      auditReport,
        +      diff: {
        +        children: [
        +          { action: 'ADD', ideal: { location: 'loc' } },
        +        ],
        +      },
        +    })
        +    t.match(OUT.join('\n'), /Run `npm audit` for details\.$/, 'got audit report')
        +    t.end()
        +  })
        +
        +  for (const json of [true, false]) {
        +    t.test(`json=${json}`, t => {
        +      t.teardown(() => {
        +        delete npm.flatOptions.json
        +      })
        +      npm.flatOptions.json = json
        +      t.test('set exit code when cmd is audit', t => {
        +        npm.output = () => {}
        +        const { exitCode } = process
        +        const { command } = npm
        +        npm.flatOptions.auditLevel = 'low'
        +        t.teardown(() => {
        +          delete npm.flatOptions.auditLevel
        +          npm.command = command
        +          // only set exitCode back if we're passing tests
        +          if (t.passing())
        +            process.exitCode = exitCode
        +        })
        +
        +        process.exitCode = 0
        +        npm.command = 'audit'
        +        reifyOutput(npm, {
        +          actualTree: { inventory: new Map(), children: [] },
        +          auditReport,
        +          diff: {
        +            children: [
        +              { action: 'ADD', ideal: { location: 'loc' } },
        +            ],
        +          },
        +        })
        +
        +        t.equal(process.exitCode, 1, 'set exit code')
        +        t.end()
        +      })
        +
        +      t.test('do not set exit code when cmd is install', t => {
        +        npm.output = () => {}
        +        const { exitCode } = process
        +        const { command } = npm
        +        npm.flatOptions.auditLevel = 'low'
        +        t.teardown(() => {
        +          delete npm.flatOptions.auditLevel
        +          npm.command = command
        +          // only set exitCode back if we're passing tests
        +          if (t.passing())
        +            process.exitCode = exitCode
        +        })
        +
        +        process.exitCode = 0
        +        npm.command = 'install'
        +        reifyOutput(npm, {
        +          actualTree: { inventory: new Map(), children: [] },
        +          auditReport,
        +          diff: {
        +            children: [
        +              { action: 'ADD', ideal: { location: 'loc' } },
        +            ],
        +          },
        +        })
        +
        +        t.equal(process.exitCode, 0, 'did not set exit code')
        +        t.end()
        +      })
        +      t.end()
        +    })
        +  }
        +
           t.end()
         })
         
        diff --git a/deps/npm/test/lib/utils/update-notifier.js b/deps/npm/test/lib/utils/update-notifier.js
        index ad4d407728f93f..dc0a64ff46127b 100644
        --- a/deps/npm/test/lib/utils/update-notifier.js
        +++ b/deps/npm/test/lib/utils/update-notifier.js
        @@ -86,9 +86,14 @@ t.afterEach(() => {
           WRITE_ERROR = null
         })
         
        +const runUpdateNotifier = async npm => {
        +  await updateNotifier(npm)
        +  return npm.updateNotification
        +}
        +
         t.test('situations in which we do not notify', t => {
           t.test('nothing to do if notifier disabled', async t => {
        -    t.equal(await updateNotifier({
        +    t.equal(await runUpdateNotifier({
               ...npm,
               config: { get: (k) => k !== 'update-notifier' },
             }), null)
        @@ -96,7 +101,7 @@ t.test('situations in which we do not notify', t => {
           })
         
           t.test('do not suggest update if already updating', async t => {
        -    t.equal(await updateNotifier({
        +    t.equal(await runUpdateNotifier({
               ...npm,
               flatOptions: { ...flatOptions, global: true },
               command: 'install',
        @@ -105,32 +110,42 @@ t.test('situations in which we do not notify', t => {
             t.strictSame(MANIFEST_REQUEST, [], 'no requests for manifests')
           })
         
        +  t.test('do not suggest update if already updating with spec', async t => {
        +    t.equal(await runUpdateNotifier({
        +      ...npm,
        +      flatOptions: { ...flatOptions, global: true },
        +      command: 'install',
        +      argv: ['npm@latest'],
        +    }), null)
        +    t.strictSame(MANIFEST_REQUEST, [], 'no requests for manifests')
        +  })
        +
           t.test('do not update if same as latest', async t => {
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, ['npm@latest'], 'requested latest version')
           })
           t.test('check if stat errors (here for coverage)', async t => {
             STAT_ERROR = new Error('blorg')
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, ['npm@latest'], 'requested latest version')
           })
           t.test('ok if write errors (here for coverage)', async t => {
             WRITE_ERROR = new Error('grolb')
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, ['npm@latest'], 'requested latest version')
           })
           t.test('ignore pacote failures (here for coverage)', async t => {
             PACOTE_ERROR = new Error('pah-KO-tchay')
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, ['npm@latest'], 'requested latest version')
           })
           t.test('do not update if newer than latest, but same as next', async t => {
        -    t.equal(await updateNotifier({ ...npm, version: NEXT_VERSION }), null)
        +    t.equal(await runUpdateNotifier({ ...npm, version: NEXT_VERSION }), null)
             const reqs = ['npm@latest', `npm@^${NEXT_VERSION}`]
             t.strictSame(MANIFEST_REQUEST, reqs, 'requested latest and next versions')
           })
           t.test('do not update if on the latest beta', async t => {
        -    t.equal(await updateNotifier({ ...npm, version: CURRENT_BETA }), null)
        +    t.equal(await runUpdateNotifier({ ...npm, version: CURRENT_BETA }), null)
             const reqs = [`npm@^${CURRENT_BETA}`]
             t.strictSame(MANIFEST_REQUEST, reqs, 'requested latest and next versions')
           })
        @@ -140,21 +155,21 @@ t.test('situations in which we do not notify', t => {
               ciMock = null
             })
             ciMock = 'something'
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, [], 'no requests for manifests')
           })
         
           t.test('only check weekly for GA releases', async t => {
             // One week (plus five minutes to account for test environment fuzziness)
             STAT_MTIME = Date.now() - (1000 * 60 * 60 * 24 * 7) + (1000 * 60 * 5)
        -    t.equal(await updateNotifier(npm), null)
        +    t.equal(await runUpdateNotifier(npm), null)
             t.strictSame(MANIFEST_REQUEST, [], 'no requests for manifests')
           })
         
           t.test('only check daily for betas', async t => {
             // One day (plus five minutes to account for test environment fuzziness)
             STAT_MTIME = Date.now() - (1000 * 60 * 60 * 24) + (1000 * 60 * 5)
        -    t.equal(await updateNotifier({ ...npm, version: HAVE_BETA }), null)
        +    t.equal(await runUpdateNotifier({ ...npm, version: HAVE_BETA }), null)
             t.strictSame(MANIFEST_REQUEST, [], 'no requests for manifests')
           })
         
        @@ -164,43 +179,43 @@ t.test('situations in which we do not notify', t => {
         t.test('notification situations', t => {
           t.test('new beta available', async t => {
             const version = HAVE_BETA
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, [`npm@^${version}`, `npm@^${version}`])
           })
         
           t.test('patch to next version', async t => {
             const version = NEXT_PATCH
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, ['npm@latest', `npm@^${version}`, 'npm@latest', `npm@^${version}`])
           })
         
           t.test('minor to next version', async t => {
             const version = NEXT_MINOR
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, ['npm@latest', `npm@^${version}`, 'npm@latest', `npm@^${version}`])
           })
         
           t.test('patch to current', async t => {
             const version = CURRENT_PATCH
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, ['npm@latest', 'npm@latest'])
           })
         
           t.test('minor to current', async t => {
             const version = CURRENT_MINOR
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, ['npm@latest', 'npm@latest'])
           })
         
           t.test('major to current', async t => {
             const version = CURRENT_MAJOR
        -    t.matchSnapshot(await updateNotifier({ ...npm, version }), 'color')
        -    t.matchSnapshot(await updateNotifier({ ...npmNoColor, version }), 'no color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npm, version }), 'color')
        +    t.matchSnapshot(await runUpdateNotifier({ ...npmNoColor, version }), 'no color')
             t.strictSame(MANIFEST_REQUEST, ['npm@latest', 'npm@latest'])
           })