From e830b172ee4e4b168123d74200a6f99447a79f35 Mon Sep 17 00:00:00 2001 From: npm CLI robot Date: Wed, 21 Jan 2026 23:33:00 +0000 Subject: [PATCH] deps: upgrade npm to 11.8.0 --- deps/npm/docs/content/commands/npm-dedupe.md | 2 +- deps/npm/docs/content/commands/npm-install.md | 12 + deps/npm/docs/content/commands/npm-ls.md | 2 +- deps/npm/docs/content/commands/npm.md | 2 +- deps/npm/docs/output/commands/npm-access.html | 4 +- .../npm/docs/output/commands/npm-adduser.html | 4 +- deps/npm/docs/output/commands/npm-audit.html | 4 +- deps/npm/docs/output/commands/npm-bugs.html | 4 +- deps/npm/docs/output/commands/npm-cache.html | 4 +- deps/npm/docs/output/commands/npm-ci.html | 4 +- .../docs/output/commands/npm-completion.html | 4 +- deps/npm/docs/output/commands/npm-config.html | 4 +- deps/npm/docs/output/commands/npm-dedupe.html | 6 +- .../docs/output/commands/npm-deprecate.html | 4 +- deps/npm/docs/output/commands/npm-diff.html | 4 +- .../docs/output/commands/npm-dist-tag.html | 4 +- deps/npm/docs/output/commands/npm-docs.html | 4 +- deps/npm/docs/output/commands/npm-doctor.html | 4 +- deps/npm/docs/output/commands/npm-edit.html | 4 +- deps/npm/docs/output/commands/npm-exec.html | 4 +- .../npm/docs/output/commands/npm-explain.html | 4 +- .../npm/docs/output/commands/npm-explore.html | 4 +- .../docs/output/commands/npm-find-dupes.html | 4 +- deps/npm/docs/output/commands/npm-fund.html | 4 +- .../docs/output/commands/npm-help-search.html | 4 +- deps/npm/docs/output/commands/npm-help.html | 4 +- deps/npm/docs/output/commands/npm-init.html | 4 +- .../output/commands/npm-install-ci-test.html | 4 +- .../output/commands/npm-install-test.html | 4 +- .../npm/docs/output/commands/npm-install.html | 18 +- deps/npm/docs/output/commands/npm-link.html | 4 +- deps/npm/docs/output/commands/npm-login.html | 4 +- deps/npm/docs/output/commands/npm-logout.html | 4 +- deps/npm/docs/output/commands/npm-ls.html | 6 +- deps/npm/docs/output/commands/npm-org.html | 4 +- .../docs/output/commands/npm-outdated.html | 4 +- deps/npm/docs/output/commands/npm-owner.html | 4 +- deps/npm/docs/output/commands/npm-pack.html | 4 +- deps/npm/docs/output/commands/npm-ping.html | 4 +- deps/npm/docs/output/commands/npm-pkg.html | 4 +- deps/npm/docs/output/commands/npm-prefix.html | 4 +- .../npm/docs/output/commands/npm-profile.html | 4 +- deps/npm/docs/output/commands/npm-prune.html | 4 +- .../npm/docs/output/commands/npm-publish.html | 4 +- deps/npm/docs/output/commands/npm-query.html | 4 +- .../npm/docs/output/commands/npm-rebuild.html | 4 +- deps/npm/docs/output/commands/npm-repo.html | 4 +- .../npm/docs/output/commands/npm-restart.html | 4 +- deps/npm/docs/output/commands/npm-root.html | 4 +- deps/npm/docs/output/commands/npm-run.html | 4 +- deps/npm/docs/output/commands/npm-sbom.html | 4 +- deps/npm/docs/output/commands/npm-search.html | 4 +- .../docs/output/commands/npm-shrinkwrap.html | 4 +- deps/npm/docs/output/commands/npm-star.html | 4 +- deps/npm/docs/output/commands/npm-stars.html | 4 +- deps/npm/docs/output/commands/npm-start.html | 4 +- deps/npm/docs/output/commands/npm-stop.html | 4 +- deps/npm/docs/output/commands/npm-team.html | 4 +- deps/npm/docs/output/commands/npm-test.html | 4 +- deps/npm/docs/output/commands/npm-token.html | 4 +- .../docs/output/commands/npm-undeprecate.html | 4 +- .../docs/output/commands/npm-uninstall.html | 4 +- .../docs/output/commands/npm-unpublish.html | 4 +- deps/npm/docs/output/commands/npm-unstar.html | 4 +- deps/npm/docs/output/commands/npm-update.html | 4 +- .../npm/docs/output/commands/npm-version.html | 4 +- deps/npm/docs/output/commands/npm-view.html | 4 +- deps/npm/docs/output/commands/npm-whoami.html | 4 +- deps/npm/docs/output/commands/npm.html | 6 +- deps/npm/docs/output/commands/npx.html | 4 +- .../docs/output/configuring-npm/folders.html | 4 +- .../docs/output/configuring-npm/install.html | 4 +- .../output/configuring-npm/npm-global.html | 4 +- .../docs/output/configuring-npm/npm-json.html | 4 +- .../configuring-npm/npm-shrinkwrap-json.html | 4 +- .../docs/output/configuring-npm/npmrc.html | 4 +- .../output/configuring-npm/package-json.html | 4 +- .../configuring-npm/package-lock-json.html | 4 +- deps/npm/docs/output/using-npm/config.html | 4 +- .../using-npm/dependency-selectors.html | 4 +- .../npm/docs/output/using-npm/developers.html | 4 +- deps/npm/docs/output/using-npm/logging.html | 4 +- deps/npm/docs/output/using-npm/orgs.html | 4 +- .../docs/output/using-npm/package-spec.html | 4 +- deps/npm/docs/output/using-npm/registry.html | 4 +- deps/npm/docs/output/using-npm/removal.html | 4 +- deps/npm/docs/output/using-npm/scope.html | 4 +- deps/npm/docs/output/using-npm/scripts.html | 4 +- .../npm/docs/output/using-npm/workspaces.html | 4 +- deps/npm/lib/commands/config.js | 19 +- deps/npm/lib/commands/sbom.js | 4 +- deps/npm/lib/utils/format-bytes.js | 4 +- deps/npm/man/man1/npm-access.1 | 2 +- deps/npm/man/man1/npm-adduser.1 | 2 +- deps/npm/man/man1/npm-audit.1 | 2 +- deps/npm/man/man1/npm-bugs.1 | 2 +- deps/npm/man/man1/npm-cache.1 | 2 +- deps/npm/man/man1/npm-ci.1 | 2 +- deps/npm/man/man1/npm-completion.1 | 2 +- deps/npm/man/man1/npm-config.1 | 2 +- deps/npm/man/man1/npm-dedupe.1 | 4 +- deps/npm/man/man1/npm-deprecate.1 | 2 +- deps/npm/man/man1/npm-diff.1 | 2 +- deps/npm/man/man1/npm-dist-tag.1 | 2 +- deps/npm/man/man1/npm-docs.1 | 2 +- deps/npm/man/man1/npm-doctor.1 | 2 +- deps/npm/man/man1/npm-edit.1 | 2 +- deps/npm/man/man1/npm-exec.1 | 2 +- deps/npm/man/man1/npm-explain.1 | 2 +- deps/npm/man/man1/npm-explore.1 | 2 +- deps/npm/man/man1/npm-find-dupes.1 | 2 +- deps/npm/man/man1/npm-fund.1 | 2 +- deps/npm/man/man1/npm-help-search.1 | 2 +- deps/npm/man/man1/npm-help.1 | 2 +- deps/npm/man/man1/npm-init.1 | 2 +- deps/npm/man/man1/npm-install-ci-test.1 | 2 +- deps/npm/man/man1/npm-install-test.1 | 2 +- deps/npm/man/man1/npm-install.1 | 16 +- deps/npm/man/man1/npm-link.1 | 2 +- deps/npm/man/man1/npm-login.1 | 2 +- deps/npm/man/man1/npm-logout.1 | 2 +- deps/npm/man/man1/npm-ls.1 | 4 +- deps/npm/man/man1/npm-org.1 | 2 +- deps/npm/man/man1/npm-outdated.1 | 2 +- deps/npm/man/man1/npm-owner.1 | 2 +- deps/npm/man/man1/npm-pack.1 | 2 +- deps/npm/man/man1/npm-ping.1 | 2 +- deps/npm/man/man1/npm-pkg.1 | 2 +- deps/npm/man/man1/npm-prefix.1 | 2 +- deps/npm/man/man1/npm-profile.1 | 2 +- deps/npm/man/man1/npm-prune.1 | 2 +- deps/npm/man/man1/npm-publish.1 | 2 +- deps/npm/man/man1/npm-query.1 | 2 +- deps/npm/man/man1/npm-rebuild.1 | 2 +- deps/npm/man/man1/npm-repo.1 | 2 +- deps/npm/man/man1/npm-restart.1 | 2 +- deps/npm/man/man1/npm-root.1 | 2 +- deps/npm/man/man1/npm-run.1 | 2 +- deps/npm/man/man1/npm-sbom.1 | 2 +- deps/npm/man/man1/npm-search.1 | 2 +- deps/npm/man/man1/npm-shrinkwrap.1 | 2 +- deps/npm/man/man1/npm-star.1 | 2 +- deps/npm/man/man1/npm-stars.1 | 2 +- deps/npm/man/man1/npm-start.1 | 2 +- deps/npm/man/man1/npm-stop.1 | 2 +- deps/npm/man/man1/npm-team.1 | 2 +- deps/npm/man/man1/npm-test.1 | 2 +- deps/npm/man/man1/npm-token.1 | 2 +- deps/npm/man/man1/npm-undeprecate.1 | 2 +- deps/npm/man/man1/npm-uninstall.1 | 2 +- deps/npm/man/man1/npm-unpublish.1 | 2 +- deps/npm/man/man1/npm-unstar.1 | 2 +- deps/npm/man/man1/npm-update.1 | 2 +- deps/npm/man/man1/npm-version.1 | 2 +- deps/npm/man/man1/npm-view.1 | 2 +- deps/npm/man/man1/npm-whoami.1 | 2 +- deps/npm/man/man1/npm.1 | 4 +- deps/npm/man/man1/npx.1 | 2 +- deps/npm/man/man5/folders.5 | 2 +- deps/npm/man/man5/install.5 | 2 +- deps/npm/man/man5/npm-global.5 | 2 +- deps/npm/man/man5/npm-json.5 | 2 +- deps/npm/man/man5/npm-shrinkwrap-json.5 | 2 +- deps/npm/man/man5/npmrc.5 | 2 +- deps/npm/man/man5/package-json.5 | 2 +- deps/npm/man/man5/package-lock-json.5 | 2 +- deps/npm/man/man7/config.7 | 2 +- deps/npm/man/man7/dependency-selectors.7 | 2 +- deps/npm/man/man7/developers.7 | 2 +- deps/npm/man/man7/logging.7 | 2 +- deps/npm/man/man7/orgs.7 | 2 +- deps/npm/man/man7/package-spec.7 | 2 +- deps/npm/man/man7/registry.7 | 2 +- deps/npm/man/man7/removal.7 | 2 +- deps/npm/man/man7/scope.7 | 2 +- deps/npm/man/man7/scripts.7 | 2 +- deps/npm/man/man7/workspaces.7 | 2 +- .../arborist/lib/arborist/load-actual.js | 4 +- .../@npmcli/arborist/package.json | 4 +- .../@npmcli/config/lib/definitions/index.js | 8 + .../node_modules/@npmcli/config/package.json | 2 +- .../@sigstore/core/dist/asn1/obj.js | 3 + .../@sigstore/core/dist/asn1/tag.js | 3 + .../node_modules/@sigstore/core/dist/oid.js | 8 +- .../@sigstore/core/dist/rfc3161/timestamp.js | 1 + .../@sigstore/core/dist/rfc3161/tstinfo.js | 1 + .../@sigstore/core/dist/stream.js | 10 +- .../@sigstore/core/dist/x509/cert.js | 4 + .../@sigstore/core/dist/x509/ext.js | 1 + .../@sigstore/core/dist/x509/sct.js | 7 + .../node_modules/@sigstore/core/package.json | 2 +- .../@sigstore/sign/dist/bundler/base.js | 2 + .../@sigstore/sign/dist/bundler/dsse.js | 1 + .../@sigstore/sign/dist/config.js | 143 +++ .../node_modules/@sigstore/sign/dist/error.js | 2 + .../@sigstore/sign/dist/external/error.js | 2 + .../@sigstore/sign/dist/external/fulcio.js | 1 + .../@sigstore/sign/dist/external/rekor-v2.js | 45 + .../@sigstore/sign/dist/external/rekor.js | 1 + .../@sigstore/sign/dist/external/tsa.js | 8 +- .../@sigstore/sign/dist/identity/ci.js | 1 + .../node_modules/@sigstore/sign/dist/index.js | 4 +- .../@sigstore/sign/dist/signer/fulcio/ca.js | 1 + .../sign/dist/signer/fulcio/ephemeral.js | 10 +- .../sign/dist/signer/fulcio/index.js | 3 + .../sign/dist/witness/tlog/client.js | 35 +- .../@sigstore/sign/dist/witness/tlog/entry.js | 59 +- .../@sigstore/sign/dist/witness/tlog/index.js | 31 +- .../@sigstore/sign/dist/witness/tsa/client.js | 1 + .../@sigstore/sign/dist/witness/tsa/index.js | 1 + .../sign/node_modules/proc-log/LICENSE | 15 - .../sign/node_modules/proc-log/lib/index.js | 153 --- .../sign/node_modules/proc-log/package.json | 46 - .../node_modules/@sigstore/sign/package.json | 8 +- .../node_modules/@sigstore/tuf/dist/client.js | 3 + .../node_modules/@sigstore/tuf/dist/error.js | 2 + .../node_modules/@sigstore/tuf/package.json | 6 +- .../npm/node_modules/@sigstore/tuf/seeds.json | 2 +- .../@sigstore/verify/dist/bundle/dsse.js | 1 + .../@sigstore/verify/dist/bundle/index.js | 18 +- .../@sigstore/verify/dist/bundle/message.js | 20 +- .../@sigstore/verify/dist/error.js | 2 + .../@sigstore/verify/dist/key/certificate.js | 4 + .../@sigstore/verify/dist/timestamp/index.js | 34 +- .../dist/{timestamp => tlog}/checkpoint.js | 33 +- .../@sigstore/verify/dist/tlog/dsse.js | 55 +- .../verify/dist/tlog/hashedrekord.js | 47 +- .../@sigstore/verify/dist/tlog/index.js | 51 +- .../verify/dist/{timestamp => tlog}/merkle.js | 6 +- .../verify/dist/{timestamp => tlog}/set.js | 0 .../@sigstore/verify/dist/trust/index.js | 8 +- .../@sigstore/verify/dist/verifier.js | 39 +- .../@sigstore/verify/package.json | 4 +- .../models/node_modules/minimatch/LICENSE | 15 - .../dist/commonjs/assert-valid-pattern.js | 14 - .../minimatch/dist/commonjs/ast.js | 592 ---------- .../dist/commonjs/brace-expressions.js | 152 --- .../minimatch/dist/commonjs/escape.js | 22 - .../minimatch/dist/commonjs/index.js | 1017 ----------------- .../minimatch/dist/commonjs/unescape.js | 24 - .../dist/esm/assert-valid-pattern.js | 10 - .../node_modules/minimatch/dist/esm/ast.js | 588 ---------- .../minimatch/dist/esm/brace-expressions.js | 148 --- .../node_modules/minimatch/dist/esm/escape.js | 18 - .../node_modules/minimatch/dist/esm/index.js | 1001 ---------------- .../minimatch/dist/esm/unescape.js | 20 - .../node_modules/minimatch/package.json | 82 -- .../node_modules/@tufjs/models/package.json | 4 +- .../node_modules/balanced-match/LICENSE.md | 21 - deps/npm/node_modules/balanced-match/index.js | 62 - .../node_modules/balanced-match/package.json | 48 - deps/npm/node_modules/brace-expansion/LICENSE | 21 - .../npm/node_modules/brace-expansion/index.js | 203 ---- .../node_modules/brace-expansion/package.json | 49 - .../node_modules/common-ancestor-path/LICENSE | 15 - .../common-ancestor-path/LICENSE.md | 55 + .../dist/commonjs/index.js | 20 + .../dist/commonjs/package.json | 0 .../common-ancestor-path/dist/esm/index.js | 16 + .../dist/esm/package.json | 0 .../common-ancestor-path/index.js | 17 - .../common-ancestor-path/package.json | 54 +- deps/npm/node_modules/diff/dist/diff.js | 143 ++- deps/npm/node_modules/diff/dist/diff.min.js | 2 +- .../npm/node_modules/diff/libcjs/diff/word.js | 61 +- deps/npm/node_modules/diff/libcjs/index.js | 5 +- .../node_modules/diff/libcjs/patch/create.js | 44 +- .../node_modules/diff/libcjs/patch/parse.js | 35 +- .../node_modules/diff/libcjs/util/string.js | 2 +- .../npm/node_modules/diff/libesm/diff/word.js | 60 +- deps/npm/node_modules/diff/libesm/index.js | 4 +- .../node_modules/diff/libesm/patch/create.js | 43 +- .../node_modules/diff/libesm/patch/parse.js | 35 +- .../node_modules/diff/libesm/util/string.js | 2 +- deps/npm/node_modules/diff/package.json | 7 +- deps/npm/node_modules/diff/release-notes.md | 11 +- deps/npm/node_modules/ip-address/dist/ipv4.js | 33 + deps/npm/node_modules/ip-address/package.json | 2 +- deps/npm/node_modules/libnpmdiff/package.json | 4 +- deps/npm/node_modules/libnpmexec/package.json | 4 +- deps/npm/node_modules/libnpmfund/package.json | 4 +- deps/npm/node_modules/libnpmpack/package.json | 4 +- deps/npm/node_modules/lru-cache/LICENSE | 15 - deps/npm/node_modules/lru-cache/LICENSE.md | 55 + .../lru-cache/dist/commonjs/index.js | 59 +- .../lru-cache/dist/commonjs/index.min.js | 2 +- .../node_modules/lru-cache/dist/esm/index.js | 59 +- .../lru-cache/dist/esm/index.min.js | 2 +- deps/npm/node_modules/lru-cache/package.json | 16 +- .../path-scurry/dist/commonjs/index.js | 6 +- .../path-scurry/dist/esm/index.js | 6 +- .../npm/node_modules/path-scurry/package.json | 2 +- .../postcss-selector-parser/dist/parser.js | 2 +- .../postcss-selector-parser/package.json | 5 +- .../node_modules/sigstore/dist/sigstore.js | 6 +- deps/npm/node_modules/sigstore/package.json | 12 +- .../node_modules/tar/dist/commonjs/extract.js | 24 +- .../node_modules/tar/dist/commonjs/header.js | 24 +- .../node_modules/tar/dist/commonjs/index.js | 24 +- .../node_modules/tar/dist/commonjs/list.js | 24 +- .../tar/dist/commonjs/normalize-unicode.js | 6 +- .../node_modules/tar/dist/commonjs/pack.js | 24 +- .../tar/dist/commonjs/path-reservations.js | 2 +- .../node_modules/tar/dist/commonjs/unpack.js | 76 +- .../tar/dist/commonjs/write-entry.js | 24 +- .../tar/dist/esm/normalize-unicode.js | 6 +- .../tar/dist/esm/path-reservations.js | 2 +- deps/npm/node_modules/tar/dist/esm/unpack.js | 52 +- deps/npm/node_modules/tar/package.json | 71 +- deps/npm/node_modules/tuf-js/dist/config.js | 1 + deps/npm/node_modules/tuf-js/dist/fetcher.js | 6 + deps/npm/node_modules/tuf-js/dist/updater.js | 5 + deps/npm/node_modules/tuf-js/package.json | 10 +- .../lib/builtin-modules.json | 1 + .../validate-npm-package-name/lib/index.js | 6 +- .../validate-npm-package-name/package.json | 28 +- deps/npm/package.json | 22 +- .../test/lib/commands/sbom.js.test.cjs | 28 +- deps/npm/test/lib/commands/config.js | 43 + deps/npm/test/lib/commands/sbom.js | 2 +- deps/npm/test/lib/utils/tar.js | 34 + 321 files changed, 1961 insertions(+), 5185 deletions(-) create mode 100644 deps/npm/node_modules/@sigstore/sign/dist/config.js create mode 100644 deps/npm/node_modules/@sigstore/sign/dist/external/rekor-v2.js delete mode 100644 deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE delete mode 100644 deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js delete mode 100644 deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json rename deps/npm/node_modules/@sigstore/verify/dist/{timestamp => tlog}/checkpoint.js (88%) rename deps/npm/node_modules/@sigstore/verify/dist/{timestamp => tlog}/merkle.js (95%) rename deps/npm/node_modules/@sigstore/verify/dist/{timestamp => tlog}/set.js (100%) delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/LICENSE delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/ast.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/brace-expressions.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/escape.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/unescape.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/assert-valid-pattern.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/ast.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/brace-expressions.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/escape.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/index.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/unescape.js delete mode 100644 deps/npm/node_modules/@tufjs/models/node_modules/minimatch/package.json delete mode 100644 deps/npm/node_modules/balanced-match/LICENSE.md delete mode 100644 deps/npm/node_modules/balanced-match/index.js delete mode 100644 deps/npm/node_modules/balanced-match/package.json delete mode 100644 deps/npm/node_modules/brace-expansion/LICENSE delete mode 100644 deps/npm/node_modules/brace-expansion/index.js delete mode 100644 deps/npm/node_modules/brace-expansion/package.json delete mode 100644 deps/npm/node_modules/common-ancestor-path/LICENSE create mode 100644 deps/npm/node_modules/common-ancestor-path/LICENSE.md create mode 100644 deps/npm/node_modules/common-ancestor-path/dist/commonjs/index.js rename deps/npm/node_modules/{@tufjs/models/node_modules/minimatch => common-ancestor-path}/dist/commonjs/package.json (100%) create mode 100644 deps/npm/node_modules/common-ancestor-path/dist/esm/index.js rename deps/npm/node_modules/{@tufjs/models/node_modules/minimatch => common-ancestor-path}/dist/esm/package.json (100%) delete mode 100644 deps/npm/node_modules/common-ancestor-path/index.js delete mode 100644 deps/npm/node_modules/lru-cache/LICENSE create mode 100644 deps/npm/node_modules/lru-cache/LICENSE.md create mode 100644 deps/npm/node_modules/validate-npm-package-name/lib/builtin-modules.json diff --git a/deps/npm/docs/content/commands/npm-dedupe.md b/deps/npm/docs/content/commands/npm-dedupe.md index b07d241f451f7c..961da3ab294754 100644 --- a/deps/npm/docs/content/commands/npm-dedupe.md +++ b/deps/npm/docs/content/commands/npm-dedupe.md @@ -48,7 +48,7 @@ a ``` During the installation process, the `c@1.0.3` dependency for `b` was placed in the root of the tree. -Though `d`'s dependency on `c@1.x` could have been satisfied by `c@1.0.3`, the newer `c@1.9.0` dependency was used, because npm favors updates by default, even when doing so causes duplication. +Though `d`'s dependency on `c@1.x` could have been satisfied by `c@1.0.3`, the newer `c@1.9.9` dependency was used, because npm favors updates by default, even when doing so causes duplication. Running `npm dedupe` will cause npm to note the duplication and re-evaluate, deleting the nested `c` module, because the one in the root is sufficient. diff --git a/deps/npm/docs/content/commands/npm-install.md b/deps/npm/docs/content/commands/npm-install.md index 06659035d03366..2a1d26ede258ab 100644 --- a/deps/npm/docs/content/commands/npm-install.md +++ b/deps/npm/docs/content/commands/npm-install.md @@ -23,6 +23,18 @@ If the package has a package-lock, or an npm shrinkwrap file, or a yarn lock fil See [package-lock.json](/configuring-npm/package-lock-json) and [`npm shrinkwrap`](/commands/npm-shrinkwrap). +#### How `npm install` uses `package-lock.json` + +When you run `npm install` without arguments, npm compares `package.json` and `package-lock.json`: + +* **If the lockfile's resolved versions satisfy the `package.json` ranges:** npm uses the exact versions from `package-lock.json` to ensure reproducible builds across environments. + +* **If the ranges don't match:** npm resolves new versions that satisfy the `package.json` ranges and updates `package-lock.json` accordingly. This happens when you modify version ranges in `package.json` (e.g., changing `^7.0.0` to `^8.0.0`). Note that changing a range within the same major version (e.g., `^7.0.0` to `^7.1.0`) will only update the metadata in the lockfile if the currently installed version still satisfies the new range. + +In essence, `package-lock.json` locks your dependencies to specific versions, but `package.json` is the source of truth for acceptable version ranges. When the lockfile's versions satisfy the `package.json` ranges, the lockfile wins. When they conflict, `package.json` wins and the lockfile is updated. + +If you want to install packages while ensuring that `package.json` is not modified and that both files are strictly in sync, use [`npm ci`](/commands/npm-ci) instead. + A `package` is: * a) a folder containing a program described by a [`package.json`](/configuring-npm/package-json) file diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index a11d32a80026d1..6c7ce82303db9a 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -23,7 +23,7 @@ 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: ```bash -npm@11.7.0 /path/to/npm +npm@11.8.0 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index dfd97adb237349..414cd19504d6b7 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -14,7 +14,7 @@ Note: This command is unaware of workspaces. ### Version -11.7.0 +11.8.0 ### Description diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index 195681af3693be..39676b9b9317fa 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -141,9 +141,9 @@
-

+

npm-access - @11.7.0 + @11.8.0

Set access level on published packages
diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index 53abba7912a65c..f2009362925a85 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -141,9 +141,9 @@
-

+

npm-adduser - @11.7.0 + @11.8.0

Add a registry user account
diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html index c54dca59e2b904..878a31db887bb0 100644 --- a/deps/npm/docs/output/commands/npm-audit.html +++ b/deps/npm/docs/output/commands/npm-audit.html @@ -141,9 +141,9 @@
-

+

npm-audit - @11.7.0 + @11.8.0

Run a security audit
diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index 6b1655ffa6178b..6abbe3f6c99d7b 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -141,9 +141,9 @@
-

+

npm-bugs - @11.7.0 + @11.8.0

Report bugs for a package in a web browser
diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index e981e87cd3c154..22b637e6b354cf 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -141,9 +141,9 @@
-

+

npm-cache - @11.7.0 + @11.8.0

Manipulates packages cache
diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index 7c61a7d882b3d8..d2394af17cac69 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -141,9 +141,9 @@
-

+

npm-ci - @11.7.0 + @11.8.0

Clean install a project
diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index fa450ac4421618..f561a735198e60 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -141,9 +141,9 @@
-

+

npm-completion - @11.7.0 + @11.8.0

Tab Completion for npm
diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index 08798146c3537b..e327ce50ae5d49 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -141,9 +141,9 @@
-

+

npm-config - @11.7.0 + @11.8.0

Manage the npm configuration files
diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index 42899a4560b7bd..3de18a24ae51b1 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -141,9 +141,9 @@
-

+

npm-dedupe - @11.7.0 + @11.8.0

Reduce duplication in the package tree
@@ -182,7 +182,7 @@

Description

`-- c@1.9.9

During the installation process, the c@1.0.3 dependency for b was placed in the root of the tree. -Though d's dependency on c@1.x could have been satisfied by c@1.0.3, the newer c@1.9.0 dependency was used, because npm favors updates by default, even when doing so causes duplication.

+Though d's dependency on c@1.x could have been satisfied by c@1.0.3, the newer c@1.9.9 dependency was used, because npm favors updates by default, even when doing so causes duplication.

Running npm dedupe will cause npm to note the duplication and re-evaluate, deleting the nested c module, because the one in the root is sufficient.

To prefer deduplication over novelty during the installation process, run npm install --prefer-dedupe or npm config set prefer-dedupe true.

Arguments are ignored. diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index 609064ffaed62b..c40bcac7ffaac8 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -141,9 +141,9 @@

-

+

npm-deprecate - @11.7.0 + @11.8.0

Deprecate a version of a package
diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index fe49cff65fb271..6c8f6018f8b878 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -141,9 +141,9 @@
-

+

npm-diff - @11.7.0 + @11.8.0

The registry diff command
diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index ec4ed8f1e172c3..581e9965eb4116 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -141,9 +141,9 @@
-

+

npm-dist-tag - @11.7.0 + @11.8.0

Modify package distribution tags
diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 6d3e6774f5853e..73fc0c6748fbaa 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -141,9 +141,9 @@
-

+

npm-docs - @11.7.0 + @11.8.0

Open documentation for a package in a web browser
diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index 1c5c5a8cff3652..87ab2a2d25840e 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -141,9 +141,9 @@
-

+

npm-doctor - @11.7.0 + @11.8.0

Check the health of your npm environment
diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index 56a94020dfe3a0..f93b857759a619 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -141,9 +141,9 @@
-

+

npm-edit - @11.7.0 + @11.8.0

Edit an installed package
diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index b6037997c09090..72b046877d981c 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -141,9 +141,9 @@
-

+

npm-exec - @11.7.0 + @11.8.0

Run a command from a local or remote npm package
diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index dd2fa78955f6df..db7a279310b86f 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -141,9 +141,9 @@
-

+

npm-explain - @11.7.0 + @11.8.0

Explain installed packages
diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index ae3fa3ebf2b14b..18584dcfdfc185 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -141,9 +141,9 @@
-

+

npm-explore - @11.7.0 + @11.8.0

Browse an installed package
diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index d4ec011e79b3ba..f0227ea8ed1042 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -141,9 +141,9 @@
-

+

npm-find-dupes - @11.7.0 + @11.8.0

Find duplication in the package tree
diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index f12b6c52447a19..cc92070f947ad1 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -141,9 +141,9 @@
-

+

npm-fund - @11.7.0 + @11.8.0

Retrieve funding information
diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index e1d24260ff706b..715c48d79db133 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -141,9 +141,9 @@
-

+

npm-help-search - @11.7.0 + @11.8.0

Search npm help documentation
diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index eb5ea89ace3ad2..0ee164da5aba92 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -141,9 +141,9 @@
-

+

npm-help - @11.7.0 + @11.8.0

Get help on npm
diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index bfa5478fdd8848..22a5d1762237cd 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -141,9 +141,9 @@
-

+

npm-init - @11.7.0 + @11.8.0

Create a package.json file
diff --git a/deps/npm/docs/output/commands/npm-install-ci-test.html b/deps/npm/docs/output/commands/npm-install-ci-test.html index 526a2d839b69bd..a5249669589a29 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -141,9 +141,9 @@
-

+

npm-install-ci-test - @11.7.0 + @11.8.0

Install a project with a clean slate and run tests
diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index 63cf5fb8640217..8bfac253af5d39 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -141,9 +141,9 @@
-

+

npm-install-test - @11.7.0 + @11.8.0

Install package(s) and run tests
diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index 3915e34ab07f71..d04f14289f4fc4 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -141,16 +141,16 @@
-

+

npm-install - @11.7.0 + @11.8.0

Install a package

Table of contents

- +

Synopsis

@@ -167,6 +167,18 @@

Description

  • yarn.lock
  • See package-lock.json and npm shrinkwrap.

    +

    How npm install uses package-lock.json

    +

    When you run npm install without arguments, npm compares package.json and package-lock.json:

    +
      +
    • +

      If the lockfile's resolved versions satisfy the package.json ranges: npm uses the exact versions from package-lock.json to ensure reproducible builds across environments.

      +
    • +
    • +

      If the ranges don't match: npm resolves new versions that satisfy the package.json ranges and updates package-lock.json accordingly. This happens when you modify version ranges in package.json (e.g., changing ^7.0.0 to ^8.0.0). Note that changing a range within the same major version (e.g., ^7.0.0 to ^7.1.0) will only update the metadata in the lockfile if the currently installed version still satisfies the new range.

      +
    • +
    +

    In essence, package-lock.json locks your dependencies to specific versions, but package.json is the source of truth for acceptable version ranges. When the lockfile's versions satisfy the package.json ranges, the lockfile wins. When they conflict, package.json wins and the lockfile is updated.

    +

    If you want to install packages while ensuring that package.json is not modified and that both files are strictly in sync, use npm ci instead.

    A package is:

    • a) a folder containing a program described by a package.json file
    • diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index b3aa3f4d10dcba..623c7e11fdb1bb 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -141,9 +141,9 @@
      -

      +

      npm-link - @11.7.0 + @11.8.0

      Symlink a package folder
      diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index b006eb10857a68..3678e650cb5e88 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -141,9 +141,9 @@
      -

      +

      npm-login - @11.7.0 + @11.8.0

      Login to a registry user account
      diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 35383e7a423518..c525049a80c8e0 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -141,9 +141,9 @@
      -

      +

      npm-logout - @11.7.0 + @11.8.0

      Log out of the registry
      diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 90861185c402e5..4dd8079347992d 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -141,9 +141,9 @@
      -

      +

      npm-ls - @11.7.0 + @11.8.0

      List installed packages
      @@ -164,7 +164,7 @@

      Description

      Positional arguments are name@version-range identifiers, which will limit 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@11.7.0 /path/to/npm
      +
      npm@11.8.0 /path/to/npm
       └─┬ init-package-json@0.0.4
         └── promzard@0.1.5
       
      diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index 02255e5e793d0f..469e209df5077c 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -141,9 +141,9 @@
      -

      +

      npm-org - @11.7.0 + @11.8.0

      Manage orgs
      diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 6ea0b004145cd2..efb3ff7d56a081 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -141,9 +141,9 @@
      -

      +

      npm-outdated - @11.7.0 + @11.8.0

      Check for outdated packages
      diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index 4f15b4e08d0d53..665a52d907d4ff 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -141,9 +141,9 @@
      -

      +

      npm-owner - @11.7.0 + @11.8.0

      Manage package owners
      diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index aca14d30af2372..14bc9e7ba1cbd8 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -141,9 +141,9 @@
      -

      +

      npm-pack - @11.7.0 + @11.8.0

      Create a tarball from a package
      diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index 24d15552bfd73c..a08724eac4ccfa 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -141,9 +141,9 @@
      -

      +

      npm-ping - @11.7.0 + @11.8.0

      Ping npm registry
      diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index d733de75a9bcea..e52de406a4f2f9 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -141,9 +141,9 @@
      -

      +

      npm-pkg - @11.7.0 + @11.8.0

      Manages your package.json
      diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index c4d8f342fabdd6..658651774b1a59 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -141,9 +141,9 @@
      -

      +

      npm-prefix - @11.7.0 + @11.8.0

      Display prefix
      diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index 9635c4791ba220..6b72071e663509 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -141,9 +141,9 @@
      -

      +

      npm-profile - @11.7.0 + @11.8.0

      Change settings on your registry profile
      diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 6fe4dc9df388be..2400d058f35207 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -141,9 +141,9 @@
      -

      +

      npm-prune - @11.7.0 + @11.8.0

      Remove extraneous packages
      diff --git a/deps/npm/docs/output/commands/npm-publish.html b/deps/npm/docs/output/commands/npm-publish.html index 902fc998eb89be..fcf362f5f29fd3 100644 --- a/deps/npm/docs/output/commands/npm-publish.html +++ b/deps/npm/docs/output/commands/npm-publish.html @@ -141,9 +141,9 @@
      -

      +

      npm-publish - @11.7.0 + @11.8.0

      Publish a package
      diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index e292db70829e47..0e0dbe619f1e99 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -141,9 +141,9 @@
      -

      +

      npm-query - @11.7.0 + @11.8.0

      Dependency selector query
      diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index 7c110a2ad955b0..79f50be72d9671 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -141,9 +141,9 @@
      -

      +

      npm-rebuild - @11.7.0 + @11.8.0

      Rebuild a package
      diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index 450878c0734775..63ca4cc36c9a7d 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -141,9 +141,9 @@
      -

      +

      npm-repo - @11.7.0 + @11.8.0

      Open package repository page in the browser
      diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index f1764f873aae82..363dddd730f091 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -141,9 +141,9 @@
      -

      +

      npm-restart - @11.7.0 + @11.8.0

      Restart a package
      diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index 186548602859ec..1a3b1810790bc9 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -141,9 +141,9 @@
      -

      +

      npm-root - @11.7.0 + @11.8.0

      Display npm root
      diff --git a/deps/npm/docs/output/commands/npm-run.html b/deps/npm/docs/output/commands/npm-run.html index a2e78de43fe9b0..c75b0d5a111727 100644 --- a/deps/npm/docs/output/commands/npm-run.html +++ b/deps/npm/docs/output/commands/npm-run.html @@ -141,9 +141,9 @@
      -

      +

      npm-run - @11.7.0 + @11.8.0

      Run arbitrary package scripts
      diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index 07972e5783f6ac..15b55ef8d4f34c 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -141,9 +141,9 @@
      -

      +

      npm-sbom - @11.7.0 + @11.8.0

      Generate a Software Bill of Materials (SBOM)
      diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index 64ef87b7973c0e..a8b4aab30f6ec8 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -141,9 +141,9 @@
      -

      +

      npm-search - @11.7.0 + @11.8.0

      Search for packages
      diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index b92d9786c71452..ab597fdb479e31 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -141,9 +141,9 @@
      -

      +

      npm-shrinkwrap - @11.7.0 + @11.8.0

      Lock down dependency versions for publication
      diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index b81b5250b90a20..7223c05fb28d38 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -141,9 +141,9 @@
      -

      +

      npm-star - @11.7.0 + @11.8.0

      Mark your favorite packages
      diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index 5df59861cda55f..a34a46322ba024 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -141,9 +141,9 @@
      -

      +

      npm-stars - @11.7.0 + @11.8.0

      View packages marked as favorites
      diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index 466f107eb62f73..47465f8c9a49a0 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -141,9 +141,9 @@
      -

      +

      npm-start - @11.7.0 + @11.8.0

      Start a package
      diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index 7a56dd1d92cc91..b0447eebdf80a7 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -141,9 +141,9 @@
      -

      +

      npm-stop - @11.7.0 + @11.8.0

      Stop a package
      diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 31263891e24bef..9ab4c3027d3d4d 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -141,9 +141,9 @@
      -

      +

      npm-team - @11.7.0 + @11.8.0

      Manage organization teams and team memberships
      diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index 025d4d5d0f8e2e..e835564944e76d 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -141,9 +141,9 @@
      -

      +

      npm-test - @11.7.0 + @11.8.0

      Test a package
      diff --git a/deps/npm/docs/output/commands/npm-token.html b/deps/npm/docs/output/commands/npm-token.html index 2948ec6b23db99..2e5992e0c47477 100644 --- a/deps/npm/docs/output/commands/npm-token.html +++ b/deps/npm/docs/output/commands/npm-token.html @@ -141,9 +141,9 @@
      -

      +

      npm-token - @11.7.0 + @11.8.0

      Manage your authentication tokens
      diff --git a/deps/npm/docs/output/commands/npm-undeprecate.html b/deps/npm/docs/output/commands/npm-undeprecate.html index 66d8ce0a900ba9..0d9ef012171a2a 100644 --- a/deps/npm/docs/output/commands/npm-undeprecate.html +++ b/deps/npm/docs/output/commands/npm-undeprecate.html @@ -141,9 +141,9 @@
      -

      +

      npm-undeprecate - @11.7.0 + @11.8.0

      Undeprecate a version of a package
      diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index 4f678e7ad2f39c..c32a789d353362 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -141,9 +141,9 @@
      -

      +

      npm-uninstall - @11.7.0 + @11.8.0

      Remove a package
      diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index 74090e9106689e..c6b75bcf6d682a 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -141,9 +141,9 @@
      -

      +

      npm-unpublish - @11.7.0 + @11.8.0

      Remove a package from the registry
      diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index afb9d0f9f1b02a..bbaf00267f8fca 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -141,9 +141,9 @@
      -

      +

      npm-unstar - @11.7.0 + @11.8.0

      Remove an item from your favorite packages
      diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index ee3e56021d3557..bc5e705ecbf15d 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -141,9 +141,9 @@
      -

      +

      npm-update - @11.7.0 + @11.8.0

      Update packages
      diff --git a/deps/npm/docs/output/commands/npm-version.html b/deps/npm/docs/output/commands/npm-version.html index 1c782c4f312e60..740918a939bbaa 100644 --- a/deps/npm/docs/output/commands/npm-version.html +++ b/deps/npm/docs/output/commands/npm-version.html @@ -141,9 +141,9 @@
      -

      +

      npm-version - @11.7.0 + @11.8.0

      Bump a package version
      diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index 8a9587ea7a5dac..f99d84863d4d80 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -141,9 +141,9 @@
      -

      +

      npm-view - @11.7.0 + @11.8.0

      View registry info
      diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index e6d50a4a56ab9b..23e37412371ba2 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -141,9 +141,9 @@
      -

      +

      npm-whoami - @11.7.0 + @11.8.0

      Display npm username
      diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 83b9183caabb10..41ef589d936e4a 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -141,9 +141,9 @@
      -

      +

      npm - @11.7.0 + @11.8.0

      javascript package manager
      @@ -158,7 +158,7 @@

      Table of contents

      Note: This command is unaware of workspaces.

      Version

      -

      11.7.0

      +

      11.8.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 conflicts intelligently.

      diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index ac84c4ce43f555..25be9f6e9d21f5 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -141,9 +141,9 @@
      -

      +

      npx - @11.7.0 + @11.8.0

      Run a command from a local or remote npm package
      diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index 5b2ca1e00307b5..c20e52e9b65410 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -141,9 +141,9 @@
      -

      +

      folders - @11.7.0 + @11.8.0

      Folder Structures Used by npm
      diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index f0bfe9e47cdef8..5cd495d58a0885 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -141,9 +141,9 @@
      -

      +

      install - @11.7.0 + @11.8.0

      Download and install node and npm
      diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html index 5b2ca1e00307b5..c20e52e9b65410 100644 --- a/deps/npm/docs/output/configuring-npm/npm-global.html +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -141,9 +141,9 @@
      -

      +

      folders - @11.7.0 + @11.8.0

      Folder Structures Used by npm
      diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html index 26ce88646cedfb..06596d5151fcde 100644 --- a/deps/npm/docs/output/configuring-npm/npm-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -141,9 +141,9 @@
      -

      +

      package.json - @11.7.0 + @11.8.0

      Specifics of npm's package.json handling
      diff --git a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html index c46b3e0237405e..e3209b863bf7c0 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -141,9 +141,9 @@
      -

      +

      npm-shrinkwrap.json - @11.7.0 + @11.8.0

      A publishable lockfile
      diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index 289cc7e902e564..349d1c4842b7d6 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -141,9 +141,9 @@
      -

      +

      npmrc - @11.7.0 + @11.8.0

      The npm config files
      diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index 26ce88646cedfb..06596d5151fcde 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -141,9 +141,9 @@
      -

      +

      package.json - @11.7.0 + @11.8.0

      Specifics of npm's package.json handling
      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 6ca747d5e159a2..8c290cc4fa857c 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -141,9 +141,9 @@
      -

      +

      package-lock.json - @11.7.0 + @11.8.0

      A manifestation of the manifest
      diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 5d12d804cb4f8d..6ba8263f92241a 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -141,9 +141,9 @@
      -

      +

      config - @11.7.0 + @11.8.0

      More than you probably want to know about npm configuration
      diff --git a/deps/npm/docs/output/using-npm/dependency-selectors.html b/deps/npm/docs/output/using-npm/dependency-selectors.html index b14b7b41c977c9..7f33a56f95605e 100644 --- a/deps/npm/docs/output/using-npm/dependency-selectors.html +++ b/deps/npm/docs/output/using-npm/dependency-selectors.html @@ -141,9 +141,9 @@
      -

      +

      Dependency Selector Syntax & Querying - @11.7.0 + @11.8.0

      Dependency Selector Syntax & Querying
      diff --git a/deps/npm/docs/output/using-npm/developers.html b/deps/npm/docs/output/using-npm/developers.html index a0671c71fa5b7d..ad4571f4a2fb96 100644 --- a/deps/npm/docs/output/using-npm/developers.html +++ b/deps/npm/docs/output/using-npm/developers.html @@ -141,9 +141,9 @@
      -

      +

      developers - @11.7.0 + @11.8.0

      Developer Guide
      diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index 7f1f90fce204e6..a2391b405654bc 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -141,9 +141,9 @@
      -

      +

      Logging - @11.7.0 + @11.8.0

      Why, What & How We Log
      diff --git a/deps/npm/docs/output/using-npm/orgs.html b/deps/npm/docs/output/using-npm/orgs.html index 90da0dee76ec4e..2e6169f4198b86 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -141,9 +141,9 @@
      -

      +

      orgs - @11.7.0 + @11.8.0

      Working with Teams & Orgs
      diff --git a/deps/npm/docs/output/using-npm/package-spec.html b/deps/npm/docs/output/using-npm/package-spec.html index f9dc50bf35a279..686593d88de148 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -141,9 +141,9 @@
      -

      +

      package-spec - @11.7.0 + @11.8.0

      Package name specifier
      diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 987744d051e3a3..0d4d459ae7556a 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -141,9 +141,9 @@
      -

      +

      registry - @11.7.0 + @11.8.0

      The JavaScript Package Registry
      diff --git a/deps/npm/docs/output/using-npm/removal.html b/deps/npm/docs/output/using-npm/removal.html index 8db083ac1fe712..0ffd55726db245 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -141,9 +141,9 @@
      -

      +

      removal - @11.7.0 + @11.8.0

      Cleaning the Slate
      diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index 1b2aea8e957c3b..44763f6ed1dd92 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -141,9 +141,9 @@
      -

      +

      scope - @11.7.0 + @11.8.0

      Scoped packages
      diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index 74038bacf43764..a6c4e2d30e73a1 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -141,9 +141,9 @@
      -

      +

      scripts - @11.7.0 + @11.8.0

      How npm handles the "scripts" field
      diff --git a/deps/npm/docs/output/using-npm/workspaces.html b/deps/npm/docs/output/using-npm/workspaces.html index 28054a434033a3..1fb6aca83a71f4 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -141,9 +141,9 @@
      -

      +

      workspaces - @11.7.0 + @11.8.0

      Working with workspaces
      diff --git a/deps/npm/lib/commands/config.js b/deps/npm/lib/commands/config.js index b657029b2d2fe5..ce26a46b877dab 100644 --- a/deps/npm/lib/commands/config.js +++ b/deps/npm/lib/commands/config.js @@ -4,7 +4,7 @@ const { spawn } = require('node:child_process') const { EOL } = require('node:os') const localeCompare = require('@isaacs/string-locale-compare')('en') const pkgJson = require('@npmcli/package-json') -const { defaults, definitions, nerfDarts } = require('@npmcli/config/lib/definitions') +const { defaults, definitions, nerfDarts, proxyEnv } = require('@npmcli/config/lib/definitions') const { log, output } = require('proc-log') const BaseCommand = require('../base-cmd.js') const { redact } = require('@npmcli/redact') @@ -350,6 +350,23 @@ ${defData} } if (!long) { + const envVars = [] + + const foundEnvVars = new Set() + for (const key of Object.keys(process.env)) { + const lowerKey = key.toLowerCase() + if (proxyEnv.includes(lowerKey) && !foundEnvVars.has(lowerKey)) { + foundEnvVars.add(lowerKey) + envVars.push(`; ${key} = ${JSON.stringify(process.env[key])}`) + } + } + + if (envVars.length > 0) { + msg.push('; environment-related config', '') + msg.push(...envVars) + msg.push('') + } + msg.push( `; node bin location = ${process.execPath}`, `; node version = ${process.version}`, diff --git a/deps/npm/lib/commands/sbom.js b/deps/npm/lib/commands/sbom.js index 9b06af4e0d3fc7..98452d646dfe82 100644 --- a/deps/npm/lib/commands/sbom.js +++ b/deps/npm/lib/commands/sbom.js @@ -1,6 +1,6 @@ const localeCompare = require('@isaacs/string-locale-compare')('en') const BaseCommand = require('../base-cmd.js') -const { log, output } = require('proc-log') +const { log, output, META } = require('proc-log') const { cyclonedxOutput } = require('../utils/sbom-cyclonedx.js') const { spdxOutput } = require('../utils/sbom-spdx.js') @@ -65,7 +65,7 @@ class SBOM extends BaseCommand { // TODO(BREAKING_CHANGE): all sbom output is in json mode but setting it before // any of the errors will cause those to be thrown in json mode. this.npm.config.set('json', true) - output.buffer(this.#response) + output.standard(JSON.stringify(this.#response, null, 2), { [META]: true, redact: false }) } async execWorkspaces (args) { diff --git a/deps/npm/lib/utils/format-bytes.js b/deps/npm/lib/utils/format-bytes.js index d293001df5524e..b5c53484825eb2 100644 --- a/deps/npm/lib/utils/format-bytes.js +++ b/deps/npm/lib/utils/format-bytes.js @@ -13,12 +13,12 @@ const formatBytes = (bytes, space = true) => { return `${bytes}${spacer}B` } - if (bytes < 1000000) { + if (bytes < 999950) { // kB return `${(bytes / 1000).toFixed(1)}${spacer}kB` } - if (bytes < 1000000000) { + if (bytes < 999950000) { // MB return `${(bytes / 1000000).toFixed(1)}${spacer}MB` } diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 221928483a0fee..549ef7bb7f2b36 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-ACCESS" "1" "January 2026" "NPM@11.8.0" "" .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 fffdc420d5c469..d7d660d1a0712a 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-ADDUSER" "1" "January 2026" "NPM@11.8.0" "" .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 1c5d7bf1fb7d88..3190b1082c4572 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-AUDIT" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 4edc2f0b42f8fc..f067f5965d1702 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-BUGS" "1" "January 2026" "NPM@11.8.0" "" .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 34af9c2130c988..8212e2f888af61 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-CACHE" "1" "January 2026" "NPM@11.8.0" "" .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 d150ca25c243ed..b1b5db34f7a0a4 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-CI" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index a479e3415f6ab1..abbb89ac5b9d0c 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-COMPLETION" "1" "January 2026" "NPM@11.8.0" "" .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 d440315b2036ce..0eb8f83ac45beb 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-CONFIG" "1" "January 2026" "NPM@11.8.0" "" .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 95655df0f8964c..da9d65c7be6497 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DEDUPE" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" @@ -51,7 +51,7 @@ a .fi .RE .P -During the installation process, the \fBc@1.0.3\fR dependency for \fBb\fR was placed in the root of the tree. Though \fBd\fR's dependency on \fBc@1.x\fR could have been satisfied by \fBc@1.0.3\fR, the newer \fBc@1.9.0\fR dependency was used, because npm favors updates by default, even when doing so causes duplication. +During the installation process, the \fBc@1.0.3\fR dependency for \fBb\fR was placed in the root of the tree. Though \fBd\fR's dependency on \fBc@1.x\fR could have been satisfied by \fBc@1.0.3\fR, the newer \fBc@1.9.9\fR dependency was used, because npm favors updates by default, even when doing so causes duplication. .P Running \fBnpm dedupe\fR will cause npm to note the duplication and re-evaluate, deleting the nested \fBc\fR module, because the one in the root is sufficient. .P diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index 2e94119a1066e4..51f3d94607510e 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DEPRECATE" "1" "January 2026" "NPM@11.8.0" "" .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 2f971f2ade16d5..38bb28ad3fc3c1 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DIFF" "1" "January 2026" "NPM@11.8.0" "" .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 92d9cd416bd2c2..ca723f07ecdd32 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DIST-TAG" "1" "January 2026" "NPM@11.8.0" "" .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 c8443c7b4cc32a..751259d93efe62 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DOCS" "1" "January 2026" "NPM@11.8.0" "" .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 25666701aae35c..e4c086978772e6 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-DOCTOR" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 34934c0e12e1d9..0f0b0c8e0d9793 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-EDIT" "1" "January 2026" "NPM@11.8.0" "" .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 af56f7392e9f0c..0f92de99781e08 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-EXEC" "1" "January 2026" "NPM@11.8.0" "" .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 3181c5fb5a9109..404ecbdaa39f1a 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-EXPLAIN" "1" "January 2026" "NPM@11.8.0" "" .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 80820cbb7c8b04..15153e88e398a3 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-EXPLORE" "1" "January 2026" "NPM@11.8.0" "" .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 a286fbd0e9e389..95627bb595909f 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-FIND-DUPES" "1" "January 2026" "NPM@11.8.0" "" .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 b143b012950b9a..02cd2cd729c198 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-FUND" "1" "January 2026" "NPM@11.8.0" "" .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 e42e58710280eb..c46e21d9b8f8b4 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-HELP-SEARCH" "1" "January 2026" "NPM@11.8.0" "" .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 b594d6d61e453f..12fe405e7a7e16 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-HELP" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index 192441bc326108..6d4e513eef8001 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-INIT" "1" "January 2026" "NPM@11.8.0" "" .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 7a318549782ee9..7819e24a6636e8 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-INSTALL-CI-TEST" "1" "January 2026" "NPM@11.8.0" "" .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 cfaca3fba03bb1..d7ed94f577f313 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-INSTALL-TEST" "1" "January 2026" "NPM@11.8.0" "" .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 676c07b19f1095..63785acb1e8523 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-INSTALL" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" @@ -24,6 +24,20 @@ This command installs a package and any packages that it depends on. If the pack .P See \fBpackage-lock.json\fR \fI\(la/configuring-npm/package-lock-json\(ra\fR and npm help shrinkwrap. +.SS "How \fBnpm install\fR uses \fBpackage-lock.json\fR" +.P +When you run \fBnpm install\fR without arguments, npm compares \fBpackage.json\fR and \fBpackage-lock.json\fR: +.RS 0 +.IP \(bu 4 +\fBIf the lockfile's resolved versions satisfy the \fBpackage.json\fB ranges:\fR npm uses the exact versions from \fBpackage-lock.json\fR to ensure reproducible builds across environments. +.IP \(bu 4 +\fBIf the ranges don't match:\fR npm resolves new versions that satisfy the \fBpackage.json\fR ranges and updates \fBpackage-lock.json\fR accordingly. This happens when you modify version ranges in \fBpackage.json\fR (e.g., changing \fB^7.0.0\fR to \fB^8.0.0\fR). Note that changing a range within the same major version (e.g., \fB^7.0.0\fR to \fB^7.1.0\fR) will only update the metadata in the lockfile if the currently installed version still satisfies the new range. +.RE 0 + +.P +In essence, \fBpackage-lock.json\fR locks your dependencies to specific versions, but \fBpackage.json\fR is the source of truth for acceptable version ranges. When the lockfile's versions satisfy the \fBpackage.json\fR ranges, the lockfile wins. When they conflict, \fBpackage.json\fR wins and the lockfile is updated. +.P +If you want to install packages while ensuring that \fBpackage.json\fR is not modified and that both files are strictly in sync, use npm help ci instead. .P A \fBpackage\fR is: .RS 0 diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 20a07b18bd37f1..9ac8e2e4025e02 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-LINK" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index aa86256a412c29..6af5195f459fd8 100644 --- a/deps/npm/man/man1/npm-login.1 +++ b/deps/npm/man/man1/npm-login.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGIN" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-LOGIN" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-login\fR - Login to a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index a9cb0d90da246d..fcfe5f94da44cc 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-LOGOUT" "1" "January 2026" "NPM@11.8.0" "" .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 c856447ba23e8f..21841e45a24183 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-LS" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-ls\fR - List installed packages .SS "Synopsis" @@ -20,7 +20,7 @@ Positional arguments are \fBname@version-range\fR identifiers, which will limit .P .RS 2 .nf -npm@11.7.0 /path/to/npm +npm@11.8.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 2083de7469a8de..c98951ff164ed9 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-ORG" "1" "January 2026" "NPM@11.8.0" "" .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 fd3dc0ab1af91d..1c611268d032e4 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-OUTDATED" "1" "January 2026" "NPM@11.8.0" "" .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 e042272aad6d3f..f964ede5e2fb6e 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-OWNER" "1" "January 2026" "NPM@11.8.0" "" .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 0e65835bec6699..64cc1fec5dd8d4 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PACK" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index 0f0ccc35e811c8..40b4d3ef0bdc8c 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PING" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-ping\fR - Ping npm registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pkg.1 b/deps/npm/man/man1/npm-pkg.1 index 81c165aa5acbca..1d8956a98a7982 100644 --- a/deps/npm/man/man1/npm-pkg.1 +++ b/deps/npm/man/man1/npm-pkg.1 @@ -1,4 +1,4 @@ -.TH "NPM-PKG" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PKG" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-pkg\fR - Manages your package.json .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index 96304a9c436ac0..49165903213e06 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PREFIX" "1" "January 2026" "NPM@11.8.0" "" .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 0345ed510120c5..8fa6c5d98b7615 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PROFILE" "1" "January 2026" "NPM@11.8.0" "" .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 6c0e2060d1111f..ba4d694eec3537 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PRUNE" "1" "January 2026" "NPM@11.8.0" "" .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 4c932f1f74467c..8cb3af4d4cd137 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-PUBLISH" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index 6f8d9edafd79d8..267200f232b478 100644 --- a/deps/npm/man/man1/npm-query.1 +++ b/deps/npm/man/man1/npm-query.1 @@ -1,4 +1,4 @@ -.TH "NPM-QUERY" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-QUERY" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-query\fR - Dependency selector query .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index 2ddfe8ef9ccf6a..c1cd12767f6795 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-REBUILD" "1" "January 2026" "NPM@11.8.0" "" .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 9c53c09bffc15a..cb675fa607d143 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-REPO" "1" "January 2026" "NPM@11.8.0" "" .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 0546b97fdee364..659673cfdf4724 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-RESTART" "1" "January 2026" "NPM@11.8.0" "" .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 4701fe4977609e..be3c7c87bcf158 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-ROOT" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run.1 b/deps/npm/man/man1/npm-run.1 index 4e4a78da51aa3b..3b921b18990fe0 100644 --- a/deps/npm/man/man1/npm-run.1 +++ b/deps/npm/man/man1/npm-run.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-RUN" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-run\fR - Run arbitrary package scripts .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index 41fee548c875e9..ddd19465d923b8 100644 --- a/deps/npm/man/man1/npm-sbom.1 +++ b/deps/npm/man/man1/npm-sbom.1 @@ -1,4 +1,4 @@ -.TH "NPM-SBOM" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-SBOM" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-sbom\fR - Generate a Software Bill of Materials (SBOM) .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 168840ef526bf4..f2289b3e515c22 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-SEARCH" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index 66eece7cef0f04..fad47b9dbf7ed0 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-SHRINKWRAP" "1" "January 2026" "NPM@11.8.0" "" .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 e57fd86909292b..b880ac0ec3acf8 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-STAR" "1" "January 2026" "NPM@11.8.0" "" .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 c2413de4f4d98c..5d9156e4aae4d2 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-STARS" "1" "January 2026" "NPM@11.8.0" "" .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 78c943681fff9f..43e9dff3d70be2 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-START" "1" "January 2026" "NPM@11.8.0" "" .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 da865090a1938b..d89080eb2b01bb 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-STOP" "1" "January 2026" "NPM@11.8.0" "" .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 f3a49dc025c0b1..0bedf0f7cac0a1 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-TEAM" "1" "January 2026" "NPM@11.8.0" "" .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 50a1138e4fe924..f2b443b61ebcfa 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-TEST" "1" "January 2026" "NPM@11.8.0" "" .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 1ee8b395852691..3ea0946784f131 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-TOKEN" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-undeprecate.1 b/deps/npm/man/man1/npm-undeprecate.1 index 12248c0bc3b77c..3c187b6df6406c 100644 --- a/deps/npm/man/man1/npm-undeprecate.1 +++ b/deps/npm/man/man1/npm-undeprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNDEPRECATE" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM-UNDEPRECATE" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm-undeprecate\fR - Undeprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index a889fbb4e76aa3..3d63a8f0d59803 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-UNINSTALL" "1" "January 2026" "NPM@11.8.0" "" .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 fafed88b13e076..fd5157e637718f 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-UNPUBLISH" "1" "January 2026" "NPM@11.8.0" "" .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 cad783d28a7c13..c7dd0dfea23619 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-UNSTAR" "1" "January 2026" "NPM@11.8.0" "" .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 d52e7ed56d0268..47bc8d514f2e33 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-UPDATE" "1" "January 2026" "NPM@11.8.0" "" .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 ade81d3a406857..bdac0d0523bacd 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-VERSION" "1" "January 2026" "NPM@11.8.0" "" .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 458a29968504c8..b6e06c07c5380e 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-VIEW" "1" "January 2026" "NPM@11.8.0" "" .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 fdeb1b84903370..37a53c285b9d40 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-WHOAMI" "1" "January 2026" "NPM@11.8.0" "" .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 7b39d0ffc8070f..eca4a988ed8c35 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPM" "1" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -11.7.0 +11.8.0 .SS "Description" .P npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently. diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index 029641eebc6879..77483aace065f4 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "December 2025" "NPM@11.7.0" "" +.TH "NPX" "1" "January 2026" "NPM@11.8.0" "" .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 da8ac5bf510397..bf485a240067fd 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "December 2025" "NPM@11.7.0" "" +.TH "FOLDERS" "5" "January 2026" "NPM@11.8.0" "" .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 a551b767f72cb0..7eced0fe0ea348 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "December 2025" "NPM@11.7.0" "" +.TH "INSTALL" "5" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBinstall\fR - Download and install node and npm .SS "Description" diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index da8ac5bf510397..bf485a240067fd 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "December 2025" "NPM@11.7.0" "" +.TH "FOLDERS" "5" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBfolders\fR - Folder Structures Used by npm .SS "Description" diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index 0e1bc996e16cf4..619c9f07ef181e 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "December 2025" "NPM@11.7.0" "" +.TH "PACKAGE.JSON" "5" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index 0d994cb7b21013..a7da073e3371a6 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" "December 2025" "NPM@11.7.0" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "January 2026" "NPM@11.8.0" "" .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 a960ebf8ceffc8..1436d828d493b3 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH "NPMRC" "5" "December 2025" "NPM@11.7.0" "" +.TH "NPMRC" "5" "January 2026" "NPM@11.8.0" "" .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 0e1bc996e16cf4..619c9f07ef181e 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" "December 2025" "NPM@11.7.0" "" +.TH "PACKAGE.JSON" "5" "January 2026" "NPM@11.8.0" "" .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 bbc08fbb476923..6f79f0f86ee36f 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" "December 2025" "NPM@11.7.0" "" +.TH "PACKAGE-LOCK.JSON" "5" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index cf6eca403397c2..58ec7a91842c88 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "December 2025" "NPM@11.7.0" "" +.TH "CONFIG" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBconfig\fR - More than you probably want to know about npm configuration .SS "Description" diff --git a/deps/npm/man/man7/dependency-selectors.7 b/deps/npm/man/man7/dependency-selectors.7 index 8b55667ed736a3..17da22c01ac89b 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "QUERYING" "7" "December 2025" "NPM@11.7.0" "" +.TH "QUERYING" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBQuerying\fR - Dependency Selector Syntax & Querying .SS "Description" diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7 index f31fc2c760c8fd..26b943f4965047 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "December 2025" "NPM@11.7.0" "" +.TH "DEVELOPERS" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBdevelopers\fR - Developer Guide .SS "Description" diff --git a/deps/npm/man/man7/logging.7 b/deps/npm/man/man7/logging.7 index 0bb53439ced328..99348fb95b71de 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "December 2025" "NPM@11.7.0" "" +.TH "LOGGING" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBLogging\fR - Why, What & How We Log .SS "Description" diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7 index df6d4a18b3cd50..bbd3ab980b2d05 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGS" "7" "December 2025" "NPM@11.7.0" "" +.TH "ORGS" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBorgs\fR - Working with Teams & Orgs .SS "Description" diff --git a/deps/npm/man/man7/package-spec.7 b/deps/npm/man/man7/package-spec.7 index c2ff611ad2da4a..daaed5a89844aa 100644 --- a/deps/npm/man/man7/package-spec.7 +++ b/deps/npm/man/man7/package-spec.7 @@ -1,4 +1,4 @@ -.TH "PACKAGE-SPEC" "7" "December 2025" "NPM@11.7.0" "" +.TH "PACKAGE-SPEC" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBpackage-spec\fR - Package name specifier .SS "Description" diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7 index a35200cd196314..bc11a807fb773e 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "December 2025" "NPM@11.7.0" "" +.TH "REGISTRY" "7" "January 2026" "NPM@11.8.0" "" .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 c9dd805912a51b..b6ad9050daa4da 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "December 2025" "NPM@11.7.0" "" +.TH "REMOVAL" "7" "January 2026" "NPM@11.8.0" "" .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 5b2a8160dbc877..a32e6b2d7063be 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "December 2025" "NPM@11.7.0" "" +.TH "SCOPE" "7" "January 2026" "NPM@11.8.0" "" .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 989c839c6398c0..75f5c05fdbb2a3 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "December 2025" "NPM@11.7.0" "" +.TH "SCRIPTS" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBscripts\fR - How npm handles the "scripts" field .SS "Description" diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7 index 6a8eba26fef709..4246917e0c0110 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "December 2025" "NPM@11.7.0" "" +.TH "WORKSPACES" "7" "January 2026" "NPM@11.8.0" "" .SH "NAME" \fBworkspaces\fR - Working with workspaces .SS "Description" diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js index 30a11e392cd168..2356227a5baa31 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js @@ -5,7 +5,7 @@ const { dirname, join, normalize, relative, resolve } = require('node:path') const PackageJson = require('@npmcli/package-json') const { readdirScoped } = require('@npmcli/fs') const { walkUp } = require('walk-up-path') -const ancestorPath = require('common-ancestor-path') +const { commonAncestorPath } = require('common-ancestor-path') const treeCheck = require('../tree-check.js') const Shrinkwrap = require('../shrinkwrap.js') @@ -364,7 +364,7 @@ module.exports = cls => class ActualLoader extends cls { const nmContents = new Map() const tree = this.#actualTree for (const node of tree.inventory.values()) { - const ancestor = ancestorPath(node.realpath, this.path) + const ancestor = commonAncestorPath(node.realpath, this.path) const depPromises = [] for (const [name, edge] of node.edgesOut.entries()) { diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json index 5d774c52ed1bc4..b63a2fc0380c4d 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": "9.1.9", + "version": "9.1.10", "description": "Manage node_modules trees", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", @@ -16,7 +16,7 @@ "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", - "common-ancestor-path": "^1.0.1", + "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", diff --git a/deps/npm/node_modules/@npmcli/config/lib/definitions/index.js b/deps/npm/node_modules/@npmcli/config/lib/definitions/index.js index 793b71ea40d6f7..b5b63bf2fce126 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/definitions/index.js +++ b/deps/npm/node_modules/@npmcli/config/lib/definitions/index.js @@ -71,10 +71,18 @@ const nerfDarts = [ 'username', // Does not have a config ] +const proxyEnv = [ + 'http_proxy', + 'https_proxy', + 'proxy', + 'no_proxy', +] + module.exports = { defaults: definitionProps.defaults, definitions, flatten, nerfDarts, + proxyEnv, shorthands, } diff --git a/deps/npm/node_modules/@npmcli/config/package.json b/deps/npm/node_modules/@npmcli/config/package.json index 56c8970cd8f15f..8348464d463db0 100644 --- a/deps/npm/node_modules/@npmcli/config/package.json +++ b/deps/npm/node_modules/@npmcli/config/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/config", - "version": "10.4.5", + "version": "10.5.0", "files": [ "bin/", "lib/" diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js b/deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js index 5f9ac9cdbc4936..2dc90d6ac9b8d0 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js +++ b/deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js @@ -22,6 +22,9 @@ const length_1 = require("./length"); const parse_1 = require("./parse"); const tag_1 = require("./tag"); class ASN1Obj { + tag; + subs; + value; constructor(tag, value, subs) { this.tag = tag; this.value = value; diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js b/deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js index 84dd938d049aa5..ebb4dd562353f6 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js +++ b/deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js @@ -37,6 +37,9 @@ const TAG_CLASS = { }; // https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-encoded-tag-bytes class ASN1Tag { + number; + constructed; + class; constructor(enc) { // Bits 0 through 4 are the tag number this.number = enc & 0x1f; diff --git a/deps/npm/node_modules/@sigstore/core/dist/oid.js b/deps/npm/node_modules/@sigstore/core/dist/oid.js index ac7a643067ad02..4438ac9bdca984 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/oid.js +++ b/deps/npm/node_modules/@sigstore/core/dist/oid.js @@ -1,12 +1,18 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.SHA2_HASH_ALGOS = exports.ECDSA_SIGNATURE_ALGOS = void 0; +exports.SHA2_HASH_ALGOS = exports.RSA_SIGNATURE_ALGOS = exports.ECDSA_SIGNATURE_ALGOS = void 0; exports.ECDSA_SIGNATURE_ALGOS = { '1.2.840.10045.4.3.1': 'sha224', '1.2.840.10045.4.3.2': 'sha256', '1.2.840.10045.4.3.3': 'sha384', '1.2.840.10045.4.3.4': 'sha512', }; +exports.RSA_SIGNATURE_ALGOS = { + '1.2.840.113549.1.1.14': 'sha224', + '1.2.840.113549.1.1.11': 'sha256', + '1.2.840.113549.1.1.12': 'sha384', + '1.2.840.113549.1.1.13': 'sha512', +}; exports.SHA2_HASH_ALGOS = { '2.16.840.1.101.3.4.2.1': 'sha256', '2.16.840.1.101.3.4.2.2': 'sha384', diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js b/deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js index 982fb5e6126e81..a7034526ecbce2 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js +++ b/deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js @@ -58,6 +58,7 @@ const OID_PKCS9_CONTENT_TYPE_SIGNED_DATA = '1.2.840.113549.1.7.2'; const OID_PKCS9_CONTENT_TYPE_TSTINFO = '1.2.840.113549.1.9.16.1.4'; const OID_PKCS9_MESSAGE_DIGEST_KEY = '1.2.840.113549.1.9.4'; class RFC3161Timestamp { + root; constructor(asn1) { this.root = asn1; } diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js b/deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js index d5001c42c108f2..91213529b66050 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js +++ b/deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js @@ -38,6 +38,7 @@ const crypto = __importStar(require("../crypto")); const oid_1 = require("../oid"); const error_1 = require("./error"); class TSTInfo { + root; constructor(asn1) { this.root = asn1; } diff --git a/deps/npm/node_modules/@sigstore/core/dist/stream.js b/deps/npm/node_modules/@sigstore/core/dist/stream.js index 0a24f8582eb23a..c69b3097a2dd25 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/stream.js +++ b/deps/npm/node_modules/@sigstore/core/dist/stream.js @@ -19,14 +19,17 @@ limitations under the License. class StreamError extends Error { } class ByteStream { + static BLOCK_SIZE = 1024; + buf; + view; + start = 0; constructor(buffer) { - this.start = 0; if (buffer) { this.buf = buffer; this.view = Buffer.from(buffer); } else { - this.buf = new ArrayBuffer(0); + this.buf = Buffer.alloc(0); this.view = Buffer.from(this.buf); } } @@ -103,7 +106,7 @@ class ByteStream { } } realloc(size) { - const newArray = new ArrayBuffer(size); + const newArray = Buffer.alloc(size); const newView = Buffer.from(newArray); // Copy the old buffer into the new one newView.set(this.view); @@ -112,4 +115,3 @@ class ByteStream { } } exports.ByteStream = ByteStream; -ByteStream.BLOCK_SIZE = 1024; diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js b/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js index 83aee7d1215a4c..0e1126ba4a298f 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js +++ b/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js @@ -61,6 +61,7 @@ const EXTENSION_OID_BASIC_CONSTRAINTS = '2.5.29.19'; const EXTENSION_OID_AUTHORITY_KEY_ID = '2.5.29.35'; exports.EXTENSION_OID_SCT = '1.3.6.1.4.1.11129.2.4.2'; class X509Certificate { + root; constructor(asn1) { this.root = asn1; } @@ -99,6 +100,9 @@ class X509Certificate { } get signatureAlgorithm() { const oid = this.signatureAlgorithmObj.subs[0].toOID(); + if (oid_1.RSA_SIGNATURE_ALGOS[oid]) { + return oid_1.RSA_SIGNATURE_ALGOS[oid]; + } return oid_1.ECDSA_SIGNATURE_ALGOS[oid]; } get signatureValue() { diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/ext.js b/deps/npm/node_modules/@sigstore/core/dist/x509/ext.js index 1d481261b0aa69..10f37fe256efe5 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/x509/ext.js +++ b/deps/npm/node_modules/@sigstore/core/dist/x509/ext.js @@ -5,6 +5,7 @@ const stream_1 = require("../stream"); const sct_1 = require("./sct"); // https://www.rfc-editor.org/rfc/rfc5280#section-4.1 class X509Extension { + root; constructor(asn1) { this.root = asn1; } diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/sct.js b/deps/npm/node_modules/@sigstore/core/dist/x509/sct.js index 55885e3b307427..338e3478fd45ed 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/x509/sct.js +++ b/deps/npm/node_modules/@sigstore/core/dist/x509/sct.js @@ -52,6 +52,13 @@ limitations under the License. const crypto = __importStar(require("../crypto")); const stream_1 = require("../stream"); class SignedCertificateTimestamp { + version; + logID; + timestamp; + extensions; + hashAlgorithm; + signatureAlgorithm; + signature; constructor(options) { this.version = options.version; this.logID = options.logID; diff --git a/deps/npm/node_modules/@sigstore/core/package.json b/deps/npm/node_modules/@sigstore/core/package.json index 7d2f8d5de3f7a8..8cd757103e7a11 100644 --- a/deps/npm/node_modules/@sigstore/core/package.json +++ b/deps/npm/node_modules/@sigstore/core/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/core", - "version": "3.0.0", + "version": "3.1.0", "description": "Base library for Sigstore", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js index 61d5eba4568a35..e231c663fffc1a 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js @@ -6,6 +6,8 @@ exports.BaseBundleBuilder = void 0; // Subclasses must implement the `package` method to assemble a valid bundle // with the generated signature and verification material. class BaseBundleBuilder { + signer; + witnesses; constructor(options) { this.signer = options.signer; this.witnesses = options.witnesses; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js index 86046ba8f3013b..95c8d31c29fc34 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js @@ -21,6 +21,7 @@ const base_1 = require("./base"); const bundle_1 = require("./bundle"); // BundleBuilder implementation for DSSE wrapped attestations class DSSEBundleBuilder extends base_1.BaseBundleBuilder { + certificateChain; constructor(options) { super(options); this.certificateChain = options.certificateChain ?? false; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/config.js b/deps/npm/node_modules/@sigstore/sign/dist/config.js new file mode 100644 index 00000000000000..6ab10535beaef8 --- /dev/null +++ b/deps/npm/node_modules/@sigstore/sign/dist/config.js @@ -0,0 +1,143 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bundleBuilderFromSigningConfig = bundleBuilderFromSigningConfig; +/* +Copyright 2025 The Sigstore Authors. + +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. +*/ +const protobuf_specs_1 = require("@sigstore/protobuf-specs"); +const dsse_1 = require("./bundler/dsse"); +const message_1 = require("./bundler/message"); +const signer_1 = require("./signer"); +const witness_1 = require("./witness"); +const MAX_CA_API_VERSION = 1; +const MAX_TLOG_API_VERSION = 2; +const MAX_TSA_API_VERSION = 1; +const DEFAULT_TIMEOUT = 5000; +const DEFAULT_REKORV2_TIMEOUT = 20000; +const DEFAULT_RETRY = { retries: 2 }; +// Creates a BundleBuilder based on the provided SigningConfig +function bundleBuilderFromSigningConfig(options) { + const { signingConfig, identityProvider, bundleType } = options; + const fetchOptions = options.fetchOptions || { + timeout: DEFAULT_TIMEOUT, + retry: DEFAULT_RETRY, + }; + const signer = fulcioSignerFromConfig(signingConfig, identityProvider, fetchOptions); + const witnesses = witnessesFromConfig(signingConfig, fetchOptions); + switch (bundleType) { + case 'messageSignature': + return new message_1.MessageSignatureBundleBuilder({ signer, witnesses }); + case 'dsseEnvelope': + return new dsse_1.DSSEBundleBuilder({ signer, witnesses }); + } +} +function fulcioSignerFromConfig(signingConfig, identityProvider, fetchOptions) { + const service = certAuthorityService(signingConfig); + return new signer_1.FulcioSigner({ + fulcioBaseURL: service.url, + identityProvider: identityProvider, + timeout: fetchOptions.timeout, + retry: fetchOptions.retry, + }); +} +function witnessesFromConfig(signingConfig, fetchOptions) { + const witnesses = []; + if (signingConfig.rekorTlogConfig) { + if (signingConfig.rekorTlogConfig.selector !== protobuf_specs_1.ServiceSelector.ANY) { + throw new Error('Unsupported Rekor TLog selector in signing configuration'); + } + const tlog = tlogService(signingConfig); + witnesses.push(new witness_1.RekorWitness({ + rekorBaseURL: tlog.url, + majorApiVersion: tlog.majorApiVersion, + retry: fetchOptions.retry, + timeout: + // Ensure Rekor V2 has at least a 20 second timeout + tlog.majorApiVersion === 1 + ? fetchOptions.timeout + : Math.min(fetchOptions.timeout || + /* istanbul ignore next */ DEFAULT_TIMEOUT, DEFAULT_REKORV2_TIMEOUT), + })); + } + if (signingConfig.tsaConfig) { + if (signingConfig.tsaConfig.selector !== protobuf_specs_1.ServiceSelector.ANY) { + throw new Error('Unsupported TSA selector in signing configuration'); + } + const tsa = tsaService(signingConfig); + witnesses.push(new witness_1.TSAWitness({ + tsaBaseURL: tsa.url, + retry: fetchOptions.retry, + timeout: fetchOptions.timeout, + })); + } + return witnesses; +} +// Returns the first valid CA service from the signing configuration +function certAuthorityService(signingConfig) { + const compatibleCAs = filterServicesByMaxAPIVersion(signingConfig.caUrls, MAX_CA_API_VERSION); + const sortedCAs = sortServicesByStartDate(compatibleCAs); + if (sortedCAs.length === 0) { + throw new Error('No valid CA services found in signing configuration'); + } + return sortedCAs[0]; +} +// Returns the first valid TLog service from the signing configuration +function tlogService(signingConfig) { + const compatibleTLogs = filterServicesByMaxAPIVersion(signingConfig.rekorTlogUrls, MAX_TLOG_API_VERSION); + const sortedTLogs = sortServicesByStartDate(compatibleTLogs); + if (sortedTLogs.length === 0) { + throw new Error('No valid TLogs found in signing configuration'); + } + return sortedTLogs[0]; +} +// Returns the first valid TSA service from the signing configuration +function tsaService(signingConfig) { + const compatibleTSAs = filterServicesByMaxAPIVersion(signingConfig.tsaUrls, MAX_TSA_API_VERSION); + const sortedTSAs = sortServicesByStartDate(compatibleTSAs); + if (sortedTSAs.length === 0) { + throw new Error('No valid TSAs found in signing configuration'); + } + return sortedTSAs[0]; +} +// Returns the services sorted by start date (most recent first), filtering out +// any services that have an end date in the past +function sortServicesByStartDate(services) { + const now = new Date(); + // Filter out any services that have an end date in the past + const validServices = services.filter((service) => { + // If there's no end date, the service is still valid + if (!service.validFor?.end) { + return true; + } + // Keep services whose end date is in the future or present + return service.validFor.end >= now; + }); + return validServices.sort((a, b) => { + /* istanbul ignore next */ + const aStart = a.validFor?.start?.getTime() ?? 0; + /* istanbul ignore next */ + const bStart = b.validFor?.start?.getTime() ?? 0; + // Sort descending (most recent first) + return bStart - aStart; + }); +} +// Returns a filtered list of services whose major API version is less than or +// equal to the specified version +function filterServicesByMaxAPIVersion(services, apiVersion) { + // Filter out any services with a major API version greater than the specified version + return services.filter((service) => { + return service.majorApiVersion <= apiVersion; + }); +} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/error.js b/deps/npm/node_modules/@sigstore/sign/dist/error.js index d28f1913cc77e9..125522ac84b0e9 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/error.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/error.js @@ -19,6 +19,8 @@ exports.InternalError = void 0; exports.internalError = internalError; const error_1 = require("./external/error"); class InternalError extends Error { + code; + cause; constructor({ code, message, cause, }) { super(message); this.name = this.constructor.name; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/error.js b/deps/npm/node_modules/@sigstore/sign/dist/external/error.js index a6a65adebb1767..fd00afa835da49 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/error.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/error.js @@ -17,6 +17,8 @@ limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); exports.HTTPError = void 0; class HTTPError extends Error { + statusCode; + location; constructor({ status, message, location, }) { super(`(${status}) ${message}`); this.statusCode = status; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js b/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js index de6a1ad9f9e797..20904fc34e4549 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js @@ -21,6 +21,7 @@ const fetch_1 = require("./fetch"); * Fulcio API client. */ class Fulcio { + options; constructor(options) { this.options = options; } diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor-v2.js b/deps/npm/node_modules/@sigstore/sign/dist/external/rekor-v2.js new file mode 100644 index 00000000000000..c35cb99c8fac81 --- /dev/null +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/rekor-v2.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RekorV2 = void 0; +/* +Copyright 2025 The Sigstore Authors. + +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. +*/ +const fetch_1 = require("./fetch"); +const protobuf_specs_1 = require("@sigstore/protobuf-specs"); +const v2_1 = require("@sigstore/protobuf-specs/rekor/v2"); +/** + * Rekor API client. + */ +class RekorV2 { + options; + constructor(options) { + this.options = options; + } + async createEntry(proposedEntry) { + const { baseURL, timeout, retry } = this.options; + const url = `${baseURL}/api/v2/log/entries`; + const response = await (0, fetch_1.fetchWithRetry)(url, { + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: JSON.stringify(v2_1.CreateEntryRequest.toJSON(proposedEntry)), + timeout, + retry, + }); + return response.json().then((data) => protobuf_specs_1.TransparencyLogEntry.fromJSON(data)); + } +} +exports.RekorV2 = RekorV2; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js b/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js index bb59a126e032fb..1a990d5fcea416 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js @@ -21,6 +21,7 @@ const fetch_1 = require("./fetch"); * Rekor API client. */ class Rekor { + options; constructor(options) { this.options = options; } diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js b/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js index a948ba9cca2c72..a15dcc6f3c4f0f 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js @@ -18,12 +18,18 @@ limitations under the License. */ const fetch_1 = require("./fetch"); class TimestampAuthority { + options; constructor(options) { this.options = options; } async createTimestamp(request) { const { baseURL, timeout, retry } = this.options; - const url = `${baseURL}/api/v1/timestamp`; + // Account for the fact that the TSA URL may already include the full + // path if the client was initalized from a `SigningConfig` service entry + // (which always uses the full URL). + const url = new URL(baseURL).pathname === '/' + ? `${baseURL}/api/v1/timestamp` + : baseURL; const response = await (0, fetch_1.fetchWithRetry)(url, { headers: { 'Content-Type': 'application/json', diff --git a/deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js b/deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js index d79133952b605b..318ef01b68e3eb 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js @@ -28,6 +28,7 @@ const providers = [getGHAToken, getEnv]; * one that resolves. */ class CIContextProvider { + audience; /* istanbul ignore next */ constructor(audience = 'sigstore') { this.audience = audience; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/index.js b/deps/npm/node_modules/@sigstore/sign/dist/index.js index 383b76083361b9..02fae0589e5084 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/index.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/index.js @@ -1,9 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.TSAWitness = exports.RekorWitness = exports.DEFAULT_REKOR_URL = exports.FulcioSigner = exports.DEFAULT_FULCIO_URL = exports.CIContextProvider = exports.InternalError = exports.MessageSignatureBundleBuilder = exports.DSSEBundleBuilder = void 0; +exports.TSAWitness = exports.RekorWitness = exports.DEFAULT_REKOR_URL = exports.FulcioSigner = exports.DEFAULT_FULCIO_URL = exports.CIContextProvider = exports.InternalError = exports.bundleBuilderFromSigningConfig = exports.MessageSignatureBundleBuilder = exports.DSSEBundleBuilder = void 0; var bundler_1 = require("./bundler"); Object.defineProperty(exports, "DSSEBundleBuilder", { enumerable: true, get: function () { return bundler_1.DSSEBundleBuilder; } }); Object.defineProperty(exports, "MessageSignatureBundleBuilder", { enumerable: true, get: function () { return bundler_1.MessageSignatureBundleBuilder; } }); +var config_1 = require("./config"); +Object.defineProperty(exports, "bundleBuilderFromSigningConfig", { enumerable: true, get: function () { return config_1.bundleBuilderFromSigningConfig; } }); var error_1 = require("./error"); Object.defineProperty(exports, "InternalError", { enumerable: true, get: function () { return error_1.InternalError; } }); var identity_1 = require("./identity"); diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js index f01703cfab5645..5919631473436a 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js @@ -19,6 +19,7 @@ limitations under the License. const error_1 = require("../../error"); const fulcio_1 = require("../../external/fulcio"); class CAClient { + fulcio; constructor(options) { this.fulcio = new fulcio_1.Fulcio({ baseURL: options.fulcioBaseURL, diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js index 481aa5c3579a27..24b92d9f1f37bb 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js @@ -1,7 +1,4 @@ "use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", { value: true }); exports.EphemeralSigner = void 0; /* @@ -19,20 +16,21 @@ 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. */ -const crypto_1 = __importDefault(require("crypto")); +const crypto_1 = require("crypto"); const EC_KEYPAIR_TYPE = 'ec'; const P256_CURVE = 'P-256'; // Signer implementation which uses an ephemeral keypair to sign artifacts. // The private key lives only in memory and is tied to the lifetime of the // EphemeralSigner instance. class EphemeralSigner { + keypair; constructor() { - this.keypair = crypto_1.default.generateKeyPairSync(EC_KEYPAIR_TYPE, { + this.keypair = (0, crypto_1.generateKeyPairSync)(EC_KEYPAIR_TYPE, { namedCurve: P256_CURVE, }); } async sign(data) { - const signature = crypto_1.default.sign(null, data, this.keypair.privateKey); + const signature = (0, crypto_1.sign)('sha256', data, this.keypair.privateKey); const publicKey = this.keypair.publicKey .export({ format: 'pem', type: 'spki' }) .toString('ascii'); diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js index 89a432548d2b42..6df16a83af778d 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js @@ -26,6 +26,9 @@ exports.DEFAULT_FULCIO_URL = 'https://fulcio.sigstore.dev'; // Must be instantiated with an identity provider which can provide a JWT // which represents the identity to be bound to the signing certificate. class FulcioSigner { + ca; + identityProvider; + keyHolder; constructor(options) { this.ca = new ca_1.CAClient({ ...options, diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js index 22c895f2ca7edd..8d13c45124e0b8 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.TLogClient = void 0; +exports.TLogV2Client = exports.TLogClient = void 0; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,7 +19,10 @@ limitations under the License. const error_1 = require("../../error"); const error_2 = require("../../external/error"); const rekor_1 = require("../../external/rekor"); +const rekor_v2_1 = require("../../external/rekor-v2"); class TLogClient { + rekor; + fetchOnConflict; constructor(options) { this.fetchOnConflict = options.fetchOnConflict ?? false; this.rekor = new rekor_1.Rekor({ @@ -59,3 +62,31 @@ function entryExistsError(value) { value.statusCode === 409 && value.location !== undefined); } +class TLogV2Client { + rekor; + constructor(options) { + this.rekor = new rekor_v2_1.RekorV2({ + baseURL: options.rekorBaseURL, + retry: options.retry, + timeout: options.timeout, + }); + } + async createEntry(createEntryRequest) { + let entry; + try { + entry = await this.rekor.createEntry(createEntryRequest); + } + catch (err) { + (0, error_1.internalError)(err, 'TLOG_CREATE_ENTRY_ERROR', 'error creating tlog entry'); + } + if (entry.logId === undefined || entry.kindVersion === undefined) { + (0, error_1.internalError)(new Error('invalid tlog entry'), 'TLOG_CREATE_ENTRY_ERROR', 'error creating tlog entry'); + } + return { + ...entry, + logId: entry.logId, + kindVersion: entry.kindVersion, + }; + } +} +exports.TLogV2Client = TLogV2Client; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js index 69a3b477e54429..71f35325e3dad0 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js @@ -1,8 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toProposedEntry = toProposedEntry; +exports.toCreateEntryRequest = toCreateEntryRequest; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,6 +18,7 @@ See the License for the specific language governing permissions and limitations under the License. */ const bundle_1 = require("@sigstore/bundle"); +const protobuf_specs_1 = require("@sigstore/protobuf-specs"); const util_1 = require("../../util"); const SHA256_ALGORITHM = 'sha256'; function toProposedEntry(content, publicKey, @@ -138,3 +140,58 @@ function calculateDSSEHash(envelope, publicKey) { .digest(SHA256_ALGORITHM, util_1.json.canonicalize(dsse)) .toString('hex'); } +function toCreateEntryRequest(content, publicKey) { + switch (content.$case) { + case 'dsseEnvelope': + return toCreateEntryRequestDSSE(content.dsseEnvelope, publicKey); + case 'messageSignature': + return toCreateEntryRequestMessageSignature(content.messageSignature, publicKey); + } +} +function toCreateEntryRequestDSSE(envelope, publicKey) { + return { + spec: { + $case: 'dsseRequestV002', + dsseRequestV002: { + envelope: envelope, + verifiers: [ + { + // TODO: We need to add support of passing the key details in the + // signature bundle. For now we're hardcoding the key details here. + keyDetails: protobuf_specs_1.PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, + verifier: { + $case: 'x509Certificate', + x509Certificate: { + rawBytes: util_1.pem.toDER(publicKey), + }, + }, + }, + ], + }, + }, + }; +} +function toCreateEntryRequestMessageSignature(messageSignature, publicKey) { + return { + spec: { + $case: 'hashedRekordRequestV002', + hashedRekordRequestV002: { + digest: messageSignature.messageDigest.digest, + signature: { + content: messageSignature.signature, + verifier: { + // TODO: We need to add support of passing the key details in the + // signature bundle. For now we're hardcoding the key details here. + keyDetails: protobuf_specs_1.PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, + verifier: { + $case: 'x509Certificate', + x509Certificate: { + rawBytes: util_1.pem.toDER(publicKey), + }, + }, + }, + }, + }, + }, + }; +} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js index 6197b09d4cdd9a..5a2e71a1c29112 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.RekorWitness = exports.DEFAULT_REKOR_URL = void 0; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,17 +21,34 @@ const client_1 = require("./client"); const entry_1 = require("./entry"); exports.DEFAULT_REKOR_URL = 'https://rekor.sigstore.dev'; class RekorWitness { + tlogV1; + tlogV2; + entryType; + majorApiVersion; constructor(options) { this.entryType = options.entryType; - this.tlog = new client_1.TLogClient({ + this.majorApiVersion = options.majorApiVersion || 1; + this.tlogV1 = new client_1.TLogClient({ + ...options, + rekorBaseURL: options.rekorBaseURL || /* istanbul ignore next */ exports.DEFAULT_REKOR_URL, + }); + this.tlogV2 = new client_1.TLogV2Client({ ...options, rekorBaseURL: options.rekorBaseURL || /* istanbul ignore next */ exports.DEFAULT_REKOR_URL, }); } async testify(content, publicKey) { - const proposedEntry = (0, entry_1.toProposedEntry)(content, publicKey, this.entryType); - const entry = await this.tlog.createEntry(proposedEntry); - return toTransparencyLogEntry(entry); + let tlogEntry; + if (this.majorApiVersion === 2) { + const request = (0, entry_1.toCreateEntryRequest)(content, publicKey); + tlogEntry = await this.tlogV2.createEntry(request); + } + else { + const proposedEntry = (0, entry_1.toProposedEntry)(content, publicKey, this.entryType); + const entry = await this.tlogV1.createEntry(proposedEntry); + tlogEntry = toTransparencyLogEntry(entry); + } + return { tlogEntries: [tlogEntry] }; } } exports.RekorWitness = RekorWitness; @@ -60,9 +77,7 @@ function toTransparencyLogEntry(entry) { inclusionProof: proof, canonicalizedBody: Buffer.from(entry.body, 'base64'), }; - return { - tlogEntries: [tlogEntry], - }; + return tlogEntry; } function inclusionPromise(promise) { return { diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js index 754de3748dbb36..97bfb5b883e3a5 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js @@ -21,6 +21,7 @@ const tsa_1 = require("../../external/tsa"); const util_1 = require("../../util"); const SHA256_ALGORITHM = 'sha256'; class TSAClient { + tsa; constructor(options) { this.tsa = new tsa_1.TimestampAuthority({ baseURL: options.tsaBaseURL, diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js index d4f5c7c859d106..07a34b46cf113a 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js @@ -18,6 +18,7 @@ limitations under the License. */ const client_1 = require("./client"); class TSAWitness { + tsa; constructor(options) { this.tsa = new client_1.TSAClient({ tsaBaseURL: options.tsaBaseURL, diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE deleted file mode 100644 index 83837797202b70..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) GitHub, Inc. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js deleted file mode 100644 index 86d90861078dab..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js +++ /dev/null @@ -1,153 +0,0 @@ -const META = Symbol('proc-log.meta') -module.exports = { - META: META, - output: { - LEVELS: [ - 'standard', - 'error', - 'buffer', - 'flush', - ], - KEYS: { - standard: 'standard', - error: 'error', - buffer: 'buffer', - flush: 'flush', - }, - standard: function (...args) { - return process.emit('output', 'standard', ...args) - }, - error: function (...args) { - return process.emit('output', 'error', ...args) - }, - buffer: function (...args) { - return process.emit('output', 'buffer', ...args) - }, - flush: function (...args) { - return process.emit('output', 'flush', ...args) - }, - }, - log: { - LEVELS: [ - 'notice', - 'error', - 'warn', - 'info', - 'verbose', - 'http', - 'silly', - 'timing', - 'pause', - 'resume', - ], - KEYS: { - notice: 'notice', - error: 'error', - warn: 'warn', - info: 'info', - verbose: 'verbose', - http: 'http', - silly: 'silly', - timing: 'timing', - pause: 'pause', - resume: 'resume', - }, - error: function (...args) { - return process.emit('log', 'error', ...args) - }, - notice: function (...args) { - return process.emit('log', 'notice', ...args) - }, - warn: function (...args) { - return process.emit('log', 'warn', ...args) - }, - info: function (...args) { - return process.emit('log', 'info', ...args) - }, - verbose: function (...args) { - return process.emit('log', 'verbose', ...args) - }, - http: function (...args) { - return process.emit('log', 'http', ...args) - }, - silly: function (...args) { - return process.emit('log', 'silly', ...args) - }, - timing: function (...args) { - return process.emit('log', 'timing', ...args) - }, - pause: function () { - return process.emit('log', 'pause') - }, - resume: function () { - return process.emit('log', 'resume') - }, - }, - time: { - LEVELS: [ - 'start', - 'end', - ], - KEYS: { - start: 'start', - end: 'end', - }, - start: function (name, fn) { - process.emit('time', 'start', name) - function end () { - return process.emit('time', 'end', name) - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function (name) { - return process.emit('time', 'end', name) - }, - }, - input: { - LEVELS: [ - 'start', - 'end', - 'read', - ], - KEYS: { - start: 'start', - end: 'end', - read: 'read', - }, - start: function (fn) { - process.emit('input', 'start') - function end () { - return process.emit('input', 'end') - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function () { - return process.emit('input', 'end') - }, - read: function (...args) { - let resolve, reject - const promise = new Promise((_resolve, _reject) => { - resolve = _resolve - reject = _reject - }) - process.emit('input', 'read', resolve, reject, ...args) - return promise - }, - }, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json deleted file mode 100644 index 957209d3954e53..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "proc-log", - "version": "5.0.0", - "files": [ - "bin/", - "lib/" - ], - "main": "lib/index.js", - "description": "just emit 'log' events on the process object", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/proc-log.git" - }, - "author": "GitHub Inc.", - "license": "ISC", - "scripts": { - "test": "tap", - "snap": "tap", - "posttest": "npm run lint", - "postsnap": "eslint index.js test/*.js --fix", - "lint": "npm run eslint", - "postlint": "template-oss-check", - "lintfix": "npm run eslint -- --fix", - "template-oss-apply": "template-oss-apply --force", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" - }, - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", - "tap": "^16.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/package.json b/deps/npm/node_modules/@sigstore/sign/package.json index a24f8e87ff3494..0f844a8735a891 100644 --- a/deps/npm/node_modules/@sigstore/sign/package.json +++ b/deps/npm/node_modules/@sigstore/sign/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/sign", - "version": "4.0.1", + "version": "4.1.0", "description": "Sigstore signing library", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -34,10 +34,10 @@ }, "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" }, "engines": { diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/client.js b/deps/npm/node_modules/@sigstore/tuf/dist/client.js index 2931a0a6b3ab50..a170af40a0a28c 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/client.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/client.js @@ -23,9 +23,11 @@ const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const tuf_js_1 = require("tuf-js"); const _1 = require("."); +const package_json_1 = require("../package.json"); const target_1 = require("./target"); const TARGETS_DIR_NAME = 'targets'; class TUFClient { + updater; constructor(options) { const url = new URL(options.mirrorURL); const repoName = encodeURIComponent(url.host + url.pathname.replace(/\/$/, '')); @@ -101,6 +103,7 @@ function initClient(options) { const config = { fetchTimeout: options.timeout, fetchRetry: options.retry, + userAgent: `${encodeURIComponent(package_json_1.name)}/${package_json_1.version}`, }; return new tuf_js_1.Updater({ metadataBaseUrl: options.mirrorURL, diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/error.js b/deps/npm/node_modules/@sigstore/tuf/dist/error.js index e13971b289ff2e..fd1f7100166cfe 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/error.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/error.js @@ -2,6 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TUFError = void 0; class TUFError extends Error { + code; + cause; constructor({ code, message, cause, }) { super(message); this.code = code; diff --git a/deps/npm/node_modules/@sigstore/tuf/package.json b/deps/npm/node_modules/@sigstore/tuf/package.json index 42dad938c28084..a782796c45ed6c 100644 --- a/deps/npm/node_modules/@sigstore/tuf/package.json +++ b/deps/npm/node_modules/@sigstore/tuf/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/tuf", - "version": "4.0.0", + "version": "4.0.1", "description": "Client for the Sigstore TUF repository", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -28,12 +28,12 @@ }, "devDependencies": { "@sigstore/jest": "^0.0.0", - "@tufjs/repo-mock": "^3.0.1", + "@tufjs/repo-mock": "^4.0.0", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" + "tuf-js": "^4.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/@sigstore/tuf/seeds.json b/deps/npm/node_modules/@sigstore/tuf/seeds.json index 6d48f33afe7003..54cb71f29ef0cf 100644 --- a/deps/npm/node_modules/@sigstore/tuf/seeds.json +++ b/deps/npm/node_modules/@sigstore/tuf/seeds.json @@ -1 +1 @@ -{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiIgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGJiZGRkNDY0ZjgwNjZjZWI4OGJhNzg3Mzc1YzEyY2Q2MzMwNjgwZTA4YzI5MTA3MDNlNjUzOGM3MWNjNzlhZDIwMjIwNTE5MGIwNmU0NTM3ZmU5NjFiM2VmODFmZTY4ZWRjZDAwODljMTlmOTE5YWZlZDQyM2I5YWFmZDcwMDY0MTE1MyIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDQwMjIwNjkzMDZjZDUyNTdmNzMyYTc0MGMxYWZlNjBhOGU0MzNjNWRlNThlYWZlYWRiZTk5YzMzNmM5YzcxZDE5OGNmODAyMjAwZDc3Mzk1M2FlN2RiYzQ4ZDNlNWJhZDlhNmY2NGJhZmZmMTk2YjdlMmFkNGE1MmExOTUxOTM2N2Q0N2RjMDQyIgogIH0sCiAgewogICAia2V5aWQiOiAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICJzaWciOiAiMzA0NDAyMjA0ZDIxYTJlYzgwZGY2NmU2MWY2ZmUyOTEyOTUxZGM0N2RmODM2MDM2ZjhjMGFiMTA4MTZkMzc1ZTcxZGJmNzllMDIyMDU0N2FkY2UxYWZkZjA0ZTY3OTRlZmEyMDNkZDUyNjRjNmY3ZTBlZjc4ZTU3ZmU5MzRiMGQyNmNiOTk0ZWVjNzYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIiwKICAgInNpZyI6ICIzMDQ1MDIyMDYwODI2NDk2NTU3MTQ0ZWIxNjQ5ODkzZWQ1ZjZmNGVhNTQ1MzZmZWIwY2E4MmY4Yjg5YWU2NDFiZTM5NzQzZTUwMjIxMDBhZDcxMThiNWU5ZDQ4MzczMjYyMDZlNDEyZmM2ZGEyOTk5OTI1ZDExMDMyOGE3YzE2NmIwNmM2MjQzMzZjOTNmIgogIH0sCiAgewogICAia2V5aWQiOiAiMTgzZTY0ZjM3NjcwZGMxM2NhMGQyODk5NWEzMDUzZjM3NDA5NTRkZGNlNDQzMjFhNDFlNDY1MzRjZjQ0ZTYzMiIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGQ4MTc5NDM5YzJlNzNlYjBjMTczM2FiZWU3ZmFmODMyZGNhZWE3MjYzZWRjYjQ5MTk4OTFjM2EyNDdmMDU5MjMwMjIxMDBlMWE0MzdlMDc5N2U4MDNmOWI3MmRjOWQyZDkyMTU1YjBhMjI3MGMyNGVmZGQ1ZjRiM2E1ZDhmMGIwZjQzMWE3IgogIH0KIF0sCiAic2lnbmVkIjogewogICJfdHlwZSI6ICJyb290IiwKICAiY29uc2lzdGVudF9zbmFwc2hvdCI6IHRydWUsCiAgImV4cGlyZXMiOiAiMjAyNi0wMS0yMlQxMzowNTo1OVoiLAogICJrZXlzIjogewogICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1vbmxpbmUtdXJpIjogImdjcGttczpwcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wL2NyeXB0b0tleVZlcnNpb25zLzEiCiAgIH0sCiAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIjogewogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNeHBQT0pDSVo1b3RHNDEwNmZHSnNlRVFpM1Y5XG5wa01ZUTR1eVY5VGoxTTdXSFhJeUxHK2prZnZ1RzBnbFExSlpiUlpaQlYzZ0FSNHNvamRHSElTZW93PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGxhbmNlIgogICB9LAogICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAc2FudGlhZ290b3JyZXMiCiAgIH0sCiAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaW5pa1NzQVFtWWtOZUg1ZVlxL0NuSXpMYWFjT1xueGxTYWF3UURPd3FLeS90Q3F4cTV4eFBTSmMyMUs0V0loczlHeU9rS2Z6dWVZM0dJTHpjTUpaNGNXdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBib2JjYWxsYXdheSIKICAgfSwKICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZ2hyaDkyTHcxWXIzaWRHVjVXcUN0TURCOEN4XG4rRDhoZEM0dzJaTE5JcGxWUm9WR0xza1lhM2doZU15T2ppSjhrUGkxNWFRMi8vN1Arb2o3VXZKUEd3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGpvc2h1YWdsIgogICB9LAogICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAbW5tNjc4IgogICB9CiAgfSwKICAicm9sZXMiOiB7CiAgICJyb290IjogewogICAgImtleWlkcyI6IFsKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICAgIjE4M2U2NGYzNzY3MGRjMTNjYTBkMjg5OTVhMzA1M2YzNzQwOTU0ZGRjZTQ0MzIxYTQxZTQ2NTM0Y2Y0NGU2MzIiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInNuYXBzaG90IjogewogICAgImtleWlkcyI6IFsKICAgICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMSwKICAgICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMzY1MCwKICAgICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDM2NQogICB9LAogICAidGFyZ2V0cyI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiLAogICAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAzCiAgIH0sCiAgICJ0aW1lc3RhbXAiOiB7CiAgICAia2V5aWRzIjogWwogICAgICIwYzg3NDMyYzNiZjA5ZmQ5OTE4OWZkYzMyZmE1ZWFlZGY0ZTRhNWZhYzdiYWI3M2ZhMDRhMmUwZmM2NGFmNmY1IgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiA3LAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogNgogICB9CiAgfSwKICAic3BlY192ZXJzaW9uIjogIjEuMCIsCiAgInZlcnNpb24iOiAxMywKICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDE5NywKICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0NgogfQp9","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjdaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ3Tkk5YXRRR2x6K1ZXZk82TFJ5Z0g0UVVmWS84VzRSRndpVDVpNVdSZ0IwPSIKICAgICAgfQogICAgfQogIF0sCiAgImNlcnRpZmljYXRlQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCK0RDQ0FYNmdBd0lCQWdJVE5Wa0Rab0Npb2ZQRHN5N2RmbTZnZUxidWh6QUtCZ2dxaGtqT1BRUURBekFxTVJVd0V3WURWUVFLRXd4emFXZHpkRzl5WlM1a1pYWXhFVEFQQmdOVkJBTVRDSE5wWjNOMGIzSmxNQjRYRFRJeE1ETXdOekF6TWpBeU9Wb1hEVE14TURJeU16QXpNakF5T1Zvd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTFN5QTdJaTVrK3BOTzhaRVdZMHlsZW1XRG93T2tOYTNrTCtHWkU1WjVHV2VoTDkvQTliUk5BM1JicnNaNWkwSmNhc3RhUkw3U3A1ZnAvakQ1ZHhxYy9VZFRWbmx2UzE2YW4rMllmc3dlL1F1TG9sUlVDcmNPRTIrMmlBNSt0emQ2Tm1NR1F3RGdZRFZSMFBBUUgvQkFRREFnRUdNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3SFFZRFZSME9CQllFRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01COEdBMVVkSXdRWU1CYUFGTWpGSFFCQm1pUXBNbEVrNncydVN1MUtCdFBzTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUg4bGlXSmZNdWk2dlhYQmhqRGdZNE13c2xtTi9USnhWZS84M1dyRm9td21OZjA1NnkxWDQ4RjljNG0zYTNvelhBSXhBS2pSYXk1L2FqL2pzS0tHSWttUWF0akk4dXVwSHIvK0N4RnZhSldtcFlxTmtMREdSVSs5b3J6aDVoSTJScmN1YVE9PSIKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0sCiAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAic3RhcnQiOiAiMjAyMS0wMy0wN1QwMzoyMDoyOVoiLAogICAgICAgICJlbmQiOiAiMjAyMi0xMi0zMVQyMzo1OTo1OS45OTlaIgogICAgICB9CiAgICB9LAogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQ0dqQ0NBYUdnQXdJQkFnSVVBTG5WaVZmblUwYnJKYXNtUmtIcm4vVW5mYVF3Q2dZSUtvWkl6ajBFQXdNd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRBZUZ3MHlNakEwTVRNeU1EQTJNVFZhRncwek1URXdNRFV4TXpVMk5UaGFNRGN4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWVNQndHQTFVRUF4TVZjMmxuYzNSdmNtVXRhVzUwWlhKdFpXUnBZWFJsTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUU4UlZTL3lzSCtOT3Z1RFp5UEladGlsZ1VGOU5sYXJZcEFkOUhQMXZCQkgxVTVDVjc3TFNTN3MwWmlING5FN0h2N3B0UzZMdnZSL1NUazc5OExWZ016TGxKNEhlSWZGM3RIU2FleExjWXBTQVNyMWtTME4vUmdCSnovOWpXQ2lYbm8zc3dlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd013RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVTM5UHB6MVlrRVpiNXFOanBLRldpeGk0WVpEOHdId1lEVlIwakJCZ3dGb0FVV01BZVg1RkZwV2FwZXN5UW9aTWkwQ3JGeGZvd0NnWUlLb1pJemowRUF3TURad0F3WkFJd1BDc1FLNERZaVpZRFBJYURpNUhGS25meFh4NkFTU1ZtRVJmc3luWUJpWDJYNlNKUm5aVTg0LzlEWmRuRnZ2eG1BakJPdDZRcEJsYzRKLzBEeHZrVENxcGNsdnppTDZCQ0NQbmpkbElCM1B1M0J4c1BteWdVWTdJaTJ6YmRDZGxpaW93PSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCOXpDQ0FYeWdBd0lCQWdJVUFMWk5BUEZkeEhQd2plRGxvRHd5WUNoQU8vNHdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1URXdNRGN4TXpVMk5UbGFGdzB6TVRFd01EVXhNelUyTlRoYU1Db3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFUk1BOEdBMVVFQXhNSWMybG5jM1J2Y21Vd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVQ3WGVGVDRyYjNQUUd3UzRJYWp0TGszL09sbnBnYW5nYUJjbFlwc1lCcjVpKzR5bkIwN2NlYjNMUDBPSU9aZHhleFg2OWM1aVZ1eUpSUStIejA1eWkrVUYzdUJXQWxIcGlTNXNoMCtIMkdIRTdTWHJrMUVDNW0xVHIxOUw5Z2c5MmpZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJZd0I1ZmtVV2xacWw2ekpDaGt5TFFLc1hGK2pBZkJnTlZIU01FR0RBV2dCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajFuSGVYWnArMTNOV0JOYStFRHNEUDhHMVdXZzF0Q01XUC9XSFBxcGFWbzBqaHN3ZU5GWmdTczBlRTd3WUk0cUFqRUEyV0I5b3Q5OHNJa29GM3ZaWWRkMy9WdFdCNWI5VE5NZWE3SXgvc3RKNVRmY0xMZUFCTEU0Qk5KT3NRNHZuQkhKIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIyLTA0LTEzVDIwOjA2OjE1WiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDBaIiwKICAgICAgICAgICJlbmQiOiAiMjAyMi0xMC0zMVQyMzo1OTo1OS45OTlaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJDR0NTOENoUy8yaEYwZEZySjRTY1JXY1lyQlk5d3pqU2JlYThJZ1kyYjNJPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi8yMDIyIiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpUFNsRmkwQ21GVGZFakNVcUY5SHVDRWNZWE5LQWFZYWxJSm1CWjh5eWV6UGpUcWh4cktCcE1uYW9jVnRMSkJJMWVNM3VYblF6UUdBSmRKNGdzOUZ5dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjItMTAtMjBUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICIzVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280PSIKICAgICAgfQogICAgfQogIF0sCiAgInRpbWVzdGFtcEF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUtdHNhLXNlbGZzaWduZWQiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly90aW1lc3RhbXAuc2lnc3RvcmUuZGV2L2FwaS92MS90aW1lc3RhbXAiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDRURDQ0FaYWdBd0lCQWdJVU9oTlVMd3lRWWU2OHdVTXZ5NHFPaXlvaml3d3dDZ1lJS29aSXpqMEVBd013T1RFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNU0F3SGdZRFZRUURFeGR6YVdkemRHOXlaUzEwYzJFdGMyVnNabk5wWjI1bFpEQWVGdzB5TlRBME1EZ3dOalU1TkROYUZ3MHpOVEEwTURZd05qVTVORE5hTUM0eEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVWTUJNR0ExVUVBeE1NYzJsbmMzUnZjbVV0ZEhOaE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFNHJhMlo4aEtOaWcyVDlrRmpDQVRvR0czMGpreStXUXYzQnpMK21LdmgxU0tOUi9Vd3V3c2ZOQ2c0c3J5b1lBZDhFNmlzb3ZWQTNNNGFvTmRtOVFEaTUwWjhuVEV5dnFnZkRQdFRJd1hJdGZpVy9BRmYxVjd1d2tia0FvajB4eGNvMm93YURBT0JnTlZIUThCQWY4RUJBTUNCNEF3SFFZRFZSME9CQllFRkluOWVVT0h6OUJsUnNNQ1JzY3NjMXQ5dE9zRE1COEdBMVVkSXdRWU1CYUFGSmpzQWU5L3UxSC8xSlVlYjRxSW1GTUhpYzYvTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUlNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHRwc1YvNkthTzBxeUYvVU1zWDJhU1VYS1FGZG9HVHB0UUdjMGZ0cTFjc3VsSFBHRzZkc215TU5kM0pCK0czRVFJeEFPYWp2QmNqcEptS2I0TnYrMlRhb2o4VWM1K2I2aWg2RlhDQ0tyYVNxdXBlMDd6cXN3TWNYSlRlMWNFeHZIdnZsdz09IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVVjdmMEdMRE9vRXpJaDhMWFNXODBPSmlVcDE0d0NnWUlLb1pJemowRUF3TXdPVEVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1TQXdIZ1lEVlFRREV4ZHphV2R6ZEc5eVpTMTBjMkV0YzJWc1puTnBaMjVsWkRBZUZ3MHlOVEEwTURnd05qVTVORE5hRncwek5UQTBNRFl3TmpVNU5ETmFNRGt4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWdNQjRHQTFVRUF4TVhjMmxuYzNSdmNtVXRkSE5oTFhObGJHWnphV2R1WldRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFVUU50ZlJUL291M1lBVGE2d0Iva0tUZTcwY2ZKd3lSSUJvdk1udDhSY0pwaC9DT0U4MnV5UzZGbXBwTExMMVZCUEdjUGZwUVBZSk5Yeld3aThpY3doS1E2Vy9RZTJoM29lYkJiMkZIcHdOSkRxbytUTWFDL3RkZmt2L0VsSkI3MmpSVEJETUE0R0ExVWREd0VCL3dRRUF3SUJCakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUIwR0ExVWREZ1FXQkJTWTdBSHZmN3RSLzlTVkhtK0tpSmhUQjRuT3Z6QUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUF3R0VHcmZHWlIxY2VuMVI4L0RUVk1JOTQzTHNzWm1KUnREcC9pN1NmR0htR1JQNmdSYnVqOXZPSzNiNjdaMFFRQWpFQXVUMkg2NzNMUUVhSFRjeVFTWnJrcDRtWDdXd2ttRitzVmJrWVk1bVhOK1JNSDEzS1VFSEhPcUFTYWVtWVdLL0UiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjUtMDctMDRUMDA6MDA6MDBaIgogICAgICB9CiAgICB9CiAgXQp9Cg==","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} +{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiIgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGJiZGRkNDY0ZjgwNjZjZWI4OGJhNzg3Mzc1YzEyY2Q2MzMwNjgwZTA4YzI5MTA3MDNlNjUzOGM3MWNjNzlhZDIwMjIwNTE5MGIwNmU0NTM3ZmU5NjFiM2VmODFmZTY4ZWRjZDAwODljMTlmOTE5YWZlZDQyM2I5YWFmZDcwMDY0MTE1MyIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDQwMjIwNjkzMDZjZDUyNTdmNzMyYTc0MGMxYWZlNjBhOGU0MzNjNWRlNThlYWZlYWRiZTk5YzMzNmM5YzcxZDE5OGNmODAyMjAwZDc3Mzk1M2FlN2RiYzQ4ZDNlNWJhZDlhNmY2NGJhZmZmMTk2YjdlMmFkNGE1MmExOTUxOTM2N2Q0N2RjMDQyIgogIH0sCiAgewogICAia2V5aWQiOiAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICJzaWciOiAiMzA0NDAyMjA0ZDIxYTJlYzgwZGY2NmU2MWY2ZmUyOTEyOTUxZGM0N2RmODM2MDM2ZjhjMGFiMTA4MTZkMzc1ZTcxZGJmNzllMDIyMDU0N2FkY2UxYWZkZjA0ZTY3OTRlZmEyMDNkZDUyNjRjNmY3ZTBlZjc4ZTU3ZmU5MzRiMGQyNmNiOTk0ZWVjNzYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIiwKICAgInNpZyI6ICIzMDQ1MDIyMDYwODI2NDk2NTU3MTQ0ZWIxNjQ5ODkzZWQ1ZjZmNGVhNTQ1MzZmZWIwY2E4MmY4Yjg5YWU2NDFiZTM5NzQzZTUwMjIxMDBhZDcxMThiNWU5ZDQ4MzczMjYyMDZlNDEyZmM2ZGEyOTk5OTI1ZDExMDMyOGE3YzE2NmIwNmM2MjQzMzZjOTNmIgogIH0sCiAgewogICAia2V5aWQiOiAiMTgzZTY0ZjM3NjcwZGMxM2NhMGQyODk5NWEzMDUzZjM3NDA5NTRkZGNlNDQzMjFhNDFlNDY1MzRjZjQ0ZTYzMiIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGQ4MTc5NDM5YzJlNzNlYjBjMTczM2FiZWU3ZmFmODMyZGNhZWE3MjYzZWRjYjQ5MTk4OTFjM2EyNDdmMDU5MjMwMjIxMDBlMWE0MzdlMDc5N2U4MDNmOWI3MmRjOWQyZDkyMTU1YjBhMjI3MGMyNGVmZGQ1ZjRiM2E1ZDhmMGIwZjQzMWE3IgogIH0KIF0sCiAic2lnbmVkIjogewogICJfdHlwZSI6ICJyb290IiwKICAiY29uc2lzdGVudF9zbmFwc2hvdCI6IHRydWUsCiAgImV4cGlyZXMiOiAiMjAyNi0wMS0yMlQxMzowNTo1OVoiLAogICJrZXlzIjogewogICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1vbmxpbmUtdXJpIjogImdjcGttczpwcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wL2NyeXB0b0tleVZlcnNpb25zLzEiCiAgIH0sCiAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIjogewogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNeHBQT0pDSVo1b3RHNDEwNmZHSnNlRVFpM1Y5XG5wa01ZUTR1eVY5VGoxTTdXSFhJeUxHK2prZnZ1RzBnbFExSlpiUlpaQlYzZ0FSNHNvamRHSElTZW93PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGxhbmNlIgogICB9LAogICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAc2FudGlhZ290b3JyZXMiCiAgIH0sCiAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaW5pa1NzQVFtWWtOZUg1ZVlxL0NuSXpMYWFjT1xueGxTYWF3UURPd3FLeS90Q3F4cTV4eFBTSmMyMUs0V0loczlHeU9rS2Z6dWVZM0dJTHpjTUpaNGNXdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBib2JjYWxsYXdheSIKICAgfSwKICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZ2hyaDkyTHcxWXIzaWRHVjVXcUN0TURCOEN4XG4rRDhoZEM0dzJaTE5JcGxWUm9WR0xza1lhM2doZU15T2ppSjhrUGkxNWFRMi8vN1Arb2o3VXZKUEd3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGpvc2h1YWdsIgogICB9LAogICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAbW5tNjc4IgogICB9CiAgfSwKICAicm9sZXMiOiB7CiAgICJyb290IjogewogICAgImtleWlkcyI6IFsKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICAgIjE4M2U2NGYzNzY3MGRjMTNjYTBkMjg5OTVhMzA1M2YzNzQwOTU0ZGRjZTQ0MzIxYTQxZTQ2NTM0Y2Y0NGU2MzIiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInNuYXBzaG90IjogewogICAgImtleWlkcyI6IFsKICAgICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMSwKICAgICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMzY1MCwKICAgICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDM2NQogICB9LAogICAidGFyZ2V0cyI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiLAogICAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAzCiAgIH0sCiAgICJ0aW1lc3RhbXAiOiB7CiAgICAia2V5aWRzIjogWwogICAgICIwYzg3NDMyYzNiZjA5ZmQ5OTE4OWZkYzMyZmE1ZWFlZGY0ZTRhNWZhYzdiYWI3M2ZhMDRhMmUwZmM2NGFmNmY1IgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiA3LAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogNgogICB9CiAgfSwKICAic3BlY192ZXJzaW9uIjogIjEuMCIsCiAgInZlcnNpb24iOiAxMywKICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDE5NywKICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0NgogfQp9","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjdaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ3Tkk5YXRRR2x6K1ZXZk82TFJ5Z0g0UVVmWS84VzRSRndpVDVpNVdSZ0IwPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9sb2cyMDI1LTEucmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNQ293QlFZREsyVndBeUVBdDhybHAxa25Hd2pmYmNYQVlQWUFrbjBYaUx6MXg4TzR0MFlrRWhpZTI0ND0iLAogICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUQyNTUxOSIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjUtMDktMjNUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ6eEdaRlZ2ZDBGRW1qUjhXckZ3TWRjQUo5dnRhWS9RWGY0NFkxd1VlUDZBPSIKICAgICAgfQogICAgfQogIF0sCiAgImNlcnRpZmljYXRlQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCK0RDQ0FYNmdBd0lCQWdJVE5Wa0Rab0Npb2ZQRHN5N2RmbTZnZUxidWh6QUtCZ2dxaGtqT1BRUURBekFxTVJVd0V3WURWUVFLRXd4emFXZHpkRzl5WlM1a1pYWXhFVEFQQmdOVkJBTVRDSE5wWjNOMGIzSmxNQjRYRFRJeE1ETXdOekF6TWpBeU9Wb1hEVE14TURJeU16QXpNakF5T1Zvd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTFN5QTdJaTVrK3BOTzhaRVdZMHlsZW1XRG93T2tOYTNrTCtHWkU1WjVHV2VoTDkvQTliUk5BM1JicnNaNWkwSmNhc3RhUkw3U3A1ZnAvakQ1ZHhxYy9VZFRWbmx2UzE2YW4rMllmc3dlL1F1TG9sUlVDcmNPRTIrMmlBNSt0emQ2Tm1NR1F3RGdZRFZSMFBBUUgvQkFRREFnRUdNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3SFFZRFZSME9CQllFRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01COEdBMVVkSXdRWU1CYUFGTWpGSFFCQm1pUXBNbEVrNncydVN1MUtCdFBzTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUg4bGlXSmZNdWk2dlhYQmhqRGdZNE13c2xtTi9USnhWZS84M1dyRm9td21OZjA1NnkxWDQ4RjljNG0zYTNvelhBSXhBS2pSYXk1L2FqL2pzS0tHSWttUWF0akk4dXVwSHIvK0N4RnZhSldtcFlxTmtMREdSVSs5b3J6aDVoSTJScmN1YVE9PSIKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0sCiAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAic3RhcnQiOiAiMjAyMS0wMy0wN1QwMzoyMDoyOVoiLAogICAgICAgICJlbmQiOiAiMjAyMi0xMi0zMVQyMzo1OTo1OS45OTlaIgogICAgICB9CiAgICB9LAogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQ0dqQ0NBYUdnQXdJQkFnSVVBTG5WaVZmblUwYnJKYXNtUmtIcm4vVW5mYVF3Q2dZSUtvWkl6ajBFQXdNd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRBZUZ3MHlNakEwTVRNeU1EQTJNVFZhRncwek1URXdNRFV4TXpVMk5UaGFNRGN4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWVNQndHQTFVRUF4TVZjMmxuYzNSdmNtVXRhVzUwWlhKdFpXUnBZWFJsTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUU4UlZTL3lzSCtOT3Z1RFp5UEladGlsZ1VGOU5sYXJZcEFkOUhQMXZCQkgxVTVDVjc3TFNTN3MwWmlING5FN0h2N3B0UzZMdnZSL1NUazc5OExWZ016TGxKNEhlSWZGM3RIU2FleExjWXBTQVNyMWtTME4vUmdCSnovOWpXQ2lYbm8zc3dlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd013RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVTM5UHB6MVlrRVpiNXFOanBLRldpeGk0WVpEOHdId1lEVlIwakJCZ3dGb0FVV01BZVg1RkZwV2FwZXN5UW9aTWkwQ3JGeGZvd0NnWUlLb1pJemowRUF3TURad0F3WkFJd1BDc1FLNERZaVpZRFBJYURpNUhGS25meFh4NkFTU1ZtRVJmc3luWUJpWDJYNlNKUm5aVTg0LzlEWmRuRnZ2eG1BakJPdDZRcEJsYzRKLzBEeHZrVENxcGNsdnppTDZCQ0NQbmpkbElCM1B1M0J4c1BteWdVWTdJaTJ6YmRDZGxpaW93PSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCOXpDQ0FYeWdBd0lCQWdJVUFMWk5BUEZkeEhQd2plRGxvRHd5WUNoQU8vNHdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1URXdNRGN4TXpVMk5UbGFGdzB6TVRFd01EVXhNelUyTlRoYU1Db3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFUk1BOEdBMVVFQXhNSWMybG5jM1J2Y21Vd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVQ3WGVGVDRyYjNQUUd3UzRJYWp0TGszL09sbnBnYW5nYUJjbFlwc1lCcjVpKzR5bkIwN2NlYjNMUDBPSU9aZHhleFg2OWM1aVZ1eUpSUStIejA1eWkrVUYzdUJXQWxIcGlTNXNoMCtIMkdIRTdTWHJrMUVDNW0xVHIxOUw5Z2c5MmpZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJZd0I1ZmtVV2xacWw2ekpDaGt5TFFLc1hGK2pBZkJnTlZIU01FR0RBV2dCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajFuSGVYWnArMTNOV0JOYStFRHNEUDhHMVdXZzF0Q01XUC9XSFBxcGFWbzBqaHN3ZU5GWmdTczBlRTd3WUk0cUFqRUEyV0I5b3Q5OHNJa29GM3ZaWWRkMy9WdFdCNWI5VE5NZWE3SXgvc3RKNVRmY0xMZUFCTEU0Qk5KT3NRNHZuQkhKIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIyLTA0LTEzVDIwOjA2OjE1WiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDBaIiwKICAgICAgICAgICJlbmQiOiAiMjAyMi0xMC0zMVQyMzo1OTo1OS45OTlaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJDR0NTOENoUy8yaEYwZEZySjRTY1JXY1lyQlk5d3pqU2JlYThJZ1kyYjNJPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi8yMDIyIiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpUFNsRmkwQ21GVGZFakNVcUY5SHVDRWNZWE5LQWFZYWxJSm1CWjh5eWV6UGpUcWh4cktCcE1uYW9jVnRMSkJJMWVNM3VYblF6UUdBSmRKNGdzOUZ5dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjItMTAtMjBUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICIzVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280PSIKICAgICAgfQogICAgfQogIF0sCiAgInRpbWVzdGFtcEF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUtdHNhLXNlbGZzaWduZWQiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly90aW1lc3RhbXAuc2lnc3RvcmUuZGV2L2FwaS92MS90aW1lc3RhbXAiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDRURDQ0FaYWdBd0lCQWdJVU9oTlVMd3lRWWU2OHdVTXZ5NHFPaXlvaml3d3dDZ1lJS29aSXpqMEVBd013T1RFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNU0F3SGdZRFZRUURFeGR6YVdkemRHOXlaUzEwYzJFdGMyVnNabk5wWjI1bFpEQWVGdzB5TlRBME1EZ3dOalU1TkROYUZ3MHpOVEEwTURZd05qVTVORE5hTUM0eEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVWTUJNR0ExVUVBeE1NYzJsbmMzUnZjbVV0ZEhOaE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFNHJhMlo4aEtOaWcyVDlrRmpDQVRvR0czMGpreStXUXYzQnpMK21LdmgxU0tOUi9Vd3V3c2ZOQ2c0c3J5b1lBZDhFNmlzb3ZWQTNNNGFvTmRtOVFEaTUwWjhuVEV5dnFnZkRQdFRJd1hJdGZpVy9BRmYxVjd1d2tia0FvajB4eGNvMm93YURBT0JnTlZIUThCQWY4RUJBTUNCNEF3SFFZRFZSME9CQllFRkluOWVVT0h6OUJsUnNNQ1JzY3NjMXQ5dE9zRE1COEdBMVVkSXdRWU1CYUFGSmpzQWU5L3UxSC8xSlVlYjRxSW1GTUhpYzYvTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUlNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHRwc1YvNkthTzBxeUYvVU1zWDJhU1VYS1FGZG9HVHB0UUdjMGZ0cTFjc3VsSFBHRzZkc215TU5kM0pCK0czRVFJeEFPYWp2QmNqcEptS2I0TnYrMlRhb2o4VWM1K2I2aWg2RlhDQ0tyYVNxdXBlMDd6cXN3TWNYSlRlMWNFeHZIdnZsdz09IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVVjdmMEdMRE9vRXpJaDhMWFNXODBPSmlVcDE0d0NnWUlLb1pJemowRUF3TXdPVEVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1TQXdIZ1lEVlFRREV4ZHphV2R6ZEc5eVpTMTBjMkV0YzJWc1puTnBaMjVsWkRBZUZ3MHlOVEEwTURnd05qVTVORE5hRncwek5UQTBNRFl3TmpVNU5ETmFNRGt4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWdNQjRHQTFVRUF4TVhjMmxuYzNSdmNtVXRkSE5oTFhObGJHWnphV2R1WldRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFVUU50ZlJUL291M1lBVGE2d0Iva0tUZTcwY2ZKd3lSSUJvdk1udDhSY0pwaC9DT0U4MnV5UzZGbXBwTExMMVZCUEdjUGZwUVBZSk5Yeld3aThpY3doS1E2Vy9RZTJoM29lYkJiMkZIcHdOSkRxbytUTWFDL3RkZmt2L0VsSkI3MmpSVEJETUE0R0ExVWREd0VCL3dRRUF3SUJCakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUIwR0ExVWREZ1FXQkJTWTdBSHZmN3RSLzlTVkhtK0tpSmhUQjRuT3Z6QUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUF3R0VHcmZHWlIxY2VuMVI4L0RUVk1JOTQzTHNzWm1KUnREcC9pN1NmR0htR1JQNmdSYnVqOXZPSzNiNjdaMFFRQWpFQXVUMkg2NzNMUUVhSFRjeVFTWnJrcDRtWDdXd2ttRitzVmJrWVk1bVhOK1JNSDEzS1VFSEhPcUFTYWVtWVdLL0UiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjUtMDctMDRUMDA6MDA6MDBaIgogICAgICB9CiAgICB9CiAgXQp9Cg==","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js index 1033fc422aba09..7ee255401b1775 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js @@ -18,6 +18,7 @@ limitations under the License. */ const core_1 = require("@sigstore/core"); class DSSESignatureContent { + env; constructor(env) { this.env = env; } diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js index 4287d8032b75f0..cba2a65704c957 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js @@ -9,15 +9,17 @@ function toSignedEntity(bundle, artifact) { const { tlogEntries, timestampVerificationData } = bundle.verificationMaterial; const timestamps = []; for (const entry of tlogEntries) { - timestamps.push({ - $case: 'transparency-log', - tlogEntry: entry, - }); + if (entry.integratedTime && entry.integratedTime !== '0') { + timestamps.push({ + $case: 'transparency-log', + tlogEntry: entry, + }); + } } for (const ts of timestampVerificationData?.rfc3161Timestamps ?? []) { timestamps.push({ $case: 'timestamp-authority', - timestamp: core_1.RFC3161Timestamp.parse(ts.signedTimestamp), + timestamp: core_1.RFC3161Timestamp.parse(Buffer.from(ts.signedTimestamp)), }); } return { @@ -45,13 +47,13 @@ function key(bundle) { case 'x509CertificateChain': return { $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.x509CertificateChain - .certificates[0].rawBytes), + certificate: core_1.X509Certificate.parse(Buffer.from(bundle.verificationMaterial.content.x509CertificateChain + .certificates[0].rawBytes)), }; case 'certificate': return { $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.certificate.rawBytes), + certificate: core_1.X509Certificate.parse(Buffer.from(bundle.verificationMaterial.content.certificate.rawBytes)), }; } } diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js index 836148c68a8b66..13cb5c27a02ac8 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js @@ -17,11 +17,29 @@ See the License for the specific language governing permissions and limitations under the License. */ const core_1 = require("@sigstore/core"); +const protobuf_specs_1 = require("@sigstore/protobuf-specs"); +// Map from the Sigstore protobuf HashAlgorithm enum to +// the string values used by the Node.js crypto module. +const HASH_ALGORITHM_MAP = { + [protobuf_specs_1.HashAlgorithm.HASH_ALGORITHM_UNSPECIFIED]: 'sha256', + [protobuf_specs_1.HashAlgorithm.SHA2_256]: 'sha256', + [protobuf_specs_1.HashAlgorithm.SHA2_384]: 'sha384', + [protobuf_specs_1.HashAlgorithm.SHA2_512]: 'sha512', + [protobuf_specs_1.HashAlgorithm.SHA3_256]: 'sha3-256', + [protobuf_specs_1.HashAlgorithm.SHA3_384]: 'sha3-384', +}; class MessageSignatureContent { + signature; + messageDigest; + artifact; + hashAlgorithm; constructor(messageSignature, artifact) { this.signature = messageSignature.signature; this.messageDigest = messageSignature.messageDigest.digest; this.artifact = artifact; + this.hashAlgorithm = + HASH_ALGORITHM_MAP[messageSignature.messageDigest.algorithm] ?? + /* istanbul ignore next */ 'sha256'; } compareSignature(signature) { return core_1.crypto.bufferEqual(signature, this.signature); @@ -30,7 +48,7 @@ class MessageSignatureContent { return core_1.crypto.bufferEqual(digest, this.messageDigest); } verifySignature(key) { - return core_1.crypto.verify(this.artifact, key, this.signature); + return core_1.crypto.verify(this.artifact, key, this.signature, this.hashAlgorithm); } } exports.MessageSignatureContent = MessageSignatureContent; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/error.js b/deps/npm/node_modules/@sigstore/verify/dist/error.js index 6cb1cd41213435..e6d72c23356183 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/error.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/error.js @@ -17,6 +17,8 @@ See the License for the specific language governing permissions and limitations under the License. */ class BaseError extends Error { + code; + cause; /* eslint-disable-line @typescript-eslint/no-explicit-any */ constructor({ code, message, cause, }) { super(message); this.code = code; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js b/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js index 35ad947f0bafc6..a5611c6824bdad 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js @@ -32,6 +32,10 @@ function verifyCertificateChain(timestamp, leaf, certificateAuthorities) { }); } class CertificateChainVerifier { + untrustedCert; + trustedCerts; + localCerts; + timestamp; constructor(opts) { this.untrustedCert = opts.untrustedCert; this.trustedCerts = opts.trustedCerts; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js index 56e948de19338d..03a51083e10827 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js @@ -1,13 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTSATimestamp = verifyTSATimestamp; -exports.verifyTLogTimestamp = verifyTLogTimestamp; -const error_1 = require("../error"); -const checkpoint_1 = require("./checkpoint"); -const merkle_1 = require("./merkle"); -const set_1 = require("./set"); +exports.getTSATimestamp = getTSATimestamp; +exports.getTLogTimestamp = getTLogTimestamp; const tsa_1 = require("./tsa"); -function verifyTSATimestamp(timestamp, data, timestampAuthorities) { +function getTSATimestamp(timestamp, data, timestampAuthorities) { (0, tsa_1.verifyRFC3161Timestamp)(timestamp, data, timestampAuthorities); return { type: 'timestamp-authority', @@ -15,32 +11,10 @@ function verifyTSATimestamp(timestamp, data, timestampAuthorities) { timestamp: timestamp.signingTime, }; } -function verifyTLogTimestamp(entry, tlogAuthorities) { - let inclusionVerified = false; - if (isTLogEntryWithInclusionPromise(entry)) { - (0, set_1.verifyTLogSET)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (isTLogEntryWithInclusionProof(entry)) { - (0, merkle_1.verifyMerkleInclusion)(entry); - (0, checkpoint_1.verifyCheckpoint)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (!inclusionVerified) { - throw new error_1.VerificationError({ - code: 'TLOG_MISSING_INCLUSION_ERROR', - message: 'inclusion could not be verified', - }); - } +function getTLogTimestamp(entry) { return { type: 'transparency-log', logID: entry.logId.keyId, timestamp: new Date(Number(entry.integratedTime) * 1000), }; } -function isTLogEntryWithInclusionPromise(entry) { - return entry.inclusionPromise !== undefined; -} -function isTLogEntryWithInclusionProof(entry) { - return entry.inclusionProof !== undefined; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/checkpoint.js similarity index 88% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js rename to deps/npm/node_modules/@sigstore/verify/dist/tlog/checkpoint.js index 46619b675f8863..220c5639b4c389 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/tlog/checkpoint.js @@ -1,8 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.LogCheckpoint = void 0; exports.verifyCheckpoint = verifyCheckpoint; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,7 +19,6 @@ limitations under the License. */ const core_1 = require("@sigstore/core"); const error_1 = require("../error"); -const trust_1 = require("../trust"); // Separator between the note and the signatures in a checkpoint const CHECKPOINT_SEPARATOR = '\n\n'; // Checkpoint signatures are of the following form: @@ -37,29 +37,17 @@ const SIGNATURE_REGEX = /\u2014 (\S+) (\S+)\n/g; // inclusion proof // See: https://github.com/transparency-dev/formats/blob/main/log/README.md function verifyCheckpoint(entry, tlogs) { - // Filter tlog instances to just those which were valid at the time of the - // entry - const validTLogs = (0, trust_1.filterTLogAuthorities)(tlogs, { - targetDate: new Date(Number(entry.integratedTime) * 1000), - }); const inclusionProof = entry.inclusionProof; const signedNote = SignedNote.fromString(inclusionProof.checkpoint.envelope); const checkpoint = LogCheckpoint.fromString(signedNote.note); // Verify that the signatures in the checkpoint are all valid - if (!verifySignedNote(signedNote, validTLogs)) { + if (!verifySignedNote(signedNote, tlogs)) { throw new error_1.VerificationError({ code: 'TLOG_INCLUSION_PROOF_ERROR', message: 'invalid checkpoint signature', }); } - // Verify that the root hash from the checkpoint matches the root hash in the - // inclusion proof - if (!core_1.crypto.bufferEqual(checkpoint.logHash, inclusionProof.rootHash)) { - throw new error_1.VerificationError({ - code: 'TLOG_INCLUSION_PROOF_ERROR', - message: 'root hash mismatch', - }); - } + return checkpoint; } // Verifies the signatures in the SignedNote. For each signature, the // corresponding transparency log is looked up by the key hint and the @@ -67,9 +55,11 @@ function verifyCheckpoint(entry, tlogs) { // Throws an error if any of the signatures are invalid. function verifySignedNote(signedNote, tlogs) { const data = Buffer.from(signedNote.note, 'utf-8'); - return signedNote.signatures.every((signature) => { + return signedNote.signatures.some((signature) => { // Find the transparency log instance with the matching key hint - const tlog = tlogs.find((tlog) => core_1.crypto.bufferEqual(tlog.logID.subarray(0, 4), signature.keyHint)); + const tlog = tlogs.find((tlog) => core_1.crypto.bufferEqual(tlog.logID.subarray(0, 4), signature.keyHint) && + tlog.baseURL.match(signature.name) // Match the name to the base URL of the tlog + ); if (!tlog) { return false; } @@ -80,6 +70,8 @@ function verifySignedNote(signedNote, tlogs) { // of a body (or note) and one more signatures calculated over the body. See // https://github.com/transparency-dev/formats/blob/main/log/README.md#signed-envelope class SignedNote { + note; + signatures; constructor(note, signatures) { this.note = note; this.signatures = signatures; @@ -134,6 +126,10 @@ class SignedNote { // See: // https://github.com/transparency-dev/formats/blob/main/log/README.md#checkpoint-body class LogCheckpoint { + origin; + logSize; + logHash; + rest; constructor(origin, logSize, logHash, rest) { this.origin = origin; this.logSize = logSize; @@ -155,3 +151,4 @@ class LogCheckpoint { return new LogCheckpoint(origin, logSize, rootHash, rest); } } +exports.LogCheckpoint = LogCheckpoint; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js index d71ed8c6e7ad9a..e438459dac80d6 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js @@ -1,8 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.DSSE_API_VERSION_V1 = void 0; exports.verifyDSSETLogBody = verifyDSSETLogBody; +exports.verifyDSSETLogBodyV2 = verifyDSSETLogBodyV2; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,10 +19,11 @@ See the License for the specific language governing permissions and limitations under the License. */ const error_1 = require("../error"); -// Compare the given intoto tlog entry to the given bundle +exports.DSSE_API_VERSION_V1 = '0.0.1'; +// Compare the given dsse tlog entry to the given bundle function verifyDSSETLogBody(tlogEntry, content) { switch (tlogEntry.apiVersion) { - case '0.0.1': + case exports.DSSE_API_VERSION_V1: return verifyDSSE001TLogBody(tlogEntry, content); default: throw new error_1.VerificationError({ @@ -29,6 +32,26 @@ function verifyDSSETLogBody(tlogEntry, content) { }); } } +// Compare the given dsse tlog entry to the given bundle. This function is +// specifically for Rekor V2 entries. +function verifyDSSETLogBodyV2(tlogEntry, content) { + const spec = tlogEntry.spec?.spec; + if (!spec) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `missing dsse spec`, + }); + } + switch (spec.$case) { + case 'dsseV002': + return verifyDSSE002TLogBody(spec.dsseV002, content); + default: + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `unsupported version: ${spec.$case}`, + }); + } +} // Compare the given dsse v0.0.1 tlog entry to the given DSSE envelope. function verifyDSSE001TLogBody(tlogEntry, content) { // Ensure the bundle's DSSE only contains a single signature @@ -55,3 +78,29 @@ function verifyDSSE001TLogBody(tlogEntry, content) { }); } } +// Compare the given dsse v0.0.2 tlog entry to the given DSSE envelope. +function verifyDSSE002TLogBody(spec, content) { + // Ensure the bundle's DSSE only contains a single signature + if (spec.signatures?.length !== 1) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'signature count mismatch', + }); + } + const tlogSig = spec.signatures[0].content; + // Ensure that the signature in the bundle's DSSE matches tlog entry + if (!content.compareSignature(tlogSig)) + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'tlog entry signature mismatch', + }); + // Ensure the digest of the bundle's DSSE payload matches the digest in the + // tlog entry + const tlogHash = spec.payloadHash?.digest || Buffer.from(''); + if (!content.compareDigest(tlogHash)) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'DSSE payload hash mismatch', + }); + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js index c4aa345b57ba7a..97dfcc9edc305a 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js @@ -1,8 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.HASHEDREKORD_API_VERSION_V1 = void 0; exports.verifyHashedRekordTLogBody = verifyHashedRekordTLogBody; +exports.verifyHashedRekordTLogBodyV2 = verifyHashedRekordTLogBodyV2; /* -Copyright 2023 The Sigstore Authors. +Copyright 2025 The Sigstore Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,10 +19,11 @@ See the License for the specific language governing permissions and limitations under the License. */ const error_1 = require("../error"); +exports.HASHEDREKORD_API_VERSION_V1 = '0.0.1'; // Compare the given hashedrekord tlog entry to the given bundle function verifyHashedRekordTLogBody(tlogEntry, content) { switch (tlogEntry.apiVersion) { - case '0.0.1': + case exports.HASHEDREKORD_API_VERSION_V1: return verifyHashedrekord001TLogBody(tlogEntry, content); default: throw new error_1.VerificationError({ @@ -29,6 +32,26 @@ function verifyHashedRekordTLogBody(tlogEntry, content) { }); } } +// Compare the given hashedrekor tlog entry to the given bundle. This function is +// specifically for Rekor V2 entries. +function verifyHashedRekordTLogBodyV2(tlogEntry, content) { + const spec = tlogEntry.spec?.spec; + if (!spec) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `missing dsse spec`, + }); + } + switch (spec.$case) { + case 'hashedRekordV002': + return verifyHashedrekord002TLogBody(spec.hashedRekordV002, content); + default: + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `unsupported version: ${spec.$case}`, + }); + } +} // Compare the given hashedrekord v0.0.1 tlog entry to the given message // signature function verifyHashedrekord001TLogBody(tlogEntry, content) { @@ -49,3 +72,23 @@ function verifyHashedrekord001TLogBody(tlogEntry, content) { }); } } +// Compare the given hashedrekord v0.0.2 tlog entry to the given message +// signature +function verifyHashedrekord002TLogBody(spec, content) { + // Ensure that the bundles message signature matches the tlog entry + const tlogSig = spec.signature?.content || Buffer.from(''); + if (!content.compareSignature(tlogSig)) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'signature mismatch', + }); + } + // Ensure that the bundle's message digest matches the tlog entry + const tlogHash = spec.data?.digest || Buffer.from(''); + if (!content.compareDigest(tlogHash)) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'digest mismatch', + }); + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js index da235360c594a8..6c244fa37e9088 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.verifyTLogBody = verifyTLogBody; +exports.verifyTLogInclusion = verifyTLogInclusion; /* Copyright 2023 The Sigstore Authors. @@ -16,27 +17,46 @@ 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. */ +const v2_1 = require("@sigstore/protobuf-specs/rekor/v2"); const error_1 = require("../error"); const dsse_1 = require("./dsse"); const hashedrekord_1 = require("./hashedrekord"); const intoto_1 = require("./intoto"); +const checkpoint_1 = require("./checkpoint"); +const merkle_1 = require("./merkle"); +const set_1 = require("./set"); // Verifies that the given tlog entry matches the supplied signature content. function verifyTLogBody(entry, sigContent) { const { kind, version } = entry.kindVersion; const body = JSON.parse(entry.canonicalizedBody.toString('utf8')); + // validate body if (kind !== body.kind || version !== body.apiVersion) { throw new error_1.VerificationError({ code: 'TLOG_BODY_ERROR', message: `kind/version mismatch - expected: ${kind}/${version}, received: ${body.kind}/${body.apiVersion}`, }); } - switch (body.kind) { + switch (kind) { case 'dsse': - return (0, dsse_1.verifyDSSETLogBody)(body, sigContent); + // Rekor V1 and V2 use incompatible types so we need to branch here based on version + if (version == dsse_1.DSSE_API_VERSION_V1) { + return (0, dsse_1.verifyDSSETLogBody)(body, sigContent); + } + else { + const entryRekorV2 = v2_1.Entry.fromJSON(body); + return (0, dsse_1.verifyDSSETLogBodyV2)(entryRekorV2, sigContent); + } case 'intoto': return (0, intoto_1.verifyIntotoTLogBody)(body, sigContent); case 'hashedrekord': - return (0, hashedrekord_1.verifyHashedRekordTLogBody)(body, sigContent); + // Rekor V1 and V2 use incompatible types so we need to branch here based on version + if (version == hashedrekord_1.HASHEDREKORD_API_VERSION_V1) { + return (0, hashedrekord_1.verifyHashedRekordTLogBody)(body, sigContent); + } + else { + const entryRekorV2 = v2_1.Entry.fromJSON(body); + return (0, hashedrekord_1.verifyHashedRekordTLogBodyV2)(entryRekorV2, sigContent); + } /* istanbul ignore next */ default: throw new error_1.VerificationError({ @@ -45,3 +65,28 @@ function verifyTLogBody(entry, sigContent) { }); } } +function verifyTLogInclusion(entry, tlogAuthorities) { + let inclusionVerified = false; + if (isTLogEntryWithInclusionPromise(entry)) { + (0, set_1.verifyTLogSET)(entry, tlogAuthorities); + inclusionVerified = true; + } + if (isTLogEntryWithInclusionProof(entry)) { + const checkpoint = (0, checkpoint_1.verifyCheckpoint)(entry, tlogAuthorities); + (0, merkle_1.verifyMerkleInclusion)(entry, checkpoint); + inclusionVerified = true; + } + if (!inclusionVerified) { + throw new error_1.VerificationError({ + code: 'TLOG_MISSING_INCLUSION_ERROR', + message: 'inclusion could not be verified', + }); + } + return; +} +function isTLogEntryWithInclusionPromise(entry) { + return entry.inclusionPromise !== undefined; +} +function isTLogEntryWithInclusionProof(entry) { + return entry.inclusionProof !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/merkle.js similarity index 95% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js rename to deps/npm/node_modules/@sigstore/verify/dist/tlog/merkle.js index f57cae42002bd0..fbebeffd1ba7bf 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/tlog/merkle.js @@ -20,10 +20,10 @@ const core_1 = require("@sigstore/core"); const error_1 = require("../error"); const RFC6962_LEAF_HASH_PREFIX = Buffer.from([0x00]); const RFC6962_NODE_HASH_PREFIX = Buffer.from([0x01]); -function verifyMerkleInclusion(entry) { +function verifyMerkleInclusion(entry, checkpoint) { const inclusionProof = entry.inclusionProof; const logIndex = BigInt(inclusionProof.logIndex); - const treeSize = BigInt(inclusionProof.treeSize); + const treeSize = BigInt(checkpoint.logSize); if (logIndex < 0n || logIndex >= treeSize) { throw new error_1.VerificationError({ code: 'TLOG_INCLUSION_PROOF_ERROR', @@ -46,7 +46,7 @@ function verifyMerkleInclusion(entry) { // Chain the hashes belonging to the inner and border portions const calculatedHash = chainBorderRight(chainInner(leafHash, innerHashes, logIndex), borderHashes); // Calculated hash should match the root hash in the inclusion proof - if (!core_1.crypto.bufferEqual(calculatedHash, inclusionProof.rootHash)) { + if (!core_1.crypto.bufferEqual(calculatedHash, checkpoint.logHash)) { throw new error_1.VerificationError({ code: 'TLOG_INCLUSION_PROOF_ERROR', message: 'calculated root hash does not match inclusion proof', diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/set.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js rename to deps/npm/node_modules/@sigstore/verify/dist/tlog/set.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js b/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js index bfab2eb4f9975a..2823f5f7d4b930 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js @@ -44,8 +44,12 @@ function createTLogAuthority(tlogInstance) { keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256 ? 'pkcs1' : 'spki'; + /* istanbul ignore next */ return { - logID: tlogInstance.logId.keyId, + baseURL: tlogInstance.baseUrl, + logID: tlogInstance.checkpointKeyId + ? tlogInstance.checkpointKeyId.keyId + : tlogInstance.logId.keyId, publicKey: core_1.crypto.createPublicKey(tlogInstance.publicKey.rawBytes, keyType), validFor: { start: tlogInstance.publicKey.validFor?.start || BEGINNING_OF_TIME, @@ -57,7 +61,7 @@ function createCertAuthority(ca) { /* istanbul ignore next */ return { certChain: ca.certChain.certificates.map((cert) => { - return core_1.X509Certificate.parse(cert.rawBytes); + return core_1.X509Certificate.parse(Buffer.from(cert.rawBytes)); }), validFor: { start: ca.validFor?.start || BEGINNING_OF_TIME, diff --git a/deps/npm/node_modules/@sigstore/verify/dist/verifier.js b/deps/npm/node_modules/@sigstore/verify/dist/verifier.js index 6a9d11a3b6f8f4..5751087ff178d2 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/verifier.js +++ b/deps/npm/node_modules/@sigstore/verify/dist/verifier.js @@ -23,12 +23,15 @@ const policy_1 = require("./policy"); const timestamp_1 = require("./timestamp"); const tlog_1 = require("./tlog"); class Verifier { + trustMaterial; + options; constructor(trustMaterial, options = {}) { this.trustMaterial = trustMaterial; this.options = { ctlogThreshold: options.ctlogThreshold ?? 1, tlogThreshold: options.tlogThreshold ?? 1, - tsaThreshold: options.tsaThreshold ?? 0, + timestampThreshold: options.timestampThreshold ?? options.tsaThreshold ?? 1, + tsaThreshold: 0, }; } verify(entity, policy) { @@ -43,16 +46,15 @@ class Verifier { } // Checks that all of the timestamps in the entity are valid and returns them verifyTimestamps(entity) { - let tlogCount = 0; - let tsaCount = 0; + let timestampCount = 0; const timestamps = entity.timestamps.map((timestamp) => { switch (timestamp.$case) { case 'timestamp-authority': - tsaCount++; - return (0, timestamp_1.verifyTSATimestamp)(timestamp.timestamp, entity.signature.signature, this.trustMaterial.timestampAuthorities); + timestampCount++; + return (0, timestamp_1.getTSATimestamp)(timestamp.timestamp, entity.signature.signature, this.trustMaterial.timestampAuthorities); case 'transparency-log': - tlogCount++; - return (0, timestamp_1.verifyTLogTimestamp)(timestamp.tlogEntry, this.trustMaterial.tlogs); + timestampCount++; + return (0, timestamp_1.getTLogTimestamp)(timestamp.tlogEntry); } }); // Check for duplicate timestamps @@ -62,16 +64,10 @@ class Verifier { message: 'duplicate timestamp', }); } - if (tlogCount < this.options.tlogThreshold) { - throw new error_1.VerificationError({ - code: 'TIMESTAMP_ERROR', - message: `expected ${this.options.tlogThreshold} tlog timestamps, got ${tlogCount}`, - }); - } - if (tsaCount < this.options.tsaThreshold) { + if (timestampCount < this.options.timestampThreshold) { throw new error_1.VerificationError({ code: 'TIMESTAMP_ERROR', - message: `expected ${this.options.tsaThreshold} tsa timestamps, got ${tsaCount}`, + message: `expected ${this.options.timestampThreshold} timestamps, got ${timestampCount}`, }); } return timestamps.map((t) => t.timestamp); @@ -104,7 +100,18 @@ class Verifier { } // Checks that the tlog entries are valid for the supplied content verifyTLogs({ signature: content, tlogEntries }) { - tlogEntries.forEach((entry) => (0, tlog_1.verifyTLogBody)(entry, content)); + let tlogCount = 0; + tlogEntries.forEach((entry) => { + tlogCount++; + (0, tlog_1.verifyTLogInclusion)(entry, this.trustMaterial.tlogs); + (0, tlog_1.verifyTLogBody)(entry, content); + }); + if (tlogCount < this.options.tlogThreshold) { + throw new error_1.VerificationError({ + code: 'TLOG_ERROR', + message: `expected ${this.options.tlogThreshold} tlog entries, got ${tlogCount}`, + }); + } } // Checks that the signature is valid for the supplied content verifySignature(entity, signer) { diff --git a/deps/npm/node_modules/@sigstore/verify/package.json b/deps/npm/node_modules/@sigstore/verify/package.json index eaf12376c90254..79826a80bddebf 100644 --- a/deps/npm/node_modules/@sigstore/verify/package.json +++ b/deps/npm/node_modules/@sigstore/verify/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/verify", - "version": "3.0.0", + "version": "3.1.0", "description": "Verification of Sigstore signatures", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -28,7 +28,7 @@ "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0" + "@sigstore/core": "^3.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/LICENSE b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/LICENSE deleted file mode 100644 index 1493534e60dce4..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js deleted file mode 100644 index 5fc86bbd0116c9..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertValidPattern = void 0; -const MAX_PATTERN_LENGTH = 1024 * 64; -const assertValidPattern = (pattern) => { - if (typeof pattern !== 'string') { - throw new TypeError('invalid pattern'); - } - if (pattern.length > MAX_PATTERN_LENGTH) { - throw new TypeError('pattern is too long'); - } -}; -exports.assertValidPattern = assertValidPattern; -//# sourceMappingURL=assert-valid-pattern.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/ast.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/ast.js deleted file mode 100644 index 9e1f9e765c597e..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/ast.js +++ /dev/null @@ -1,592 +0,0 @@ -"use strict"; -// parse a single path portion -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AST = void 0; -const brace_expressions_js_1 = require("./brace-expressions.js"); -const unescape_js_1 = require("./unescape.js"); -const types = new Set(['!', '?', '+', '*', '@']); -const isExtglobType = (c) => types.has(c); -// Patterns that get prepended to bind to the start of either the -// entire string, or just a single path portion, to prevent dots -// and/or traversal patterns, when needed. -// Exts don't need the ^ or / bit, because the root binds that already. -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; -const startNoDot = '(?!\\.)'; -// characters that indicate a start of pattern needs the "no dots" bit, -// because a dot *might* be matched. ( is not in the list, because in -// the case of a child extglob, it will handle the prevention itself. -const addPatternStart = new Set(['[', '.']); -// cases where traversal is A-OK, no dot prevention needed -const justDots = new Set(['..', '.']); -const reSpecials = new Set('().*{}+?[]^$\\!'); -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// any single thing other than / -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// use + when we need to ensure that *something* matches, because the * is -// the only thing in the path portion. -const starNoEmpty = qmark + '+?'; -// remove the \ chars that we added if we end up doing a nonmagic compare -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1') -class AST { - type; - #root; - #hasMagic; - #uflag = false; - #parts = []; - #parent; - #parentIndex; - #negs; - #filledNegs = false; - #options; - #toString; - // set to true if it's an extglob with no children - // (which really means one child of '') - #emptyExt = false; - constructor(type, parent, options = {}) { - this.type = type; - // extglobs are inherently magical - if (type) - this.#hasMagic = true; - this.#parent = parent; - this.#root = this.#parent ? this.#parent.#root : this; - this.#options = this.#root === this ? options : this.#root.#options; - this.#negs = this.#root === this ? [] : this.#root.#negs; - if (type === '!' && !this.#root.#filledNegs) - this.#negs.push(this); - this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; - } - get hasMagic() { - /* c8 ignore start */ - if (this.#hasMagic !== undefined) - return this.#hasMagic; - /* c8 ignore stop */ - for (const p of this.#parts) { - if (typeof p === 'string') - continue; - if (p.type || p.hasMagic) - return (this.#hasMagic = true); - } - // note: will be undefined until we generate the regexp src and find out - return this.#hasMagic; - } - // reconstructs the pattern - toString() { - if (this.#toString !== undefined) - return this.#toString; - if (!this.type) { - return (this.#toString = this.#parts.map(p => String(p)).join('')); - } - else { - return (this.#toString = - this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')'); - } - } - #fillNegs() { - /* c8 ignore start */ - if (this !== this.#root) - throw new Error('should only call on root'); - if (this.#filledNegs) - return this; - /* c8 ignore stop */ - // call toString() once to fill this out - this.toString(); - this.#filledNegs = true; - let n; - while ((n = this.#negs.pop())) { - if (n.type !== '!') - continue; - // walk up the tree, appending everthing that comes AFTER parentIndex - let p = n; - let pp = p.#parent; - while (pp) { - for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { - for (const part of n.#parts) { - /* c8 ignore start */ - if (typeof part === 'string') { - throw new Error('string part in extglob AST??'); - } - /* c8 ignore stop */ - part.copyIn(pp.#parts[i]); - } - } - p = pp; - pp = p.#parent; - } - } - return this; - } - push(...parts) { - for (const p of parts) { - if (p === '') - continue; - /* c8 ignore start */ - if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { - throw new Error('invalid part: ' + p); - } - /* c8 ignore stop */ - this.#parts.push(p); - } - } - toJSON() { - const ret = this.type === null - ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) - : [this.type, ...this.#parts.map(p => p.toJSON())]; - if (this.isStart() && !this.type) - ret.unshift([]); - if (this.isEnd() && - (this === this.#root || - (this.#root.#filledNegs && this.#parent?.type === '!'))) { - ret.push({}); - } - return ret; - } - isStart() { - if (this.#root === this) - return true; - // if (this.type) return !!this.#parent?.isStart() - if (!this.#parent?.isStart()) - return false; - if (this.#parentIndex === 0) - return true; - // if everything AHEAD of this is a negation, then it's still the "start" - const p = this.#parent; - for (let i = 0; i < this.#parentIndex; i++) { - const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { - return false; - } - } - return true; - } - isEnd() { - if (this.#root === this) - return true; - if (this.#parent?.type === '!') - return true; - if (!this.#parent?.isEnd()) - return false; - if (!this.type) - return this.#parent?.isEnd(); - // if not root, it'll always have a parent - /* c8 ignore start */ - const pl = this.#parent ? this.#parent.#parts.length : 0; - /* c8 ignore stop */ - return this.#parentIndex === pl - 1; - } - copyIn(part) { - if (typeof part === 'string') - this.push(part); - else - this.push(part.clone(this)); - } - clone(parent) { - const c = new AST(this.type, parent); - for (const p of this.#parts) { - c.copyIn(p); - } - return c; - } - static #parseAST(str, ast, pos, opt) { - let escaping = false; - let inBrace = false; - let braceStart = -1; - let braceNeg = false; - if (ast.type === null) { - // outside of a extglob, append until we find a start - let i = pos; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { - ast.push(acc); - acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); - ast.push(ext); - continue; - } - acc += c; - } - ast.push(acc); - return i; - } - // some kind of extglob, pos is at the ( - // find the next | or ) - let i = pos + 1; - let part = new AST(null, ast); - const parts = []; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (isExtglobType(c) && str.charAt(i) === '(') { - part.push(acc); - acc = ''; - const ext = new AST(c, part); - part.push(ext); - i = AST.#parseAST(str, ext, i, opt); - continue; - } - if (c === '|') { - part.push(acc); - acc = ''; - parts.push(part); - part = new AST(null, ast); - continue; - } - if (c === ')') { - if (acc === '' && ast.#parts.length === 0) { - ast.#emptyExt = true; - } - part.push(acc); - acc = ''; - ast.push(...parts, part); - return i; - } - acc += c; - } - // unfinished extglob - // if we got here, it was a malformed extglob! not an extglob, but - // maybe something else in there. - ast.type = null; - ast.#hasMagic = undefined; - ast.#parts = [str.substring(pos - 1)]; - return i; - } - static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); - return ast; - } - // returns the regular expression if there's magic, or the unescaped - // string if not. - toMMPattern() { - // should only be called on root - /* c8 ignore start */ - if (this !== this.#root) - return this.#root.toMMPattern(); - /* c8 ignore stop */ - const glob = this.toString(); - const [re, body, hasMagic, uflag] = this.toRegExpSource(); - // if we're in nocase mode, and not nocaseMagicOnly, then we do - // still need a regular expression if we have to case-insensitively - // match capital/lowercase characters. - const anyMagic = hasMagic || - this.#hasMagic || - (this.#options.nocase && - !this.#options.nocaseMagicOnly && - glob.toUpperCase() !== glob.toLowerCase()); - if (!anyMagic) { - return body; - } - const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); - return Object.assign(new RegExp(`^${re}$`, flags), { - _src: re, - _glob: glob, - }); - } - get options() { - return this.#options; - } - // returns the string match, the regexp source, whether there's magic - // in the regexp (so a regular expression is required) and whether or - // not the uflag is needed for the regular expression (for posix classes) - // TODO: instead of injecting the start/end at this point, just return - // the BODY of the regexp, along with the start/end portions suitable - // for binding the start/end in either a joined full-path makeRe context - // (where we bind to (^|/), or a standalone matchPart context (where - // we bind to ^, and not /). Otherwise slashes get duped! - // - // In part-matching mode, the start is: - // - if not isStart: nothing - // - if traversal possible, but not allowed: ^(?!\.\.?$) - // - if dots allowed or not possible: ^ - // - if dots possible and not allowed: ^(?!\.) - // end is: - // - if not isEnd(): nothing - // - else: $ - // - // In full-path matching mode, we put the slash at the START of the - // pattern, so start is: - // - if first pattern: same as part-matching mode - // - if not isStart(): nothing - // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) - // - if dots allowed or not possible: / - // - if dots possible and not allowed: /(?!\.) - // end is: - // - if last pattern, same as part-matching mode - // - else nothing - // - // Always put the (?:$|/) on negated tails, though, because that has to be - // there to bind the end of the negated pattern portion, and it's easier to - // just stick it in now rather than try to inject it later in the middle of - // the pattern. - // - // We can just always return the same end, and leave it up to the caller - // to know whether it's going to be used joined or in parts. - // And, if the start is adjusted slightly, can do the same there: - // - if not isStart: nothing - // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) - // - if dots allowed or not possible: (?:/|^) - // - if dots possible and not allowed: (?:/|^)(?!\.) - // - // But it's better to have a simpler binding without a conditional, for - // performance, so probably better to return both start options. - // - // Then the caller just ignores the end if it's not the first pattern, - // and the start always gets applied. - // - // But that's always going to be $ if it's the ending pattern, or nothing, - // so the caller can just attach $ at the end of the pattern when building. - // - // So the todo is: - // - better detect what kind of start is needed - // - return both flavors of starting pattern - // - attach $ at the end of the pattern when creating the actual RegExp - // - // Ah, but wait, no, that all only applies to the root when the first pattern - // is not an extglob. If the first pattern IS an extglob, then we need all - // that dot prevention biz to live in the extglob portions, because eg - // +(*|.x*) can match .xy but not .yx. - // - // So, return the two flavors if it's #root and the first child is not an - // AST, otherwise leave it to the child AST to handle it, and there, - // use the (?:^|/) style of start binding. - // - // Even simplified further: - // - Since the start for a join is eg /(?!\.) and the start for a part - // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root - // or start or whatever) and prepend ^ or / at the Regexp construction. - toRegExpSource(allowDot) { - const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) - this.#fillNegs(); - if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); - const src = this.#parts - .map(p => { - const [re, _, hasMagic, uflag] = typeof p === 'string' - ? AST.#parseGlob(p, this.#hasMagic, noEmpty) - : p.toRegExpSource(allowDot); - this.#hasMagic = this.#hasMagic || hasMagic; - this.#uflag = this.#uflag || uflag; - return re; - }) - .join(''); - let start = ''; - if (this.isStart()) { - if (typeof this.#parts[0] === 'string') { - // this is the string that will match the start of the pattern, - // so we need to protect against dots and such. - // '.' and '..' cannot match unless the pattern is that exactly, - // even if it starts with . or dot:true is set. - const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); - if (!dotTravAllowed) { - const aps = addPatternStart; - // check if we have a possibility of matching . or .., - // and prevent that. - const needNoTrav = - // dots are allowed, and the pattern starts with [ or . - (dot && aps.has(src.charAt(0))) || - // the pattern starts with \., and then [ or . - (src.startsWith('\\.') && aps.has(src.charAt(2))) || - // the pattern starts with \.\., and then [ or . - (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); - // no need to prevent dots if it can't match a dot, or if a - // sub-pattern will be preventing it anyway. - const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); - start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; - } - } - } - // append the "end of path portion" pattern to negation tails - let end = ''; - if (this.isEnd() && - this.#root.#filledNegs && - this.#parent?.type === '!') { - end = '(?:$|\\/)'; - } - const final = start + src + end; - return [ - final, - (0, unescape_js_1.unescape)(src), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - // We need to calculate the body *twice* if it's a repeat pattern - // at the start, once in nodot mode, then again in dot mode, so a - // pattern like *(?) can match 'x.y' - const repeated = this.type === '*' || this.type === '+'; - // some kind of extglob - const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; - let body = this.#partsToRegExp(dot); - if (this.isStart() && this.isEnd() && !body && this.type !== '!') { - // invalid extglob, has to at least be *something* present, if it's - // the entire path portion. - const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; - return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; - } - // XXX abstract out this map method - let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot - ? '' - : this.#partsToRegExp(true); - if (bodyDotAllowed === body) { - bodyDotAllowed = ''; - } - if (bodyDotAllowed) { - body = `(?:${body})(?:${bodyDotAllowed})*?`; - } - // an empty !() is exactly equivalent to a starNoEmpty - let final = ''; - if (this.type === '!' && this.#emptyExt) { - final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; - } - else { - const close = this.type === '!' - ? // !() must match something,but !(x) can match '' - '))' + - (this.isStart() && !dot && !allowDot ? startNoDot : '') + - star + - ')' - : this.type === '@' - ? ')' - : this.type === '?' - ? ')?' - : this.type === '+' && bodyDotAllowed - ? ')' - : this.type === '*' && bodyDotAllowed - ? `)?` - : `)${this.type}`; - final = start + body + close; - } - return [ - final, - (0, unescape_js_1.unescape)(body), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - #partsToRegExp(dot) { - return this.#parts - .map(p => { - // extglob ASTs should only contain parent ASTs - /* c8 ignore start */ - if (typeof p === 'string') { - throw new Error('string type in extglob ast??'); - } - /* c8 ignore stop */ - // can ignore hasMagic, because extglobs are already always magic - const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); - this.#uflag = this.#uflag || uflag; - return re; - }) - .filter(p => !(this.isStart() && this.isEnd()) || !!p) - .join('|'); - } - static #parseGlob(glob, hasMagic, noEmpty = false) { - let escaping = false; - let re = ''; - let uflag = false; - for (let i = 0; i < glob.length; i++) { - const c = glob.charAt(i); - if (escaping) { - escaping = false; - re += (reSpecials.has(c) ? '\\' : '') + c; - continue; - } - if (c === '\\') { - if (i === glob.length - 1) { - re += '\\\\'; - } - else { - escaping = true; - } - continue; - } - if (c === '[') { - const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); - if (consumed) { - re += src; - uflag = uflag || needUflag; - i += consumed - 1; - hasMagic = hasMagic || magic; - continue; - } - } - if (c === '*') { - if (noEmpty && glob === '*') - re += starNoEmpty; - else - re += star; - hasMagic = true; - continue; - } - if (c === '?') { - re += qmark; - hasMagic = true; - continue; - } - re += regExpEscape(c); - } - return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; - } -} -exports.AST = AST; -//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/brace-expressions.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/brace-expressions.js deleted file mode 100644 index 0e13eefc4cfee2..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/brace-expressions.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -// translate the various posix character classes into unicode properties -// this works across all unicode locales -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseClass = void 0; -// { : [, /u flag required, negated] -const posixClasses = { - '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], - '[:alpha:]': ['\\p{L}\\p{Nl}', true], - '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], - '[:blank:]': ['\\p{Zs}\\t', true], - '[:cntrl:]': ['\\p{Cc}', true], - '[:digit:]': ['\\p{Nd}', true], - '[:graph:]': ['\\p{Z}\\p{C}', true, true], - '[:lower:]': ['\\p{Ll}', true], - '[:print:]': ['\\p{C}', true], - '[:punct:]': ['\\p{P}', true], - '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], - '[:upper:]': ['\\p{Lu}', true], - '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], - '[:xdigit:]': ['A-Fa-f0-9', false], -}; -// only need to escape a few things inside of brace expressions -// escapes: [ \ ] - -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); -// escape all regexp magic characters -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// everything has already been escaped, we just have to join -const rangesToString = (ranges) => ranges.join(''); -// takes a glob string at a posix brace expression, and returns -// an equivalent regular expression source, and boolean indicating -// whether the /u flag needs to be applied, and the number of chars -// consumed to parse the character class. -// This also removes out of order ranges, and returns ($.) if the -// entire class just no good. -const parseClass = (glob, position) => { - const pos = position; - /* c8 ignore start */ - if (glob.charAt(pos) !== '[') { - throw new Error('not in a brace expression'); - } - /* c8 ignore stop */ - const ranges = []; - const negs = []; - let i = pos + 1; - let sawStart = false; - let uflag = false; - let escaping = false; - let negate = false; - let endPos = pos; - let rangeStart = ''; - WHILE: while (i < glob.length) { - const c = glob.charAt(i); - if ((c === '!' || c === '^') && i === pos + 1) { - negate = true; - i++; - continue; - } - if (c === ']' && sawStart && !escaping) { - endPos = i + 1; - break; - } - sawStart = true; - if (c === '\\') { - if (!escaping) { - escaping = true; - i++; - continue; - } - // escaped \ char, fall through and treat like normal char - } - if (c === '[' && !escaping) { - // either a posix class, a collation equivalent, or just a [ - for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { - if (glob.startsWith(cls, i)) { - // invalid, [a-[] is fine, but not [a-[:alpha]] - if (rangeStart) { - return ['$.', false, glob.length - pos, true]; - } - i += cls.length; - if (neg) - negs.push(unip); - else - ranges.push(unip); - uflag = uflag || u; - continue WHILE; - } - } - } - // now it's just a normal character, effectively - escaping = false; - if (rangeStart) { - // throw this range away if it's not valid, but others - // can still match. - if (c > rangeStart) { - ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); - } - else if (c === rangeStart) { - ranges.push(braceEscape(c)); - } - rangeStart = ''; - i++; - continue; - } - // now might be the start of a range. - // can be either c-d or c-] or c] or c] at this point - if (glob.startsWith('-]', i + 1)) { - ranges.push(braceEscape(c + '-')); - i += 2; - continue; - } - if (glob.startsWith('-', i + 1)) { - rangeStart = c; - i += 2; - continue; - } - // not the start of a range, just a single character - ranges.push(braceEscape(c)); - i++; - } - if (endPos < i) { - // didn't see the end of the class, not a valid class, - // but might still be valid as a literal match. - return ['', false, 0, false]; - } - // if we got no ranges and no negates, then we have a range that - // cannot possibly match anything, and that poisons the whole glob - if (!ranges.length && !negs.length) { - return ['$.', false, glob.length - pos, true]; - } - // if we got one positive range, and it's a single character, then that's - // not actually a magic pattern, it's just that one literal character. - // we should not treat that as "magic", we should just return the literal - // character. [_] is a perfectly valid way to escape glob magic chars. - if (negs.length === 0 && - ranges.length === 1 && - /^\\?.$/.test(ranges[0]) && - !negate) { - const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; - return [regexpEscape(r), false, endPos - pos, false]; - } - const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; - const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; - const comb = ranges.length && negs.length - ? '(' + sranges + '|' + snegs + ')' - : ranges.length - ? sranges - : snegs; - return [comb, uflag, endPos - pos, true]; -}; -exports.parseClass = parseClass; -//# sourceMappingURL=brace-expressions.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/escape.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/escape.js deleted file mode 100644 index 02a4f8a8e0a588..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/escape.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.escape = void 0; -/** - * Escape all magic characters in a glob pattern. - * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} - * option is used, then characters are escaped by wrapping in `[]`, because - * a magic character wrapped in a character class can only be satisfied by - * that exact character. In this mode, `\` is _not_ escaped, because it is - * not interpreted as a magic character, but instead as a path separator. - */ -const escape = (s, { windowsPathsNoEscape = false, } = {}) => { - // don't need to escape +@! because we escape the parens - // that make those magic, and escaping ! as [!] isn't valid, - // because [!]] is a valid glob class meaning not ']'. - return windowsPathsNoEscape - ? s.replace(/[?*()[\]]/g, '[$&]') - : s.replace(/[?*()[\]\\]/g, '\\$&'); -}; -exports.escape = escape; -//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/index.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/index.js deleted file mode 100644 index 64a0f1f833222e..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/index.js +++ /dev/null @@ -1,1017 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; -const brace_expansion_1 = __importDefault(require("brace-expansion")); -const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js"); -const ast_js_1 = require("./ast.js"); -const escape_js_1 = require("./escape.js"); -const unescape_js_1 = require("./unescape.js"); -const minimatch = (p, pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false; - } - return new Minimatch(pattern, options).match(p); -}; -exports.minimatch = minimatch; -// Optimized checking for the most common glob patterns. -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); -const starDotExtTestNocase = (ext) => { - ext = ext.toLowerCase(); - return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); -}; -const starDotExtTestNocaseDot = (ext) => { - ext = ext.toLowerCase(); - return (f) => f.toLowerCase().endsWith(ext); -}; -const starDotStarRE = /^\*+\.\*+$/; -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); -const dotStarRE = /^\.\*+$/; -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); -const starRE = /^\*+$/; -const starTest = (f) => f.length !== 0 && !f.startsWith('.'); -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; -const qmarksTestNocase = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestNocaseDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTest = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTestNoExt = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && !f.startsWith('.'); -}; -const qmarksTestNoExtDot = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && f !== '.' && f !== '..'; -}; -/* c8 ignore start */ -const defaultPlatform = (typeof process === 'object' && process - ? (typeof process.env === 'object' && - process.env && - process.env.__MINIMATCH_TESTING_PLATFORM__) || - process.platform - : 'posix'); -const path = { - win32: { sep: '\\' }, - posix: { sep: '/' }, -}; -/* c8 ignore stop */ -exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; -exports.minimatch.sep = exports.sep; -exports.GLOBSTAR = Symbol('globstar **'); -exports.minimatch.GLOBSTAR = exports.GLOBSTAR; -// any single thing other than / -// don't need to escape / when using new RegExp() -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; -const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); -exports.filter = filter; -exports.minimatch.filter = exports.filter; -const ext = (a, b = {}) => Object.assign({}, a, b); -const defaults = (def) => { - if (!def || typeof def !== 'object' || !Object.keys(def).length) { - return exports.minimatch; - } - const orig = exports.minimatch; - const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); - return Object.assign(m, { - Minimatch: class Minimatch extends orig.Minimatch { - constructor(pattern, options = {}) { - super(pattern, ext(def, options)); - } - static defaults(options) { - return orig.defaults(ext(def, options)).Minimatch; - } - }, - AST: class AST extends orig.AST { - /* c8 ignore start */ - constructor(type, parent, options = {}) { - super(type, parent, ext(def, options)); - } - /* c8 ignore stop */ - static fromGlob(pattern, options = {}) { - return orig.AST.fromGlob(pattern, ext(def, options)); - } - }, - unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), - escape: (s, options = {}) => orig.escape(s, ext(def, options)), - filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), - defaults: (options) => orig.defaults(ext(def, options)), - makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), - braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), - match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), - sep: orig.sep, - GLOBSTAR: exports.GLOBSTAR, - }); -}; -exports.defaults = defaults; -exports.minimatch.defaults = exports.defaults; -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -const braceExpand = (pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // Thanks to Yeting Li for - // improving this regexp to avoid a ReDOS vulnerability. - if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { - // shortcut. no need to expand. - return [pattern]; - } - return (0, brace_expansion_1.default)(pattern); -}; -exports.braceExpand = braceExpand; -exports.minimatch.braceExpand = exports.braceExpand; -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); -exports.makeRe = makeRe; -exports.minimatch.makeRe = exports.makeRe; -const match = (list, pattern, options = {}) => { - const mm = new Minimatch(pattern, options); - list = list.filter(f => mm.match(f)); - if (mm.options.nonull && !list.length) { - list.push(pattern); - } - return list; -}; -exports.match = match; -exports.minimatch.match = exports.match; -// replace stuff like \* with * -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -class Minimatch { - options; - set; - pattern; - windowsPathsNoEscape; - nonegate; - negate; - comment; - empty; - preserveMultipleSlashes; - partial; - globSet; - globParts; - nocase; - isWindows; - platform; - windowsNoMagicRoot; - regexp; - constructor(pattern, options = {}) { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - options = options || {}; - this.options = options; - this.pattern = pattern; - this.platform = options.platform || defaultPlatform; - this.isWindows = this.platform === 'win32'; - this.windowsPathsNoEscape = - !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; - if (this.windowsPathsNoEscape) { - this.pattern = this.pattern.replace(/\\/g, '/'); - } - this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; - this.regexp = null; - this.negate = false; - this.nonegate = !!options.nonegate; - this.comment = false; - this.empty = false; - this.partial = !!options.partial; - this.nocase = !!this.options.nocase; - this.windowsNoMagicRoot = - options.windowsNoMagicRoot !== undefined - ? options.windowsNoMagicRoot - : !!(this.isWindows && this.nocase); - this.globSet = []; - this.globParts = []; - this.set = []; - // make the set of regexps etc. - this.make(); - } - hasMagic() { - if (this.options.magicalBraces && this.set.length > 1) { - return true; - } - for (const pattern of this.set) { - for (const part of pattern) { - if (typeof part !== 'string') - return true; - } - } - return false; - } - debug(..._) { } - make() { - const pattern = this.pattern; - const options = this.options; - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true; - return; - } - if (!pattern) { - this.empty = true; - return; - } - // step 1: figure out negation, etc. - this.parseNegate(); - // step 2: expand braces - this.globSet = [...new Set(this.braceExpand())]; - if (options.debug) { - this.debug = (...args) => console.error(...args); - } - this.debug(this.pattern, this.globSet); - // step 3: now we have a set, so turn each one into a series of - // path-portion matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - // - // First, we preprocess to make the glob pattern sets a bit simpler - // and deduped. There are some perf-killing patterns that can cause - // problems with a glob walk, but we can simplify them down a bit. - const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); - this.globParts = this.preprocess(rawGlobParts); - this.debug(this.pattern, this.globParts); - // glob --> regexps - let set = this.globParts.map((s, _, __) => { - if (this.isWindows && this.windowsNoMagicRoot) { - // check if it's a drive or unc path. - const isUNC = s[0] === '' && - s[1] === '' && - (s[2] === '?' || !globMagic.test(s[2])) && - !globMagic.test(s[3]); - const isDrive = /^[a-z]:/i.test(s[0]); - if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; - } - else if (isDrive) { - return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; - } - } - return s.map(ss => this.parse(ss)); - }); - this.debug(this.pattern, set); - // filter out everything that didn't compile properly. - this.set = set.filter(s => s.indexOf(false) === -1); - // do not treat the ? in UNC paths as magic - if (this.isWindows) { - for (let i = 0; i < this.set.length; i++) { - const p = this.set[i]; - if (p[0] === '' && - p[1] === '' && - this.globParts[i][2] === '?' && - typeof p[3] === 'string' && - /^[a-z]:$/i.test(p[3])) { - p[2] = '?'; - } - } - } - this.debug(this.pattern, this.set); - } - // various transforms to equivalent pattern sets that are - // faster to process in a filesystem walk. The goal is to - // eliminate what we can, and push all ** patterns as far - // to the right as possible, even if it increases the number - // of patterns that we have to process. - preprocess(globParts) { - // if we're not in globstar mode, then turn all ** into * - if (this.options.noglobstar) { - for (let i = 0; i < globParts.length; i++) { - for (let j = 0; j < globParts[i].length; j++) { - if (globParts[i][j] === '**') { - globParts[i][j] = '*'; - } - } - } - } - const { optimizationLevel = 1 } = this.options; - if (optimizationLevel >= 2) { - // aggressive optimization for the purpose of fs walking - globParts = this.firstPhasePreProcess(globParts); - globParts = this.secondPhasePreProcess(globParts); - } - else if (optimizationLevel >= 1) { - // just basic optimizations to remove some .. parts - globParts = this.levelOneOptimize(globParts); - } - else { - // just collapse multiple ** portions into one - globParts = this.adjascentGlobstarOptimize(globParts); - } - return globParts; - } - // just get rid of adjascent ** portions - adjascentGlobstarOptimize(globParts) { - return globParts.map(parts => { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let i = gs; - while (parts[i + 1] === '**') { - i++; - } - if (i !== gs) { - parts.splice(gs, i - gs); - } - } - return parts; - }); - } - // get rid of adjascent ** and resolve .. portions - levelOneOptimize(globParts) { - return globParts.map(parts => { - parts = parts.reduce((set, part) => { - const prev = set[set.length - 1]; - if (part === '**' && prev === '**') { - return set; - } - if (part === '..') { - if (prev && prev !== '..' && prev !== '.' && prev !== '**') { - set.pop(); - return set; - } - } - set.push(part); - return set; - }, []); - return parts.length === 0 ? [''] : parts; - }); - } - levelTwoFileOptimize(parts) { - if (!Array.isArray(parts)) { - parts = this.slashSplit(parts); - } - let didSomething = false; - do { - didSomething = false; - //
      // -> 
      /
      -            if (!this.preserveMultipleSlashes) {
      -                for (let i = 1; i < parts.length - 1; i++) {
      -                    const p = parts[i];
      -                    // don't squeeze out UNC patterns
      -                    if (i === 1 && p === '' && parts[0] === '')
      -                        continue;
      -                    if (p === '.' || p === '') {
      -                        didSomething = true;
      -                        parts.splice(i, 1);
      -                        i--;
      -                    }
      -                }
      -                if (parts[0] === '.' &&
      -                    parts.length === 2 &&
      -                    (parts[1] === '.' || parts[1] === '')) {
      -                    didSomething = true;
      -                    parts.pop();
      -                }
      -            }
      -            // 
      /

      /../ ->

      /
      -            let dd = 0;
      -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      -                const p = parts[dd - 1];
      -                if (p && p !== '.' && p !== '..' && p !== '**') {
      -                    didSomething = true;
      -                    parts.splice(dd - 1, 2);
      -                    dd -= 2;
      -                }
      -            }
      -        } while (didSomething);
      -        return parts.length === 0 ? [''] : parts;
      -    }
      -    // First phase: single-pattern processing
      -    // 
       is 1 or more portions
      -    //  is 1 or more portions
      -    // 

      is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} - //

      // -> 
      /
      -    // 
      /

      /../ ->

      /
      -    // **/**/ -> **/
      -    //
      -    // **/*/ -> */**/ <== not valid because ** doesn't follow
      -    // this WOULD be allowed if ** did follow symlinks, or * didn't
      -    firstPhasePreProcess(globParts) {
      -        let didSomething = false;
      -        do {
      -            didSomething = false;
      -            // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

      /**/**/ -> 
      /**/
      -                        gss++;
      -                    }
      -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
      -                    // parts, and can remove 2 of them.
      -                    if (gss > gs) {
      -                        parts.splice(gs + 1, gss - gs);
      -                    }
      -                    let next = parts[gs + 1];
      -                    const p = parts[gs + 2];
      -                    const p2 = parts[gs + 3];
      -                    if (next !== '..')
      -                        continue;
      -                    if (!p ||
      -                        p === '.' ||
      -                        p === '..' ||
      -                        !p2 ||
      -                        p2 === '.' ||
      -                        p2 === '..') {
      -                        continue;
      -                    }
      -                    didSomething = true;
      -                    // edit parts in place, and push the new one
      -                    parts.splice(gs, 1);
      -                    const other = parts.slice(0);
      -                    other[gs] = '**';
      -                    globParts.push(other);
      -                    gs--;
      -                }
      -                // 
      // -> 
      /
      -                if (!this.preserveMultipleSlashes) {
      -                    for (let i = 1; i < parts.length - 1; i++) {
      -                        const p = parts[i];
      -                        // don't squeeze out UNC patterns
      -                        if (i === 1 && p === '' && parts[0] === '')
      -                            continue;
      -                        if (p === '.' || p === '') {
      -                            didSomething = true;
      -                            parts.splice(i, 1);
      -                            i--;
      -                        }
      -                    }
      -                    if (parts[0] === '.' &&
      -                        parts.length === 2 &&
      -                        (parts[1] === '.' || parts[1] === '')) {
      -                        didSomething = true;
      -                        parts.pop();
      -                    }
      -                }
      -                // 
      /

      /../ ->

      /
      -                let dd = 0;
      -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      -                    const p = parts[dd - 1];
      -                    if (p && p !== '.' && p !== '..' && p !== '**') {
      -                        didSomething = true;
      -                        const needDot = dd === 1 && parts[dd + 1] === '**';
      -                        const splin = needDot ? ['.'] : [];
      -                        parts.splice(dd - 1, 2, ...splin);
      -                        if (parts.length === 0)
      -                            parts.push('');
      -                        dd -= 2;
      -                    }
      -                }
      -            }
      -        } while (didSomething);
      -        return globParts;
      -    }
      -    // second phase: multi-pattern dedupes
      -    // {
      /*/,
      /

      /} ->

      /*/
      -    // {
      /,
      /} -> 
      /
      -    // {
      /**/,
      /} -> 
      /**/
      -    //
      -    // {
      /**/,
      /**/

      /} ->

      /**/
      -    // ^-- not valid because ** doens't follow symlinks
      -    secondPhasePreProcess(globParts) {
      -        for (let i = 0; i < globParts.length - 1; i++) {
      -            for (let j = i + 1; j < globParts.length; j++) {
      -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
      -                if (matched) {
      -                    globParts[i] = [];
      -                    globParts[j] = matched;
      -                    break;
      -                }
      -            }
      -        }
      -        return globParts.filter(gs => gs.length);
      -    }
      -    partsMatch(a, b, emptyGSMatch = false) {
      -        let ai = 0;
      -        let bi = 0;
      -        let result = [];
      -        let which = '';
      -        while (ai < a.length && bi < b.length) {
      -            if (a[ai] === b[bi]) {
      -                result.push(which === 'b' ? b[bi] : a[ai]);
      -                ai++;
      -                bi++;
      -            }
      -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
      -                result.push(a[ai]);
      -                ai++;
      -            }
      -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
      -                result.push(b[bi]);
      -                bi++;
      -            }
      -            else if (a[ai] === '*' &&
      -                b[bi] &&
      -                (this.options.dot || !b[bi].startsWith('.')) &&
      -                b[bi] !== '**') {
      -                if (which === 'b')
      -                    return false;
      -                which = 'a';
      -                result.push(a[ai]);
      -                ai++;
      -                bi++;
      -            }
      -            else if (b[bi] === '*' &&
      -                a[ai] &&
      -                (this.options.dot || !a[ai].startsWith('.')) &&
      -                a[ai] !== '**') {
      -                if (which === 'a')
      -                    return false;
      -                which = 'b';
      -                result.push(b[bi]);
      -                ai++;
      -                bi++;
      -            }
      -            else {
      -                return false;
      -            }
      -        }
      -        // if we fall out of the loop, it means they two are identical
      -        // as long as their lengths match
      -        return a.length === b.length && result;
      -    }
      -    parseNegate() {
      -        if (this.nonegate)
      -            return;
      -        const pattern = this.pattern;
      -        let negate = false;
      -        let negateOffset = 0;
      -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
      -            negate = !negate;
      -            negateOffset++;
      -        }
      -        if (negateOffset)
      -            this.pattern = pattern.slice(negateOffset);
      -        this.negate = negate;
      -    }
      -    // set partial to true to test if, for example,
      -    // "/a/b" matches the start of "/*/b/*/d"
      -    // Partial means, if you run out of file before you run
      -    // out of pattern, then that's fine, as long as all
      -    // the parts match.
      -    matchOne(file, pattern, partial = false) {
      -        const options = this.options;
      -        // UNC paths like //?/X:/... can match X:/... and vice versa
      -        // Drive letters in absolute drive or unc paths are always compared
      -        // case-insensitively.
      -        if (this.isWindows) {
      -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
      -            const fileUNC = !fileDrive &&
      -                file[0] === '' &&
      -                file[1] === '' &&
      -                file[2] === '?' &&
      -                /^[a-z]:$/i.test(file[3]);
      -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
      -            const patternUNC = !patternDrive &&
      -                pattern[0] === '' &&
      -                pattern[1] === '' &&
      -                pattern[2] === '?' &&
      -                typeof pattern[3] === 'string' &&
      -                /^[a-z]:$/i.test(pattern[3]);
      -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
      -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
      -            if (typeof fdi === 'number' && typeof pdi === 'number') {
      -                const [fd, pd] = [file[fdi], pattern[pdi]];
      -                if (fd.toLowerCase() === pd.toLowerCase()) {
      -                    pattern[pdi] = fd;
      -                    if (pdi > fdi) {
      -                        pattern = pattern.slice(pdi);
      -                    }
      -                    else if (fdi > pdi) {
      -                        file = file.slice(fdi);
      -                    }
      -                }
      -            }
      -        }
      -        // resolve and reduce . and .. portions in the file as well.
      -        // dont' need to do the second phase, because it's only one string[]
      -        const { optimizationLevel = 1 } = this.options;
      -        if (optimizationLevel >= 2) {
      -            file = this.levelTwoFileOptimize(file);
      -        }
      -        this.debug('matchOne', this, { file, pattern });
      -        this.debug('matchOne', file.length, pattern.length);
      -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
      -            this.debug('matchOne loop');
      -            var p = pattern[pi];
      -            var f = file[fi];
      -            this.debug(pattern, p, f);
      -            // should be impossible.
      -            // some invalid regexp stuff in the set.
      -            /* c8 ignore start */
      -            if (p === false) {
      -                return false;
      -            }
      -            /* c8 ignore stop */
      -            if (p === exports.GLOBSTAR) {
      -                this.debug('GLOBSTAR', [pattern, p, f]);
      -                // "**"
      -                // a/**/b/**/c would match the following:
      -                // a/b/x/y/z/c
      -                // a/x/y/z/b/c
      -                // a/b/x/b/x/c
      -                // a/b/c
      -                // To do this, take the rest of the pattern after
      -                // the **, and see if it would match the file remainder.
      -                // If so, return success.
      -                // If not, the ** "swallows" a segment, and try again.
      -                // This is recursively awful.
      -                //
      -                // a/**/b/**/c matching a/b/x/y/z/c
      -                // - a matches a
      -                // - doublestar
      -                //   - matchOne(b/x/y/z/c, b/**/c)
      -                //     - b matches b
      -                //     - doublestar
      -                //       - matchOne(x/y/z/c, c) -> no
      -                //       - matchOne(y/z/c, c) -> no
      -                //       - matchOne(z/c, c) -> no
      -                //       - matchOne(c, c) yes, hit
      -                var fr = fi;
      -                var pr = pi + 1;
      -                if (pr === pl) {
      -                    this.debug('** at the end');
      -                    // a ** at the end will just swallow the rest.
      -                    // We have found a match.
      -                    // however, it will not swallow /.x, unless
      -                    // options.dot is set.
      -                    // . and .. are *never* matched by **, for explosively
      -                    // exponential reasons.
      -                    for (; fi < fl; fi++) {
      -                        if (file[fi] === '.' ||
      -                            file[fi] === '..' ||
      -                            (!options.dot && file[fi].charAt(0) === '.'))
      -                            return false;
      -                    }
      -                    return true;
      -                }
      -                // ok, let's see if we can swallow whatever we can.
      -                while (fr < fl) {
      -                    var swallowee = file[fr];
      -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
      -                    // XXX remove this slice.  Just pass the start index.
      -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
      -                        this.debug('globstar found match!', fr, fl, swallowee);
      -                        // found a match.
      -                        return true;
      -                    }
      -                    else {
      -                        // can't swallow "." or ".." ever.
      -                        // can only swallow ".foo" when explicitly asked.
      -                        if (swallowee === '.' ||
      -                            swallowee === '..' ||
      -                            (!options.dot && swallowee.charAt(0) === '.')) {
      -                            this.debug('dot detected!', file, fr, pattern, pr);
      -                            break;
      -                        }
      -                        // ** swallows a segment, and continue.
      -                        this.debug('globstar swallow a segment, and continue');
      -                        fr++;
      -                    }
      -                }
      -                // no match was found.
      -                // However, in partial mode, we can't say this is necessarily over.
      -                /* c8 ignore start */
      -                if (partial) {
      -                    // ran out of file
      -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
      -                    if (fr === fl) {
      -                        return true;
      -                    }
      -                }
      -                /* c8 ignore stop */
      -                return false;
      -            }
      -            // something other than **
      -            // non-magic patterns just have to match exactly
      -            // patterns with magic have been turned into regexps.
      -            let hit;
      -            if (typeof p === 'string') {
      -                hit = f === p;
      -                this.debug('string match', p, f, hit);
      -            }
      -            else {
      -                hit = p.test(f);
      -                this.debug('pattern match', p, f, hit);
      -            }
      -            if (!hit)
      -                return false;
      -        }
      -        // Note: ending in / means that we'll get a final ""
      -        // at the end of the pattern.  This can only match a
      -        // corresponding "" at the end of the file.
      -        // If the file ends in /, then it can only match a
      -        // a pattern that ends in /, unless the pattern just
      -        // doesn't have any more for it. But, a/b/ should *not*
      -        // match "a/b/*", even though "" matches against the
      -        // [^/]*? pattern, except in partial mode, where it might
      -        // simply not be reached yet.
      -        // However, a/b/ should still satisfy a/*
      -        // now either we fell off the end of the pattern, or we're done.
      -        if (fi === fl && pi === pl) {
      -            // ran out of pattern and filename at the same time.
      -            // an exact hit!
      -            return true;
      -        }
      -        else if (fi === fl) {
      -            // ran out of file, but still had pattern left.
      -            // this is ok if we're doing the match as part of
      -            // a glob fs traversal.
      -            return partial;
      -        }
      -        else if (pi === pl) {
      -            // ran out of pattern, still have file left.
      -            // this is only acceptable if we're on the very last
      -            // empty segment of a file with a trailing slash.
      -            // a/* should match a/b/
      -            return fi === fl - 1 && file[fi] === '';
      -            /* c8 ignore start */
      -        }
      -        else {
      -            // should be unreachable.
      -            throw new Error('wtf?');
      -        }
      -        /* c8 ignore stop */
      -    }
      -    braceExpand() {
      -        return (0, exports.braceExpand)(this.pattern, this.options);
      -    }
      -    parse(pattern) {
      -        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
      -        const options = this.options;
      -        // shortcuts
      -        if (pattern === '**')
      -            return exports.GLOBSTAR;
      -        if (pattern === '')
      -            return '';
      -        // far and away, the most common glob pattern parts are
      -        // *, *.*, and *.  Add a fast check method for those.
      -        let m;
      -        let fastTest = null;
      -        if ((m = pattern.match(starRE))) {
      -            fastTest = options.dot ? starTestDot : starTest;
      -        }
      -        else if ((m = pattern.match(starDotExtRE))) {
      -            fastTest = (options.nocase
      -                ? options.dot
      -                    ? starDotExtTestNocaseDot
      -                    : starDotExtTestNocase
      -                : options.dot
      -                    ? starDotExtTestDot
      -                    : starDotExtTest)(m[1]);
      -        }
      -        else if ((m = pattern.match(qmarksRE))) {
      -            fastTest = (options.nocase
      -                ? options.dot
      -                    ? qmarksTestNocaseDot
      -                    : qmarksTestNocase
      -                : options.dot
      -                    ? qmarksTestDot
      -                    : qmarksTest)(m);
      -        }
      -        else if ((m = pattern.match(starDotStarRE))) {
      -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
      -        }
      -        else if ((m = pattern.match(dotStarRE))) {
      -            fastTest = dotStarTest;
      -        }
      -        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
      -        if (fastTest && typeof re === 'object') {
      -            // Avoids overriding in frozen environments
      -            Reflect.defineProperty(re, 'test', { value: fastTest });
      -        }
      -        return re;
      -    }
      -    makeRe() {
      -        if (this.regexp || this.regexp === false)
      -            return this.regexp;
      -        // at this point, this.set is a 2d array of partial
      -        // pattern strings, or "**".
      -        //
      -        // It's better to use .match().  This function shouldn't
      -        // be used, really, but it's pretty convenient sometimes,
      -        // when you just want to work with a regex.
      -        const set = this.set;
      -        if (!set.length) {
      -            this.regexp = false;
      -            return this.regexp;
      -        }
      -        const options = this.options;
      -        const twoStar = options.noglobstar
      -            ? star
      -            : options.dot
      -                ? twoStarDot
      -                : twoStarNoDot;
      -        const flags = new Set(options.nocase ? ['i'] : []);
      -        // regexpify non-globstar patterns
      -        // if ** is only item, then we just do one twoStar
      -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
      -        // if ** is last, append (\/twoStar|) to previous
      -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
      -        // then filter out GLOBSTAR symbols
      -        let re = set
      -            .map(pattern => {
      -            const pp = pattern.map(p => {
      -                if (p instanceof RegExp) {
      -                    for (const f of p.flags.split(''))
      -                        flags.add(f);
      -                }
      -                return typeof p === 'string'
      -                    ? regExpEscape(p)
      -                    : p === exports.GLOBSTAR
      -                        ? exports.GLOBSTAR
      -                        : p._src;
      -            });
      -            pp.forEach((p, i) => {
      -                const next = pp[i + 1];
      -                const prev = pp[i - 1];
      -                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
      -                    return;
      -                }
      -                if (prev === undefined) {
      -                    if (next !== undefined && next !== exports.GLOBSTAR) {
      -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
      -                    }
      -                    else {
      -                        pp[i] = twoStar;
      -                    }
      -                }
      -                else if (next === undefined) {
      -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
      -                }
      -                else if (next !== exports.GLOBSTAR) {
      -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
      -                    pp[i + 1] = exports.GLOBSTAR;
      -                }
      -            });
      -            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
      -        })
      -            .join('|');
      -        // need to wrap in parens if we had more than one thing with |,
      -        // otherwise only the first will be anchored to ^ and the last to $
      -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
      -        // must match entire pattern
      -        // ending in a * or ** will make it less strict.
      -        re = '^' + open + re + close + '$';
      -        // can match anything, as long as it's not this.
      -        if (this.negate)
      -            re = '^(?!' + re + ').+$';
      -        try {
      -            this.regexp = new RegExp(re, [...flags].join(''));
      -            /* c8 ignore start */
      -        }
      -        catch (ex) {
      -            // should be impossible
      -            this.regexp = false;
      -        }
      -        /* c8 ignore stop */
      -        return this.regexp;
      -    }
      -    slashSplit(p) {
      -        // if p starts with // on windows, we preserve that
      -        // so that UNC paths aren't broken.  Otherwise, any number of
      -        // / characters are coalesced into one, unless
      -        // preserveMultipleSlashes is set to true.
      -        if (this.preserveMultipleSlashes) {
      -            return p.split('/');
      -        }
      -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
      -            // add an extra '' for the one we lose
      -            return ['', ...p.split(/\/+/)];
      -        }
      -        else {
      -            return p.split(/\/+/);
      -        }
      -    }
      -    match(f, partial = this.partial) {
      -        this.debug('match', f, this.pattern);
      -        // short-circuit in the case of busted things.
      -        // comments, etc.
      -        if (this.comment) {
      -            return false;
      -        }
      -        if (this.empty) {
      -            return f === '';
      -        }
      -        if (f === '/' && partial) {
      -            return true;
      -        }
      -        const options = this.options;
      -        // windows: need to use /, not \
      -        if (this.isWindows) {
      -            f = f.split('\\').join('/');
      -        }
      -        // treat the test path as a set of pathparts.
      -        const ff = this.slashSplit(f);
      -        this.debug(this.pattern, 'split', ff);
      -        // just ONE of the pattern sets in this.set needs to match
      -        // in order for it to be valid.  If negating, then just one
      -        // match means that we have failed.
      -        // Either way, return on the first hit.
      -        const set = this.set;
      -        this.debug(this.pattern, 'set', set);
      -        // Find the basename of the path by looking for the last non-empty segment
      -        let filename = ff[ff.length - 1];
      -        if (!filename) {
      -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
      -                filename = ff[i];
      -            }
      -        }
      -        for (let i = 0; i < set.length; i++) {
      -            const pattern = set[i];
      -            let file = ff;
      -            if (options.matchBase && pattern.length === 1) {
      -                file = [filename];
      -            }
      -            const hit = this.matchOne(file, pattern, partial);
      -            if (hit) {
      -                if (options.flipNegate) {
      -                    return true;
      -                }
      -                return !this.negate;
      -            }
      -        }
      -        // didn't get any hits.  this is success if it's a negative
      -        // pattern, failure otherwise.
      -        if (options.flipNegate) {
      -            return false;
      -        }
      -        return this.negate;
      -    }
      -    static defaults(def) {
      -        return exports.minimatch.defaults(def).Minimatch;
      -    }
      -}
      -exports.Minimatch = Minimatch;
      -/* c8 ignore start */
      -var ast_js_2 = require("./ast.js");
      -Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
      -var escape_js_2 = require("./escape.js");
      -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
      -var unescape_js_2 = require("./unescape.js");
      -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
      -/* c8 ignore stop */
      -exports.minimatch.AST = ast_js_1.AST;
      -exports.minimatch.Minimatch = Minimatch;
      -exports.minimatch.escape = escape_js_1.escape;
      -exports.minimatch.unescape = unescape_js_1.unescape;
      -//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/unescape.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/unescape.js
      deleted file mode 100644
      index 47c36bcee5a02a..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/unescape.js
      +++ /dev/null
      @@ -1,24 +0,0 @@
      -"use strict";
      -Object.defineProperty(exports, "__esModule", { value: true });
      -exports.unescape = void 0;
      -/**
      - * Un-escape a string that has been escaped with {@link escape}.
      - *
      - * If the {@link windowsPathsNoEscape} option is used, then square-brace
      - * escapes are removed, but not backslash escapes.  For example, it will turn
      - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
      - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
      - *
      - * When `windowsPathsNoEscape` is not set, then both brace escapes and
      - * backslash escapes are removed.
      - *
      - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      - * or unescaped.
      - */
      -const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
      -    return windowsPathsNoEscape
      -        ? s.replace(/\[([^\/\\])\]/g, '$1')
      -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
      -};
      -exports.unescape = unescape;
      -//# sourceMappingURL=unescape.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/assert-valid-pattern.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/assert-valid-pattern.js
      deleted file mode 100644
      index 7b534fc30200bb..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/assert-valid-pattern.js
      +++ /dev/null
      @@ -1,10 +0,0 @@
      -const MAX_PATTERN_LENGTH = 1024 * 64;
      -export const assertValidPattern = (pattern) => {
      -    if (typeof pattern !== 'string') {
      -        throw new TypeError('invalid pattern');
      -    }
      -    if (pattern.length > MAX_PATTERN_LENGTH) {
      -        throw new TypeError('pattern is too long');
      -    }
      -};
      -//# sourceMappingURL=assert-valid-pattern.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/ast.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/ast.js
      deleted file mode 100644
      index 02c6bda68427fc..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/ast.js
      +++ /dev/null
      @@ -1,588 +0,0 @@
      -// parse a single path portion
      -import { parseClass } from './brace-expressions.js';
      -import { unescape } from './unescape.js';
      -const types = new Set(['!', '?', '+', '*', '@']);
      -const isExtglobType = (c) => types.has(c);
      -// Patterns that get prepended to bind to the start of either the
      -// entire string, or just a single path portion, to prevent dots
      -// and/or traversal patterns, when needed.
      -// Exts don't need the ^ or / bit, because the root binds that already.
      -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
      -const startNoDot = '(?!\\.)';
      -// characters that indicate a start of pattern needs the "no dots" bit,
      -// because a dot *might* be matched. ( is not in the list, because in
      -// the case of a child extglob, it will handle the prevention itself.
      -const addPatternStart = new Set(['[', '.']);
      -// cases where traversal is A-OK, no dot prevention needed
      -const justDots = new Set(['..', '.']);
      -const reSpecials = new Set('().*{}+?[]^$\\!');
      -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      -// any single thing other than /
      -const qmark = '[^/]';
      -// * => any number of characters
      -const star = qmark + '*?';
      -// use + when we need to ensure that *something* matches, because the * is
      -// the only thing in the path portion.
      -const starNoEmpty = qmark + '+?';
      -// remove the \ chars that we added if we end up doing a nonmagic compare
      -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
      -export class AST {
      -    type;
      -    #root;
      -    #hasMagic;
      -    #uflag = false;
      -    #parts = [];
      -    #parent;
      -    #parentIndex;
      -    #negs;
      -    #filledNegs = false;
      -    #options;
      -    #toString;
      -    // set to true if it's an extglob with no children
      -    // (which really means one child of '')
      -    #emptyExt = false;
      -    constructor(type, parent, options = {}) {
      -        this.type = type;
      -        // extglobs are inherently magical
      -        if (type)
      -            this.#hasMagic = true;
      -        this.#parent = parent;
      -        this.#root = this.#parent ? this.#parent.#root : this;
      -        this.#options = this.#root === this ? options : this.#root.#options;
      -        this.#negs = this.#root === this ? [] : this.#root.#negs;
      -        if (type === '!' && !this.#root.#filledNegs)
      -            this.#negs.push(this);
      -        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
      -    }
      -    get hasMagic() {
      -        /* c8 ignore start */
      -        if (this.#hasMagic !== undefined)
      -            return this.#hasMagic;
      -        /* c8 ignore stop */
      -        for (const p of this.#parts) {
      -            if (typeof p === 'string')
      -                continue;
      -            if (p.type || p.hasMagic)
      -                return (this.#hasMagic = true);
      -        }
      -        // note: will be undefined until we generate the regexp src and find out
      -        return this.#hasMagic;
      -    }
      -    // reconstructs the pattern
      -    toString() {
      -        if (this.#toString !== undefined)
      -            return this.#toString;
      -        if (!this.type) {
      -            return (this.#toString = this.#parts.map(p => String(p)).join(''));
      -        }
      -        else {
      -            return (this.#toString =
      -                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
      -        }
      -    }
      -    #fillNegs() {
      -        /* c8 ignore start */
      -        if (this !== this.#root)
      -            throw new Error('should only call on root');
      -        if (this.#filledNegs)
      -            return this;
      -        /* c8 ignore stop */
      -        // call toString() once to fill this out
      -        this.toString();
      -        this.#filledNegs = true;
      -        let n;
      -        while ((n = this.#negs.pop())) {
      -            if (n.type !== '!')
      -                continue;
      -            // walk up the tree, appending everthing that comes AFTER parentIndex
      -            let p = n;
      -            let pp = p.#parent;
      -            while (pp) {
      -                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
      -                    for (const part of n.#parts) {
      -                        /* c8 ignore start */
      -                        if (typeof part === 'string') {
      -                            throw new Error('string part in extglob AST??');
      -                        }
      -                        /* c8 ignore stop */
      -                        part.copyIn(pp.#parts[i]);
      -                    }
      -                }
      -                p = pp;
      -                pp = p.#parent;
      -            }
      -        }
      -        return this;
      -    }
      -    push(...parts) {
      -        for (const p of parts) {
      -            if (p === '')
      -                continue;
      -            /* c8 ignore start */
      -            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
      -                throw new Error('invalid part: ' + p);
      -            }
      -            /* c8 ignore stop */
      -            this.#parts.push(p);
      -        }
      -    }
      -    toJSON() {
      -        const ret = this.type === null
      -            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
      -            : [this.type, ...this.#parts.map(p => p.toJSON())];
      -        if (this.isStart() && !this.type)
      -            ret.unshift([]);
      -        if (this.isEnd() &&
      -            (this === this.#root ||
      -                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
      -            ret.push({});
      -        }
      -        return ret;
      -    }
      -    isStart() {
      -        if (this.#root === this)
      -            return true;
      -        // if (this.type) return !!this.#parent?.isStart()
      -        if (!this.#parent?.isStart())
      -            return false;
      -        if (this.#parentIndex === 0)
      -            return true;
      -        // if everything AHEAD of this is a negation, then it's still the "start"
      -        const p = this.#parent;
      -        for (let i = 0; i < this.#parentIndex; i++) {
      -            const pp = p.#parts[i];
      -            if (!(pp instanceof AST && pp.type === '!')) {
      -                return false;
      -            }
      -        }
      -        return true;
      -    }
      -    isEnd() {
      -        if (this.#root === this)
      -            return true;
      -        if (this.#parent?.type === '!')
      -            return true;
      -        if (!this.#parent?.isEnd())
      -            return false;
      -        if (!this.type)
      -            return this.#parent?.isEnd();
      -        // if not root, it'll always have a parent
      -        /* c8 ignore start */
      -        const pl = this.#parent ? this.#parent.#parts.length : 0;
      -        /* c8 ignore stop */
      -        return this.#parentIndex === pl - 1;
      -    }
      -    copyIn(part) {
      -        if (typeof part === 'string')
      -            this.push(part);
      -        else
      -            this.push(part.clone(this));
      -    }
      -    clone(parent) {
      -        const c = new AST(this.type, parent);
      -        for (const p of this.#parts) {
      -            c.copyIn(p);
      -        }
      -        return c;
      -    }
      -    static #parseAST(str, ast, pos, opt) {
      -        let escaping = false;
      -        let inBrace = false;
      -        let braceStart = -1;
      -        let braceNeg = false;
      -        if (ast.type === null) {
      -            // outside of a extglob, append until we find a start
      -            let i = pos;
      -            let acc = '';
      -            while (i < str.length) {
      -                const c = str.charAt(i++);
      -                // still accumulate escapes at this point, but we do ignore
      -                // starts that are escaped
      -                if (escaping || c === '\\') {
      -                    escaping = !escaping;
      -                    acc += c;
      -                    continue;
      -                }
      -                if (inBrace) {
      -                    if (i === braceStart + 1) {
      -                        if (c === '^' || c === '!') {
      -                            braceNeg = true;
      -                        }
      -                    }
      -                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
      -                        inBrace = false;
      -                    }
      -                    acc += c;
      -                    continue;
      -                }
      -                else if (c === '[') {
      -                    inBrace = true;
      -                    braceStart = i;
      -                    braceNeg = false;
      -                    acc += c;
      -                    continue;
      -                }
      -                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
      -                    ast.push(acc);
      -                    acc = '';
      -                    const ext = new AST(c, ast);
      -                    i = AST.#parseAST(str, ext, i, opt);
      -                    ast.push(ext);
      -                    continue;
      -                }
      -                acc += c;
      -            }
      -            ast.push(acc);
      -            return i;
      -        }
      -        // some kind of extglob, pos is at the (
      -        // find the next | or )
      -        let i = pos + 1;
      -        let part = new AST(null, ast);
      -        const parts = [];
      -        let acc = '';
      -        while (i < str.length) {
      -            const c = str.charAt(i++);
      -            // still accumulate escapes at this point, but we do ignore
      -            // starts that are escaped
      -            if (escaping || c === '\\') {
      -                escaping = !escaping;
      -                acc += c;
      -                continue;
      -            }
      -            if (inBrace) {
      -                if (i === braceStart + 1) {
      -                    if (c === '^' || c === '!') {
      -                        braceNeg = true;
      -                    }
      -                }
      -                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
      -                    inBrace = false;
      -                }
      -                acc += c;
      -                continue;
      -            }
      -            else if (c === '[') {
      -                inBrace = true;
      -                braceStart = i;
      -                braceNeg = false;
      -                acc += c;
      -                continue;
      -            }
      -            if (isExtglobType(c) && str.charAt(i) === '(') {
      -                part.push(acc);
      -                acc = '';
      -                const ext = new AST(c, part);
      -                part.push(ext);
      -                i = AST.#parseAST(str, ext, i, opt);
      -                continue;
      -            }
      -            if (c === '|') {
      -                part.push(acc);
      -                acc = '';
      -                parts.push(part);
      -                part = new AST(null, ast);
      -                continue;
      -            }
      -            if (c === ')') {
      -                if (acc === '' && ast.#parts.length === 0) {
      -                    ast.#emptyExt = true;
      -                }
      -                part.push(acc);
      -                acc = '';
      -                ast.push(...parts, part);
      -                return i;
      -            }
      -            acc += c;
      -        }
      -        // unfinished extglob
      -        // if we got here, it was a malformed extglob! not an extglob, but
      -        // maybe something else in there.
      -        ast.type = null;
      -        ast.#hasMagic = undefined;
      -        ast.#parts = [str.substring(pos - 1)];
      -        return i;
      -    }
      -    static fromGlob(pattern, options = {}) {
      -        const ast = new AST(null, undefined, options);
      -        AST.#parseAST(pattern, ast, 0, options);
      -        return ast;
      -    }
      -    // returns the regular expression if there's magic, or the unescaped
      -    // string if not.
      -    toMMPattern() {
      -        // should only be called on root
      -        /* c8 ignore start */
      -        if (this !== this.#root)
      -            return this.#root.toMMPattern();
      -        /* c8 ignore stop */
      -        const glob = this.toString();
      -        const [re, body, hasMagic, uflag] = this.toRegExpSource();
      -        // if we're in nocase mode, and not nocaseMagicOnly, then we do
      -        // still need a regular expression if we have to case-insensitively
      -        // match capital/lowercase characters.
      -        const anyMagic = hasMagic ||
      -            this.#hasMagic ||
      -            (this.#options.nocase &&
      -                !this.#options.nocaseMagicOnly &&
      -                glob.toUpperCase() !== glob.toLowerCase());
      -        if (!anyMagic) {
      -            return body;
      -        }
      -        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
      -        return Object.assign(new RegExp(`^${re}$`, flags), {
      -            _src: re,
      -            _glob: glob,
      -        });
      -    }
      -    get options() {
      -        return this.#options;
      -    }
      -    // returns the string match, the regexp source, whether there's magic
      -    // in the regexp (so a regular expression is required) and whether or
      -    // not the uflag is needed for the regular expression (for posix classes)
      -    // TODO: instead of injecting the start/end at this point, just return
      -    // the BODY of the regexp, along with the start/end portions suitable
      -    // for binding the start/end in either a joined full-path makeRe context
      -    // (where we bind to (^|/), or a standalone matchPart context (where
      -    // we bind to ^, and not /).  Otherwise slashes get duped!
      -    //
      -    // In part-matching mode, the start is:
      -    // - if not isStart: nothing
      -    // - if traversal possible, but not allowed: ^(?!\.\.?$)
      -    // - if dots allowed or not possible: ^
      -    // - if dots possible and not allowed: ^(?!\.)
      -    // end is:
      -    // - if not isEnd(): nothing
      -    // - else: $
      -    //
      -    // In full-path matching mode, we put the slash at the START of the
      -    // pattern, so start is:
      -    // - if first pattern: same as part-matching mode
      -    // - if not isStart(): nothing
      -    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
      -    // - if dots allowed or not possible: /
      -    // - if dots possible and not allowed: /(?!\.)
      -    // end is:
      -    // - if last pattern, same as part-matching mode
      -    // - else nothing
      -    //
      -    // Always put the (?:$|/) on negated tails, though, because that has to be
      -    // there to bind the end of the negated pattern portion, and it's easier to
      -    // just stick it in now rather than try to inject it later in the middle of
      -    // the pattern.
      -    //
      -    // We can just always return the same end, and leave it up to the caller
      -    // to know whether it's going to be used joined or in parts.
      -    // And, if the start is adjusted slightly, can do the same there:
      -    // - if not isStart: nothing
      -    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
      -    // - if dots allowed or not possible: (?:/|^)
      -    // - if dots possible and not allowed: (?:/|^)(?!\.)
      -    //
      -    // But it's better to have a simpler binding without a conditional, for
      -    // performance, so probably better to return both start options.
      -    //
      -    // Then the caller just ignores the end if it's not the first pattern,
      -    // and the start always gets applied.
      -    //
      -    // But that's always going to be $ if it's the ending pattern, or nothing,
      -    // so the caller can just attach $ at the end of the pattern when building.
      -    //
      -    // So the todo is:
      -    // - better detect what kind of start is needed
      -    // - return both flavors of starting pattern
      -    // - attach $ at the end of the pattern when creating the actual RegExp
      -    //
      -    // Ah, but wait, no, that all only applies to the root when the first pattern
      -    // is not an extglob. If the first pattern IS an extglob, then we need all
      -    // that dot prevention biz to live in the extglob portions, because eg
      -    // +(*|.x*) can match .xy but not .yx.
      -    //
      -    // So, return the two flavors if it's #root and the first child is not an
      -    // AST, otherwise leave it to the child AST to handle it, and there,
      -    // use the (?:^|/) style of start binding.
      -    //
      -    // Even simplified further:
      -    // - Since the start for a join is eg /(?!\.) and the start for a part
      -    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
      -    // or start or whatever) and prepend ^ or / at the Regexp construction.
      -    toRegExpSource(allowDot) {
      -        const dot = allowDot ?? !!this.#options.dot;
      -        if (this.#root === this)
      -            this.#fillNegs();
      -        if (!this.type) {
      -            const noEmpty = this.isStart() && this.isEnd();
      -            const src = this.#parts
      -                .map(p => {
      -                const [re, _, hasMagic, uflag] = typeof p === 'string'
      -                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
      -                    : p.toRegExpSource(allowDot);
      -                this.#hasMagic = this.#hasMagic || hasMagic;
      -                this.#uflag = this.#uflag || uflag;
      -                return re;
      -            })
      -                .join('');
      -            let start = '';
      -            if (this.isStart()) {
      -                if (typeof this.#parts[0] === 'string') {
      -                    // this is the string that will match the start of the pattern,
      -                    // so we need to protect against dots and such.
      -                    // '.' and '..' cannot match unless the pattern is that exactly,
      -                    // even if it starts with . or dot:true is set.
      -                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
      -                    if (!dotTravAllowed) {
      -                        const aps = addPatternStart;
      -                        // check if we have a possibility of matching . or ..,
      -                        // and prevent that.
      -                        const needNoTrav =
      -                        // dots are allowed, and the pattern starts with [ or .
      -                        (dot && aps.has(src.charAt(0))) ||
      -                            // the pattern starts with \., and then [ or .
      -                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
      -                            // the pattern starts with \.\., and then [ or .
      -                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
      -                        // no need to prevent dots if it can't match a dot, or if a
      -                        // sub-pattern will be preventing it anyway.
      -                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
      -                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
      -                    }
      -                }
      -            }
      -            // append the "end of path portion" pattern to negation tails
      -            let end = '';
      -            if (this.isEnd() &&
      -                this.#root.#filledNegs &&
      -                this.#parent?.type === '!') {
      -                end = '(?:$|\\/)';
      -            }
      -            const final = start + src + end;
      -            return [
      -                final,
      -                unescape(src),
      -                (this.#hasMagic = !!this.#hasMagic),
      -                this.#uflag,
      -            ];
      -        }
      -        // We need to calculate the body *twice* if it's a repeat pattern
      -        // at the start, once in nodot mode, then again in dot mode, so a
      -        // pattern like *(?) can match 'x.y'
      -        const repeated = this.type === '*' || this.type === '+';
      -        // some kind of extglob
      -        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
      -        let body = this.#partsToRegExp(dot);
      -        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
      -            // invalid extglob, has to at least be *something* present, if it's
      -            // the entire path portion.
      -            const s = this.toString();
      -            this.#parts = [s];
      -            this.type = null;
      -            this.#hasMagic = undefined;
      -            return [s, unescape(this.toString()), false, false];
      -        }
      -        // XXX abstract out this map method
      -        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
      -            ? ''
      -            : this.#partsToRegExp(true);
      -        if (bodyDotAllowed === body) {
      -            bodyDotAllowed = '';
      -        }
      -        if (bodyDotAllowed) {
      -            body = `(?:${body})(?:${bodyDotAllowed})*?`;
      -        }
      -        // an empty !() is exactly equivalent to a starNoEmpty
      -        let final = '';
      -        if (this.type === '!' && this.#emptyExt) {
      -            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
      -        }
      -        else {
      -            const close = this.type === '!'
      -                ? // !() must match something,but !(x) can match ''
      -                    '))' +
      -                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
      -                        star +
      -                        ')'
      -                : this.type === '@'
      -                    ? ')'
      -                    : this.type === '?'
      -                        ? ')?'
      -                        : this.type === '+' && bodyDotAllowed
      -                            ? ')'
      -                            : this.type === '*' && bodyDotAllowed
      -                                ? `)?`
      -                                : `)${this.type}`;
      -            final = start + body + close;
      -        }
      -        return [
      -            final,
      -            unescape(body),
      -            (this.#hasMagic = !!this.#hasMagic),
      -            this.#uflag,
      -        ];
      -    }
      -    #partsToRegExp(dot) {
      -        return this.#parts
      -            .map(p => {
      -            // extglob ASTs should only contain parent ASTs
      -            /* c8 ignore start */
      -            if (typeof p === 'string') {
      -                throw new Error('string type in extglob ast??');
      -            }
      -            /* c8 ignore stop */
      -            // can ignore hasMagic, because extglobs are already always magic
      -            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
      -            this.#uflag = this.#uflag || uflag;
      -            return re;
      -        })
      -            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
      -            .join('|');
      -    }
      -    static #parseGlob(glob, hasMagic, noEmpty = false) {
      -        let escaping = false;
      -        let re = '';
      -        let uflag = false;
      -        for (let i = 0; i < glob.length; i++) {
      -            const c = glob.charAt(i);
      -            if (escaping) {
      -                escaping = false;
      -                re += (reSpecials.has(c) ? '\\' : '') + c;
      -                continue;
      -            }
      -            if (c === '\\') {
      -                if (i === glob.length - 1) {
      -                    re += '\\\\';
      -                }
      -                else {
      -                    escaping = true;
      -                }
      -                continue;
      -            }
      -            if (c === '[') {
      -                const [src, needUflag, consumed, magic] = parseClass(glob, i);
      -                if (consumed) {
      -                    re += src;
      -                    uflag = uflag || needUflag;
      -                    i += consumed - 1;
      -                    hasMagic = hasMagic || magic;
      -                    continue;
      -                }
      -            }
      -            if (c === '*') {
      -                if (noEmpty && glob === '*')
      -                    re += starNoEmpty;
      -                else
      -                    re += star;
      -                hasMagic = true;
      -                continue;
      -            }
      -            if (c === '?') {
      -                re += qmark;
      -                hasMagic = true;
      -                continue;
      -            }
      -            re += regExpEscape(c);
      -        }
      -        return [re, unescape(glob), !!hasMagic, uflag];
      -    }
      -}
      -//# sourceMappingURL=ast.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/brace-expressions.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/brace-expressions.js
      deleted file mode 100644
      index c629d6ae816e27..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/brace-expressions.js
      +++ /dev/null
      @@ -1,148 +0,0 @@
      -// translate the various posix character classes into unicode properties
      -// this works across all unicode locales
      -// { : [, /u flag required, negated]
      -const posixClasses = {
      -    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
      -    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
      -    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
      -    '[:blank:]': ['\\p{Zs}\\t', true],
      -    '[:cntrl:]': ['\\p{Cc}', true],
      -    '[:digit:]': ['\\p{Nd}', true],
      -    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
      -    '[:lower:]': ['\\p{Ll}', true],
      -    '[:print:]': ['\\p{C}', true],
      -    '[:punct:]': ['\\p{P}', true],
      -    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
      -    '[:upper:]': ['\\p{Lu}', true],
      -    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
      -    '[:xdigit:]': ['A-Fa-f0-9', false],
      -};
      -// only need to escape a few things inside of brace expressions
      -// escapes: [ \ ] -
      -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
      -// escape all regexp magic characters
      -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      -// everything has already been escaped, we just have to join
      -const rangesToString = (ranges) => ranges.join('');
      -// takes a glob string at a posix brace expression, and returns
      -// an equivalent regular expression source, and boolean indicating
      -// whether the /u flag needs to be applied, and the number of chars
      -// consumed to parse the character class.
      -// This also removes out of order ranges, and returns ($.) if the
      -// entire class just no good.
      -export const parseClass = (glob, position) => {
      -    const pos = position;
      -    /* c8 ignore start */
      -    if (glob.charAt(pos) !== '[') {
      -        throw new Error('not in a brace expression');
      -    }
      -    /* c8 ignore stop */
      -    const ranges = [];
      -    const negs = [];
      -    let i = pos + 1;
      -    let sawStart = false;
      -    let uflag = false;
      -    let escaping = false;
      -    let negate = false;
      -    let endPos = pos;
      -    let rangeStart = '';
      -    WHILE: while (i < glob.length) {
      -        const c = glob.charAt(i);
      -        if ((c === '!' || c === '^') && i === pos + 1) {
      -            negate = true;
      -            i++;
      -            continue;
      -        }
      -        if (c === ']' && sawStart && !escaping) {
      -            endPos = i + 1;
      -            break;
      -        }
      -        sawStart = true;
      -        if (c === '\\') {
      -            if (!escaping) {
      -                escaping = true;
      -                i++;
      -                continue;
      -            }
      -            // escaped \ char, fall through and treat like normal char
      -        }
      -        if (c === '[' && !escaping) {
      -            // either a posix class, a collation equivalent, or just a [
      -            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
      -                if (glob.startsWith(cls, i)) {
      -                    // invalid, [a-[] is fine, but not [a-[:alpha]]
      -                    if (rangeStart) {
      -                        return ['$.', false, glob.length - pos, true];
      -                    }
      -                    i += cls.length;
      -                    if (neg)
      -                        negs.push(unip);
      -                    else
      -                        ranges.push(unip);
      -                    uflag = uflag || u;
      -                    continue WHILE;
      -                }
      -            }
      -        }
      -        // now it's just a normal character, effectively
      -        escaping = false;
      -        if (rangeStart) {
      -            // throw this range away if it's not valid, but others
      -            // can still match.
      -            if (c > rangeStart) {
      -                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
      -            }
      -            else if (c === rangeStart) {
      -                ranges.push(braceEscape(c));
      -            }
      -            rangeStart = '';
      -            i++;
      -            continue;
      -        }
      -        // now might be the start of a range.
      -        // can be either c-d or c-] or c] or c] at this point
      -        if (glob.startsWith('-]', i + 1)) {
      -            ranges.push(braceEscape(c + '-'));
      -            i += 2;
      -            continue;
      -        }
      -        if (glob.startsWith('-', i + 1)) {
      -            rangeStart = c;
      -            i += 2;
      -            continue;
      -        }
      -        // not the start of a range, just a single character
      -        ranges.push(braceEscape(c));
      -        i++;
      -    }
      -    if (endPos < i) {
      -        // didn't see the end of the class, not a valid class,
      -        // but might still be valid as a literal match.
      -        return ['', false, 0, false];
      -    }
      -    // if we got no ranges and no negates, then we have a range that
      -    // cannot possibly match anything, and that poisons the whole glob
      -    if (!ranges.length && !negs.length) {
      -        return ['$.', false, glob.length - pos, true];
      -    }
      -    // if we got one positive range, and it's a single character, then that's
      -    // not actually a magic pattern, it's just that one literal character.
      -    // we should not treat that as "magic", we should just return the literal
      -    // character. [_] is a perfectly valid way to escape glob magic chars.
      -    if (negs.length === 0 &&
      -        ranges.length === 1 &&
      -        /^\\?.$/.test(ranges[0]) &&
      -        !negate) {
      -        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
      -        return [regexpEscape(r), false, endPos - pos, false];
      -    }
      -    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
      -    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
      -    const comb = ranges.length && negs.length
      -        ? '(' + sranges + '|' + snegs + ')'
      -        : ranges.length
      -            ? sranges
      -            : snegs;
      -    return [comb, uflag, endPos - pos, true];
      -};
      -//# sourceMappingURL=brace-expressions.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/escape.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/escape.js
      deleted file mode 100644
      index 16f7c8c7bdc646..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/escape.js
      +++ /dev/null
      @@ -1,18 +0,0 @@
      -/**
      - * Escape all magic characters in a glob pattern.
      - *
      - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
      - * option is used, then characters are escaped by wrapping in `[]`, because
      - * a magic character wrapped in a character class can only be satisfied by
      - * that exact character.  In this mode, `\` is _not_ escaped, because it is
      - * not interpreted as a magic character, but instead as a path separator.
      - */
      -export const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
      -    // don't need to escape +@! because we escape the parens
      -    // that make those magic, and escaping ! as [!] isn't valid,
      -    // because [!]] is a valid glob class meaning not ']'.
      -    return windowsPathsNoEscape
      -        ? s.replace(/[?*()[\]]/g, '[$&]')
      -        : s.replace(/[?*()[\]\\]/g, '\\$&');
      -};
      -//# sourceMappingURL=escape.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/index.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/index.js
      deleted file mode 100644
      index 84b577b0472cb6..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/index.js
      +++ /dev/null
      @@ -1,1001 +0,0 @@
      -import expand from 'brace-expansion';
      -import { assertValidPattern } from './assert-valid-pattern.js';
      -import { AST } from './ast.js';
      -import { escape } from './escape.js';
      -import { unescape } from './unescape.js';
      -export const minimatch = (p, pattern, options = {}) => {
      -    assertValidPattern(pattern);
      -    // shortcut: comments match nothing.
      -    if (!options.nocomment && pattern.charAt(0) === '#') {
      -        return false;
      -    }
      -    return new Minimatch(pattern, options).match(p);
      -};
      -// Optimized checking for the most common glob patterns.
      -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
      -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
      -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
      -const starDotExtTestNocase = (ext) => {
      -    ext = ext.toLowerCase();
      -    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
      -};
      -const starDotExtTestNocaseDot = (ext) => {
      -    ext = ext.toLowerCase();
      -    return (f) => f.toLowerCase().endsWith(ext);
      -};
      -const starDotStarRE = /^\*+\.\*+$/;
      -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
      -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
      -const dotStarRE = /^\.\*+$/;
      -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
      -const starRE = /^\*+$/;
      -const starTest = (f) => f.length !== 0 && !f.startsWith('.');
      -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
      -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
      -const qmarksTestNocase = ([$0, ext = '']) => {
      -    const noext = qmarksTestNoExt([$0]);
      -    if (!ext)
      -        return noext;
      -    ext = ext.toLowerCase();
      -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
      -};
      -const qmarksTestNocaseDot = ([$0, ext = '']) => {
      -    const noext = qmarksTestNoExtDot([$0]);
      -    if (!ext)
      -        return noext;
      -    ext = ext.toLowerCase();
      -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
      -};
      -const qmarksTestDot = ([$0, ext = '']) => {
      -    const noext = qmarksTestNoExtDot([$0]);
      -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
      -};
      -const qmarksTest = ([$0, ext = '']) => {
      -    const noext = qmarksTestNoExt([$0]);
      -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
      -};
      -const qmarksTestNoExt = ([$0]) => {
      -    const len = $0.length;
      -    return (f) => f.length === len && !f.startsWith('.');
      -};
      -const qmarksTestNoExtDot = ([$0]) => {
      -    const len = $0.length;
      -    return (f) => f.length === len && f !== '.' && f !== '..';
      -};
      -/* c8 ignore start */
      -const defaultPlatform = (typeof process === 'object' && process
      -    ? (typeof process.env === 'object' &&
      -        process.env &&
      -        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
      -        process.platform
      -    : 'posix');
      -const path = {
      -    win32: { sep: '\\' },
      -    posix: { sep: '/' },
      -};
      -/* c8 ignore stop */
      -export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
      -minimatch.sep = sep;
      -export const GLOBSTAR = Symbol('globstar **');
      -minimatch.GLOBSTAR = GLOBSTAR;
      -// any single thing other than /
      -// don't need to escape / when using new RegExp()
      -const qmark = '[^/]';
      -// * => any number of characters
      -const star = qmark + '*?';
      -// ** when dots are allowed.  Anything goes, except .. and .
      -// not (^ or / followed by one or two dots followed by $ or /),
      -// followed by anything, any number of times.
      -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
      -// not a ^ or / followed by a dot,
      -// followed by anything, any number of times.
      -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
      -export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
      -minimatch.filter = filter;
      -const ext = (a, b = {}) => Object.assign({}, a, b);
      -export const defaults = (def) => {
      -    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
      -        return minimatch;
      -    }
      -    const orig = minimatch;
      -    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
      -    return Object.assign(m, {
      -        Minimatch: class Minimatch extends orig.Minimatch {
      -            constructor(pattern, options = {}) {
      -                super(pattern, ext(def, options));
      -            }
      -            static defaults(options) {
      -                return orig.defaults(ext(def, options)).Minimatch;
      -            }
      -        },
      -        AST: class AST extends orig.AST {
      -            /* c8 ignore start */
      -            constructor(type, parent, options = {}) {
      -                super(type, parent, ext(def, options));
      -            }
      -            /* c8 ignore stop */
      -            static fromGlob(pattern, options = {}) {
      -                return orig.AST.fromGlob(pattern, ext(def, options));
      -            }
      -        },
      -        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
      -        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
      -        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
      -        defaults: (options) => orig.defaults(ext(def, options)),
      -        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
      -        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
      -        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
      -        sep: orig.sep,
      -        GLOBSTAR: GLOBSTAR,
      -    });
      -};
      -minimatch.defaults = defaults;
      -// Brace expansion:
      -// a{b,c}d -> abd acd
      -// a{b,}c -> abc ac
      -// a{0..3}d -> a0d a1d a2d a3d
      -// a{b,c{d,e}f}g -> abg acdfg acefg
      -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
      -//
      -// Invalid sets are not expanded.
      -// a{2..}b -> a{2..}b
      -// a{b}c -> a{b}c
      -export const braceExpand = (pattern, options = {}) => {
      -    assertValidPattern(pattern);
      -    // Thanks to Yeting Li  for
      -    // improving this regexp to avoid a ReDOS vulnerability.
      -    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
      -        // shortcut. no need to expand.
      -        return [pattern];
      -    }
      -    return expand(pattern);
      -};
      -minimatch.braceExpand = braceExpand;
      -// parse a component of the expanded set.
      -// At this point, no pattern may contain "/" in it
      -// so we're going to return a 2d array, where each entry is the full
      -// pattern, split on '/', and then turned into a regular expression.
      -// A regexp is made at the end which joins each array with an
      -// escaped /, and another full one which joins each regexp with |.
      -//
      -// Following the lead of Bash 4.1, note that "**" only has special meaning
      -// when it is the *only* thing in a path portion.  Otherwise, any series
      -// of * is equivalent to a single *.  Globstar behavior is enabled by
      -// default, and can be disabled by setting options.noglobstar.
      -export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
      -minimatch.makeRe = makeRe;
      -export const match = (list, pattern, options = {}) => {
      -    const mm = new Minimatch(pattern, options);
      -    list = list.filter(f => mm.match(f));
      -    if (mm.options.nonull && !list.length) {
      -        list.push(pattern);
      -    }
      -    return list;
      -};
      -minimatch.match = match;
      -// replace stuff like \* with *
      -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
      -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      -export class Minimatch {
      -    options;
      -    set;
      -    pattern;
      -    windowsPathsNoEscape;
      -    nonegate;
      -    negate;
      -    comment;
      -    empty;
      -    preserveMultipleSlashes;
      -    partial;
      -    globSet;
      -    globParts;
      -    nocase;
      -    isWindows;
      -    platform;
      -    windowsNoMagicRoot;
      -    regexp;
      -    constructor(pattern, options = {}) {
      -        assertValidPattern(pattern);
      -        options = options || {};
      -        this.options = options;
      -        this.pattern = pattern;
      -        this.platform = options.platform || defaultPlatform;
      -        this.isWindows = this.platform === 'win32';
      -        this.windowsPathsNoEscape =
      -            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
      -        if (this.windowsPathsNoEscape) {
      -            this.pattern = this.pattern.replace(/\\/g, '/');
      -        }
      -        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
      -        this.regexp = null;
      -        this.negate = false;
      -        this.nonegate = !!options.nonegate;
      -        this.comment = false;
      -        this.empty = false;
      -        this.partial = !!options.partial;
      -        this.nocase = !!this.options.nocase;
      -        this.windowsNoMagicRoot =
      -            options.windowsNoMagicRoot !== undefined
      -                ? options.windowsNoMagicRoot
      -                : !!(this.isWindows && this.nocase);
      -        this.globSet = [];
      -        this.globParts = [];
      -        this.set = [];
      -        // make the set of regexps etc.
      -        this.make();
      -    }
      -    hasMagic() {
      -        if (this.options.magicalBraces && this.set.length > 1) {
      -            return true;
      -        }
      -        for (const pattern of this.set) {
      -            for (const part of pattern) {
      -                if (typeof part !== 'string')
      -                    return true;
      -            }
      -        }
      -        return false;
      -    }
      -    debug(..._) { }
      -    make() {
      -        const pattern = this.pattern;
      -        const options = this.options;
      -        // empty patterns and comments match nothing.
      -        if (!options.nocomment && pattern.charAt(0) === '#') {
      -            this.comment = true;
      -            return;
      -        }
      -        if (!pattern) {
      -            this.empty = true;
      -            return;
      -        }
      -        // step 1: figure out negation, etc.
      -        this.parseNegate();
      -        // step 2: expand braces
      -        this.globSet = [...new Set(this.braceExpand())];
      -        if (options.debug) {
      -            this.debug = (...args) => console.error(...args);
      -        }
      -        this.debug(this.pattern, this.globSet);
      -        // step 3: now we have a set, so turn each one into a series of
      -        // path-portion matching patterns.
      -        // These will be regexps, except in the case of "**", which is
      -        // set to the GLOBSTAR object for globstar behavior,
      -        // and will not contain any / characters
      -        //
      -        // First, we preprocess to make the glob pattern sets a bit simpler
      -        // and deduped.  There are some perf-killing patterns that can cause
      -        // problems with a glob walk, but we can simplify them down a bit.
      -        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
      -        this.globParts = this.preprocess(rawGlobParts);
      -        this.debug(this.pattern, this.globParts);
      -        // glob --> regexps
      -        let set = this.globParts.map((s, _, __) => {
      -            if (this.isWindows && this.windowsNoMagicRoot) {
      -                // check if it's a drive or unc path.
      -                const isUNC = s[0] === '' &&
      -                    s[1] === '' &&
      -                    (s[2] === '?' || !globMagic.test(s[2])) &&
      -                    !globMagic.test(s[3]);
      -                const isDrive = /^[a-z]:/i.test(s[0]);
      -                if (isUNC) {
      -                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
      -                }
      -                else if (isDrive) {
      -                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
      -                }
      -            }
      -            return s.map(ss => this.parse(ss));
      -        });
      -        this.debug(this.pattern, set);
      -        // filter out everything that didn't compile properly.
      -        this.set = set.filter(s => s.indexOf(false) === -1);
      -        // do not treat the ? in UNC paths as magic
      -        if (this.isWindows) {
      -            for (let i = 0; i < this.set.length; i++) {
      -                const p = this.set[i];
      -                if (p[0] === '' &&
      -                    p[1] === '' &&
      -                    this.globParts[i][2] === '?' &&
      -                    typeof p[3] === 'string' &&
      -                    /^[a-z]:$/i.test(p[3])) {
      -                    p[2] = '?';
      -                }
      -            }
      -        }
      -        this.debug(this.pattern, this.set);
      -    }
      -    // various transforms to equivalent pattern sets that are
      -    // faster to process in a filesystem walk.  The goal is to
      -    // eliminate what we can, and push all ** patterns as far
      -    // to the right as possible, even if it increases the number
      -    // of patterns that we have to process.
      -    preprocess(globParts) {
      -        // if we're not in globstar mode, then turn all ** into *
      -        if (this.options.noglobstar) {
      -            for (let i = 0; i < globParts.length; i++) {
      -                for (let j = 0; j < globParts[i].length; j++) {
      -                    if (globParts[i][j] === '**') {
      -                        globParts[i][j] = '*';
      -                    }
      -                }
      -            }
      -        }
      -        const { optimizationLevel = 1 } = this.options;
      -        if (optimizationLevel >= 2) {
      -            // aggressive optimization for the purpose of fs walking
      -            globParts = this.firstPhasePreProcess(globParts);
      -            globParts = this.secondPhasePreProcess(globParts);
      -        }
      -        else if (optimizationLevel >= 1) {
      -            // just basic optimizations to remove some .. parts
      -            globParts = this.levelOneOptimize(globParts);
      -        }
      -        else {
      -            // just collapse multiple ** portions into one
      -            globParts = this.adjascentGlobstarOptimize(globParts);
      -        }
      -        return globParts;
      -    }
      -    // just get rid of adjascent ** portions
      -    adjascentGlobstarOptimize(globParts) {
      -        return globParts.map(parts => {
      -            let gs = -1;
      -            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
      -                let i = gs;
      -                while (parts[i + 1] === '**') {
      -                    i++;
      -                }
      -                if (i !== gs) {
      -                    parts.splice(gs, i - gs);
      -                }
      -            }
      -            return parts;
      -        });
      -    }
      -    // get rid of adjascent ** and resolve .. portions
      -    levelOneOptimize(globParts) {
      -        return globParts.map(parts => {
      -            parts = parts.reduce((set, part) => {
      -                const prev = set[set.length - 1];
      -                if (part === '**' && prev === '**') {
      -                    return set;
      -                }
      -                if (part === '..') {
      -                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
      -                        set.pop();
      -                        return set;
      -                    }
      -                }
      -                set.push(part);
      -                return set;
      -            }, []);
      -            return parts.length === 0 ? [''] : parts;
      -        });
      -    }
      -    levelTwoFileOptimize(parts) {
      -        if (!Array.isArray(parts)) {
      -            parts = this.slashSplit(parts);
      -        }
      -        let didSomething = false;
      -        do {
      -            didSomething = false;
      -            // 
      // -> 
      /
      -            if (!this.preserveMultipleSlashes) {
      -                for (let i = 1; i < parts.length - 1; i++) {
      -                    const p = parts[i];
      -                    // don't squeeze out UNC patterns
      -                    if (i === 1 && p === '' && parts[0] === '')
      -                        continue;
      -                    if (p === '.' || p === '') {
      -                        didSomething = true;
      -                        parts.splice(i, 1);
      -                        i--;
      -                    }
      -                }
      -                if (parts[0] === '.' &&
      -                    parts.length === 2 &&
      -                    (parts[1] === '.' || parts[1] === '')) {
      -                    didSomething = true;
      -                    parts.pop();
      -                }
      -            }
      -            // 
      /

      /../ ->

      /
      -            let dd = 0;
      -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      -                const p = parts[dd - 1];
      -                if (p && p !== '.' && p !== '..' && p !== '**') {
      -                    didSomething = true;
      -                    parts.splice(dd - 1, 2);
      -                    dd -= 2;
      -                }
      -            }
      -        } while (didSomething);
      -        return parts.length === 0 ? [''] : parts;
      -    }
      -    // First phase: single-pattern processing
      -    // 
       is 1 or more portions
      -    //  is 1 or more portions
      -    // 

      is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} - //

      // -> 
      /
      -    // 
      /

      /../ ->

      /
      -    // **/**/ -> **/
      -    //
      -    // **/*/ -> */**/ <== not valid because ** doesn't follow
      -    // this WOULD be allowed if ** did follow symlinks, or * didn't
      -    firstPhasePreProcess(globParts) {
      -        let didSomething = false;
      -        do {
      -            didSomething = false;
      -            // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

      /**/**/ -> 
      /**/
      -                        gss++;
      -                    }
      -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
      -                    // parts, and can remove 2 of them.
      -                    if (gss > gs) {
      -                        parts.splice(gs + 1, gss - gs);
      -                    }
      -                    let next = parts[gs + 1];
      -                    const p = parts[gs + 2];
      -                    const p2 = parts[gs + 3];
      -                    if (next !== '..')
      -                        continue;
      -                    if (!p ||
      -                        p === '.' ||
      -                        p === '..' ||
      -                        !p2 ||
      -                        p2 === '.' ||
      -                        p2 === '..') {
      -                        continue;
      -                    }
      -                    didSomething = true;
      -                    // edit parts in place, and push the new one
      -                    parts.splice(gs, 1);
      -                    const other = parts.slice(0);
      -                    other[gs] = '**';
      -                    globParts.push(other);
      -                    gs--;
      -                }
      -                // 
      // -> 
      /
      -                if (!this.preserveMultipleSlashes) {
      -                    for (let i = 1; i < parts.length - 1; i++) {
      -                        const p = parts[i];
      -                        // don't squeeze out UNC patterns
      -                        if (i === 1 && p === '' && parts[0] === '')
      -                            continue;
      -                        if (p === '.' || p === '') {
      -                            didSomething = true;
      -                            parts.splice(i, 1);
      -                            i--;
      -                        }
      -                    }
      -                    if (parts[0] === '.' &&
      -                        parts.length === 2 &&
      -                        (parts[1] === '.' || parts[1] === '')) {
      -                        didSomething = true;
      -                        parts.pop();
      -                    }
      -                }
      -                // 
      /

      /../ ->

      /
      -                let dd = 0;
      -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      -                    const p = parts[dd - 1];
      -                    if (p && p !== '.' && p !== '..' && p !== '**') {
      -                        didSomething = true;
      -                        const needDot = dd === 1 && parts[dd + 1] === '**';
      -                        const splin = needDot ? ['.'] : [];
      -                        parts.splice(dd - 1, 2, ...splin);
      -                        if (parts.length === 0)
      -                            parts.push('');
      -                        dd -= 2;
      -                    }
      -                }
      -            }
      -        } while (didSomething);
      -        return globParts;
      -    }
      -    // second phase: multi-pattern dedupes
      -    // {
      /*/,
      /

      /} ->

      /*/
      -    // {
      /,
      /} -> 
      /
      -    // {
      /**/,
      /} -> 
      /**/
      -    //
      -    // {
      /**/,
      /**/

      /} ->

      /**/
      -    // ^-- not valid because ** doens't follow symlinks
      -    secondPhasePreProcess(globParts) {
      -        for (let i = 0; i < globParts.length - 1; i++) {
      -            for (let j = i + 1; j < globParts.length; j++) {
      -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
      -                if (matched) {
      -                    globParts[i] = [];
      -                    globParts[j] = matched;
      -                    break;
      -                }
      -            }
      -        }
      -        return globParts.filter(gs => gs.length);
      -    }
      -    partsMatch(a, b, emptyGSMatch = false) {
      -        let ai = 0;
      -        let bi = 0;
      -        let result = [];
      -        let which = '';
      -        while (ai < a.length && bi < b.length) {
      -            if (a[ai] === b[bi]) {
      -                result.push(which === 'b' ? b[bi] : a[ai]);
      -                ai++;
      -                bi++;
      -            }
      -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
      -                result.push(a[ai]);
      -                ai++;
      -            }
      -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
      -                result.push(b[bi]);
      -                bi++;
      -            }
      -            else if (a[ai] === '*' &&
      -                b[bi] &&
      -                (this.options.dot || !b[bi].startsWith('.')) &&
      -                b[bi] !== '**') {
      -                if (which === 'b')
      -                    return false;
      -                which = 'a';
      -                result.push(a[ai]);
      -                ai++;
      -                bi++;
      -            }
      -            else if (b[bi] === '*' &&
      -                a[ai] &&
      -                (this.options.dot || !a[ai].startsWith('.')) &&
      -                a[ai] !== '**') {
      -                if (which === 'a')
      -                    return false;
      -                which = 'b';
      -                result.push(b[bi]);
      -                ai++;
      -                bi++;
      -            }
      -            else {
      -                return false;
      -            }
      -        }
      -        // if we fall out of the loop, it means they two are identical
      -        // as long as their lengths match
      -        return a.length === b.length && result;
      -    }
      -    parseNegate() {
      -        if (this.nonegate)
      -            return;
      -        const pattern = this.pattern;
      -        let negate = false;
      -        let negateOffset = 0;
      -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
      -            negate = !negate;
      -            negateOffset++;
      -        }
      -        if (negateOffset)
      -            this.pattern = pattern.slice(negateOffset);
      -        this.negate = negate;
      -    }
      -    // set partial to true to test if, for example,
      -    // "/a/b" matches the start of "/*/b/*/d"
      -    // Partial means, if you run out of file before you run
      -    // out of pattern, then that's fine, as long as all
      -    // the parts match.
      -    matchOne(file, pattern, partial = false) {
      -        const options = this.options;
      -        // UNC paths like //?/X:/... can match X:/... and vice versa
      -        // Drive letters in absolute drive or unc paths are always compared
      -        // case-insensitively.
      -        if (this.isWindows) {
      -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
      -            const fileUNC = !fileDrive &&
      -                file[0] === '' &&
      -                file[1] === '' &&
      -                file[2] === '?' &&
      -                /^[a-z]:$/i.test(file[3]);
      -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
      -            const patternUNC = !patternDrive &&
      -                pattern[0] === '' &&
      -                pattern[1] === '' &&
      -                pattern[2] === '?' &&
      -                typeof pattern[3] === 'string' &&
      -                /^[a-z]:$/i.test(pattern[3]);
      -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
      -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
      -            if (typeof fdi === 'number' && typeof pdi === 'number') {
      -                const [fd, pd] = [file[fdi], pattern[pdi]];
      -                if (fd.toLowerCase() === pd.toLowerCase()) {
      -                    pattern[pdi] = fd;
      -                    if (pdi > fdi) {
      -                        pattern = pattern.slice(pdi);
      -                    }
      -                    else if (fdi > pdi) {
      -                        file = file.slice(fdi);
      -                    }
      -                }
      -            }
      -        }
      -        // resolve and reduce . and .. portions in the file as well.
      -        // dont' need to do the second phase, because it's only one string[]
      -        const { optimizationLevel = 1 } = this.options;
      -        if (optimizationLevel >= 2) {
      -            file = this.levelTwoFileOptimize(file);
      -        }
      -        this.debug('matchOne', this, { file, pattern });
      -        this.debug('matchOne', file.length, pattern.length);
      -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
      -            this.debug('matchOne loop');
      -            var p = pattern[pi];
      -            var f = file[fi];
      -            this.debug(pattern, p, f);
      -            // should be impossible.
      -            // some invalid regexp stuff in the set.
      -            /* c8 ignore start */
      -            if (p === false) {
      -                return false;
      -            }
      -            /* c8 ignore stop */
      -            if (p === GLOBSTAR) {
      -                this.debug('GLOBSTAR', [pattern, p, f]);
      -                // "**"
      -                // a/**/b/**/c would match the following:
      -                // a/b/x/y/z/c
      -                // a/x/y/z/b/c
      -                // a/b/x/b/x/c
      -                // a/b/c
      -                // To do this, take the rest of the pattern after
      -                // the **, and see if it would match the file remainder.
      -                // If so, return success.
      -                // If not, the ** "swallows" a segment, and try again.
      -                // This is recursively awful.
      -                //
      -                // a/**/b/**/c matching a/b/x/y/z/c
      -                // - a matches a
      -                // - doublestar
      -                //   - matchOne(b/x/y/z/c, b/**/c)
      -                //     - b matches b
      -                //     - doublestar
      -                //       - matchOne(x/y/z/c, c) -> no
      -                //       - matchOne(y/z/c, c) -> no
      -                //       - matchOne(z/c, c) -> no
      -                //       - matchOne(c, c) yes, hit
      -                var fr = fi;
      -                var pr = pi + 1;
      -                if (pr === pl) {
      -                    this.debug('** at the end');
      -                    // a ** at the end will just swallow the rest.
      -                    // We have found a match.
      -                    // however, it will not swallow /.x, unless
      -                    // options.dot is set.
      -                    // . and .. are *never* matched by **, for explosively
      -                    // exponential reasons.
      -                    for (; fi < fl; fi++) {
      -                        if (file[fi] === '.' ||
      -                            file[fi] === '..' ||
      -                            (!options.dot && file[fi].charAt(0) === '.'))
      -                            return false;
      -                    }
      -                    return true;
      -                }
      -                // ok, let's see if we can swallow whatever we can.
      -                while (fr < fl) {
      -                    var swallowee = file[fr];
      -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
      -                    // XXX remove this slice.  Just pass the start index.
      -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
      -                        this.debug('globstar found match!', fr, fl, swallowee);
      -                        // found a match.
      -                        return true;
      -                    }
      -                    else {
      -                        // can't swallow "." or ".." ever.
      -                        // can only swallow ".foo" when explicitly asked.
      -                        if (swallowee === '.' ||
      -                            swallowee === '..' ||
      -                            (!options.dot && swallowee.charAt(0) === '.')) {
      -                            this.debug('dot detected!', file, fr, pattern, pr);
      -                            break;
      -                        }
      -                        // ** swallows a segment, and continue.
      -                        this.debug('globstar swallow a segment, and continue');
      -                        fr++;
      -                    }
      -                }
      -                // no match was found.
      -                // However, in partial mode, we can't say this is necessarily over.
      -                /* c8 ignore start */
      -                if (partial) {
      -                    // ran out of file
      -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
      -                    if (fr === fl) {
      -                        return true;
      -                    }
      -                }
      -                /* c8 ignore stop */
      -                return false;
      -            }
      -            // something other than **
      -            // non-magic patterns just have to match exactly
      -            // patterns with magic have been turned into regexps.
      -            let hit;
      -            if (typeof p === 'string') {
      -                hit = f === p;
      -                this.debug('string match', p, f, hit);
      -            }
      -            else {
      -                hit = p.test(f);
      -                this.debug('pattern match', p, f, hit);
      -            }
      -            if (!hit)
      -                return false;
      -        }
      -        // Note: ending in / means that we'll get a final ""
      -        // at the end of the pattern.  This can only match a
      -        // corresponding "" at the end of the file.
      -        // If the file ends in /, then it can only match a
      -        // a pattern that ends in /, unless the pattern just
      -        // doesn't have any more for it. But, a/b/ should *not*
      -        // match "a/b/*", even though "" matches against the
      -        // [^/]*? pattern, except in partial mode, where it might
      -        // simply not be reached yet.
      -        // However, a/b/ should still satisfy a/*
      -        // now either we fell off the end of the pattern, or we're done.
      -        if (fi === fl && pi === pl) {
      -            // ran out of pattern and filename at the same time.
      -            // an exact hit!
      -            return true;
      -        }
      -        else if (fi === fl) {
      -            // ran out of file, but still had pattern left.
      -            // this is ok if we're doing the match as part of
      -            // a glob fs traversal.
      -            return partial;
      -        }
      -        else if (pi === pl) {
      -            // ran out of pattern, still have file left.
      -            // this is only acceptable if we're on the very last
      -            // empty segment of a file with a trailing slash.
      -            // a/* should match a/b/
      -            return fi === fl - 1 && file[fi] === '';
      -            /* c8 ignore start */
      -        }
      -        else {
      -            // should be unreachable.
      -            throw new Error('wtf?');
      -        }
      -        /* c8 ignore stop */
      -    }
      -    braceExpand() {
      -        return braceExpand(this.pattern, this.options);
      -    }
      -    parse(pattern) {
      -        assertValidPattern(pattern);
      -        const options = this.options;
      -        // shortcuts
      -        if (pattern === '**')
      -            return GLOBSTAR;
      -        if (pattern === '')
      -            return '';
      -        // far and away, the most common glob pattern parts are
      -        // *, *.*, and *.  Add a fast check method for those.
      -        let m;
      -        let fastTest = null;
      -        if ((m = pattern.match(starRE))) {
      -            fastTest = options.dot ? starTestDot : starTest;
      -        }
      -        else if ((m = pattern.match(starDotExtRE))) {
      -            fastTest = (options.nocase
      -                ? options.dot
      -                    ? starDotExtTestNocaseDot
      -                    : starDotExtTestNocase
      -                : options.dot
      -                    ? starDotExtTestDot
      -                    : starDotExtTest)(m[1]);
      -        }
      -        else if ((m = pattern.match(qmarksRE))) {
      -            fastTest = (options.nocase
      -                ? options.dot
      -                    ? qmarksTestNocaseDot
      -                    : qmarksTestNocase
      -                : options.dot
      -                    ? qmarksTestDot
      -                    : qmarksTest)(m);
      -        }
      -        else if ((m = pattern.match(starDotStarRE))) {
      -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
      -        }
      -        else if ((m = pattern.match(dotStarRE))) {
      -            fastTest = dotStarTest;
      -        }
      -        const re = AST.fromGlob(pattern, this.options).toMMPattern();
      -        if (fastTest && typeof re === 'object') {
      -            // Avoids overriding in frozen environments
      -            Reflect.defineProperty(re, 'test', { value: fastTest });
      -        }
      -        return re;
      -    }
      -    makeRe() {
      -        if (this.regexp || this.regexp === false)
      -            return this.regexp;
      -        // at this point, this.set is a 2d array of partial
      -        // pattern strings, or "**".
      -        //
      -        // It's better to use .match().  This function shouldn't
      -        // be used, really, but it's pretty convenient sometimes,
      -        // when you just want to work with a regex.
      -        const set = this.set;
      -        if (!set.length) {
      -            this.regexp = false;
      -            return this.regexp;
      -        }
      -        const options = this.options;
      -        const twoStar = options.noglobstar
      -            ? star
      -            : options.dot
      -                ? twoStarDot
      -                : twoStarNoDot;
      -        const flags = new Set(options.nocase ? ['i'] : []);
      -        // regexpify non-globstar patterns
      -        // if ** is only item, then we just do one twoStar
      -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
      -        // if ** is last, append (\/twoStar|) to previous
      -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
      -        // then filter out GLOBSTAR symbols
      -        let re = set
      -            .map(pattern => {
      -            const pp = pattern.map(p => {
      -                if (p instanceof RegExp) {
      -                    for (const f of p.flags.split(''))
      -                        flags.add(f);
      -                }
      -                return typeof p === 'string'
      -                    ? regExpEscape(p)
      -                    : p === GLOBSTAR
      -                        ? GLOBSTAR
      -                        : p._src;
      -            });
      -            pp.forEach((p, i) => {
      -                const next = pp[i + 1];
      -                const prev = pp[i - 1];
      -                if (p !== GLOBSTAR || prev === GLOBSTAR) {
      -                    return;
      -                }
      -                if (prev === undefined) {
      -                    if (next !== undefined && next !== GLOBSTAR) {
      -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
      -                    }
      -                    else {
      -                        pp[i] = twoStar;
      -                    }
      -                }
      -                else if (next === undefined) {
      -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
      -                }
      -                else if (next !== GLOBSTAR) {
      -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
      -                    pp[i + 1] = GLOBSTAR;
      -                }
      -            });
      -            return pp.filter(p => p !== GLOBSTAR).join('/');
      -        })
      -            .join('|');
      -        // need to wrap in parens if we had more than one thing with |,
      -        // otherwise only the first will be anchored to ^ and the last to $
      -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
      -        // must match entire pattern
      -        // ending in a * or ** will make it less strict.
      -        re = '^' + open + re + close + '$';
      -        // can match anything, as long as it's not this.
      -        if (this.negate)
      -            re = '^(?!' + re + ').+$';
      -        try {
      -            this.regexp = new RegExp(re, [...flags].join(''));
      -            /* c8 ignore start */
      -        }
      -        catch (ex) {
      -            // should be impossible
      -            this.regexp = false;
      -        }
      -        /* c8 ignore stop */
      -        return this.regexp;
      -    }
      -    slashSplit(p) {
      -        // if p starts with // on windows, we preserve that
      -        // so that UNC paths aren't broken.  Otherwise, any number of
      -        // / characters are coalesced into one, unless
      -        // preserveMultipleSlashes is set to true.
      -        if (this.preserveMultipleSlashes) {
      -            return p.split('/');
      -        }
      -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
      -            // add an extra '' for the one we lose
      -            return ['', ...p.split(/\/+/)];
      -        }
      -        else {
      -            return p.split(/\/+/);
      -        }
      -    }
      -    match(f, partial = this.partial) {
      -        this.debug('match', f, this.pattern);
      -        // short-circuit in the case of busted things.
      -        // comments, etc.
      -        if (this.comment) {
      -            return false;
      -        }
      -        if (this.empty) {
      -            return f === '';
      -        }
      -        if (f === '/' && partial) {
      -            return true;
      -        }
      -        const options = this.options;
      -        // windows: need to use /, not \
      -        if (this.isWindows) {
      -            f = f.split('\\').join('/');
      -        }
      -        // treat the test path as a set of pathparts.
      -        const ff = this.slashSplit(f);
      -        this.debug(this.pattern, 'split', ff);
      -        // just ONE of the pattern sets in this.set needs to match
      -        // in order for it to be valid.  If negating, then just one
      -        // match means that we have failed.
      -        // Either way, return on the first hit.
      -        const set = this.set;
      -        this.debug(this.pattern, 'set', set);
      -        // Find the basename of the path by looking for the last non-empty segment
      -        let filename = ff[ff.length - 1];
      -        if (!filename) {
      -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
      -                filename = ff[i];
      -            }
      -        }
      -        for (let i = 0; i < set.length; i++) {
      -            const pattern = set[i];
      -            let file = ff;
      -            if (options.matchBase && pattern.length === 1) {
      -                file = [filename];
      -            }
      -            const hit = this.matchOne(file, pattern, partial);
      -            if (hit) {
      -                if (options.flipNegate) {
      -                    return true;
      -                }
      -                return !this.negate;
      -            }
      -        }
      -        // didn't get any hits.  this is success if it's a negative
      -        // pattern, failure otherwise.
      -        if (options.flipNegate) {
      -            return false;
      -        }
      -        return this.negate;
      -    }
      -    static defaults(def) {
      -        return minimatch.defaults(def).Minimatch;
      -    }
      -}
      -/* c8 ignore start */
      -export { AST } from './ast.js';
      -export { escape } from './escape.js';
      -export { unescape } from './unescape.js';
      -/* c8 ignore stop */
      -minimatch.AST = AST;
      -minimatch.Minimatch = Minimatch;
      -minimatch.escape = escape;
      -minimatch.unescape = unescape;
      -//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/unescape.js b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/unescape.js
      deleted file mode 100644
      index 0faf9a2b7306f7..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/unescape.js
      +++ /dev/null
      @@ -1,20 +0,0 @@
      -/**
      - * Un-escape a string that has been escaped with {@link escape}.
      - *
      - * If the {@link windowsPathsNoEscape} option is used, then square-brace
      - * escapes are removed, but not backslash escapes.  For example, it will turn
      - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
      - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
      - *
      - * When `windowsPathsNoEscape` is not set, then both brace escapes and
      - * backslash escapes are removed.
      - *
      - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      - * or unescaped.
      - */
      -export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
      -    return windowsPathsNoEscape
      -        ? s.replace(/\[([^\/\\])\]/g, '$1')
      -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
      -};
      -//# sourceMappingURL=unescape.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/package.json b/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/package.json
      deleted file mode 100644
      index 01fc48ecfd6a9f..00000000000000
      --- a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/package.json
      +++ /dev/null
      @@ -1,82 +0,0 @@
      -{
      -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
      -  "name": "minimatch",
      -  "description": "a glob matcher in javascript",
      -  "version": "9.0.5",
      -  "repository": {
      -    "type": "git",
      -    "url": "git://github.com/isaacs/minimatch.git"
      -  },
      -  "main": "./dist/commonjs/index.js",
      -  "types": "./dist/commonjs/index.d.ts",
      -  "exports": {
      -    "./package.json": "./package.json",
      -    ".": {
      -      "import": {
      -        "types": "./dist/esm/index.d.ts",
      -        "default": "./dist/esm/index.js"
      -      },
      -      "require": {
      -        "types": "./dist/commonjs/index.d.ts",
      -        "default": "./dist/commonjs/index.js"
      -      }
      -    }
      -  },
      -  "files": [
      -    "dist"
      -  ],
      -  "scripts": {
      -    "preversion": "npm test",
      -    "postversion": "npm publish",
      -    "prepublishOnly": "git push origin --follow-tags",
      -    "prepare": "tshy",
      -    "pretest": "npm run prepare",
      -    "presnap": "npm run prepare",
      -    "test": "tap",
      -    "snap": "tap",
      -    "format": "prettier --write . --loglevel warn",
      -    "benchmark": "node benchmark/index.js",
      -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
      -  },
      -  "prettier": {
      -    "semi": false,
      -    "printWidth": 80,
      -    "tabWidth": 2,
      -    "useTabs": false,
      -    "singleQuote": true,
      -    "jsxSingleQuote": false,
      -    "bracketSameLine": true,
      -    "arrowParens": "avoid",
      -    "endOfLine": "lf"
      -  },
      -  "engines": {
      -    "node": ">=16 || 14 >=14.17"
      -  },
      -  "dependencies": {
      -    "brace-expansion": "^2.0.1"
      -  },
      -  "devDependencies": {
      -    "@types/brace-expansion": "^1.1.0",
      -    "@types/node": "^18.15.11",
      -    "@types/tap": "^15.0.8",
      -    "eslint-config-prettier": "^8.6.0",
      -    "mkdirp": "1",
      -    "prettier": "^2.8.2",
      -    "tap": "^18.7.2",
      -    "ts-node": "^10.9.1",
      -    "tshy": "^1.12.0",
      -    "typedoc": "^0.23.21",
      -    "typescript": "^4.9.3"
      -  },
      -  "funding": {
      -    "url": "https://github.com/sponsors/isaacs"
      -  },
      -  "license": "ISC",
      -  "tshy": {
      -    "exports": {
      -      "./package.json": "./package.json",
      -      ".": "./src/index.ts"
      -    }
      -  },
      -  "type": "module"
      -}
      diff --git a/deps/npm/node_modules/@tufjs/models/package.json b/deps/npm/node_modules/@tufjs/models/package.json
      index dfd60d248118cc..cf4410577d042a 100644
      --- a/deps/npm/node_modules/@tufjs/models/package.json
      +++ b/deps/npm/node_modules/@tufjs/models/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "@tufjs/models",
      -  "version": "4.0.0",
      +  "version": "4.1.0",
         "description": "TUF metadata models",
         "main": "dist/index.js",
         "types": "dist/index.d.ts",
      @@ -29,7 +29,7 @@
         "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/models#readme",
         "dependencies": {
           "@tufjs/canonical-json": "2.0.0",
      -    "minimatch": "^9.0.5"
      +    "minimatch": "^10.1.1"
         },
         "engines": {
           "node": "^20.17.0 || >=22.9.0"
      diff --git a/deps/npm/node_modules/balanced-match/LICENSE.md b/deps/npm/node_modules/balanced-match/LICENSE.md
      deleted file mode 100644
      index 2cdc8e4148cc0a..00000000000000
      --- a/deps/npm/node_modules/balanced-match/LICENSE.md
      +++ /dev/null
      @@ -1,21 +0,0 @@
      -(MIT)
      -
      -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
      -
      -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/balanced-match/index.js b/deps/npm/node_modules/balanced-match/index.js
      deleted file mode 100644
      index c67a64608df7f4..00000000000000
      --- a/deps/npm/node_modules/balanced-match/index.js
      +++ /dev/null
      @@ -1,62 +0,0 @@
      -'use strict';
      -module.exports = balanced;
      -function balanced(a, b, str) {
      -  if (a instanceof RegExp) a = maybeMatch(a, str);
      -  if (b instanceof RegExp) b = maybeMatch(b, str);
      -
      -  var r = range(a, b, str);
      -
      -  return r && {
      -    start: r[0],
      -    end: r[1],
      -    pre: str.slice(0, r[0]),
      -    body: str.slice(r[0] + a.length, r[1]),
      -    post: str.slice(r[1] + b.length)
      -  };
      -}
      -
      -function maybeMatch(reg, str) {
      -  var m = str.match(reg);
      -  return m ? m[0] : null;
      -}
      -
      -balanced.range = range;
      -function range(a, b, str) {
      -  var begs, beg, left, right, result;
      -  var ai = str.indexOf(a);
      -  var bi = str.indexOf(b, ai + 1);
      -  var i = ai;
      -
      -  if (ai >= 0 && bi > 0) {
      -    if(a===b) {
      -      return [ai, bi];
      -    }
      -    begs = [];
      -    left = str.length;
      -
      -    while (i >= 0 && !result) {
      -      if (i == ai) {
      -        begs.push(i);
      -        ai = str.indexOf(a, i + 1);
      -      } else if (begs.length == 1) {
      -        result = [ begs.pop(), bi ];
      -      } else {
      -        beg = begs.pop();
      -        if (beg < left) {
      -          left = beg;
      -          right = bi;
      -        }
      -
      -        bi = str.indexOf(b, i + 1);
      -      }
      -
      -      i = ai < bi && ai >= 0 ? ai : bi;
      -    }
      -
      -    if (begs.length) {
      -      result = [ left, right ];
      -    }
      -  }
      -
      -  return result;
      -}
      diff --git a/deps/npm/node_modules/balanced-match/package.json b/deps/npm/node_modules/balanced-match/package.json
      deleted file mode 100644
      index ce6073e0403b5a..00000000000000
      --- a/deps/npm/node_modules/balanced-match/package.json
      +++ /dev/null
      @@ -1,48 +0,0 @@
      -{
      -  "name": "balanced-match",
      -  "description": "Match balanced character pairs, like \"{\" and \"}\"",
      -  "version": "1.0.2",
      -  "repository": {
      -    "type": "git",
      -    "url": "git://github.com/juliangruber/balanced-match.git"
      -  },
      -  "homepage": "https://github.com/juliangruber/balanced-match",
      -  "main": "index.js",
      -  "scripts": {
      -    "test": "tape test/test.js",
      -    "bench": "matcha test/bench.js"
      -  },
      -  "devDependencies": {
      -    "matcha": "^0.7.0",
      -    "tape": "^4.6.0"
      -  },
      -  "keywords": [
      -    "match",
      -    "regexp",
      -    "test",
      -    "balanced",
      -    "parse"
      -  ],
      -  "author": {
      -    "name": "Julian Gruber",
      -    "email": "mail@juliangruber.com",
      -    "url": "http://juliangruber.com"
      -  },
      -  "license": "MIT",
      -  "testling": {
      -    "files": "test/*.js",
      -    "browsers": [
      -      "ie/8..latest",
      -      "firefox/20..latest",
      -      "firefox/nightly",
      -      "chrome/25..latest",
      -      "chrome/canary",
      -      "opera/12..latest",
      -      "opera/next",
      -      "safari/5.1..latest",
      -      "ipad/6.0..latest",
      -      "iphone/6.0..latest",
      -      "android-browser/4.2..latest"
      -    ]
      -  }
      -}
      diff --git a/deps/npm/node_modules/brace-expansion/LICENSE b/deps/npm/node_modules/brace-expansion/LICENSE
      deleted file mode 100644
      index de3226673c3874..00000000000000
      --- a/deps/npm/node_modules/brace-expansion/LICENSE
      +++ /dev/null
      @@ -1,21 +0,0 @@
      -MIT License
      -
      -Copyright (c) 2013 Julian Gruber 
      -
      -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/brace-expansion/index.js b/deps/npm/node_modules/brace-expansion/index.js
      deleted file mode 100644
      index 254ca75dd9aba2..00000000000000
      --- a/deps/npm/node_modules/brace-expansion/index.js
      +++ /dev/null
      @@ -1,203 +0,0 @@
      -var balanced = require('balanced-match');
      -
      -module.exports = expandTop;
      -
      -var escSlash = '\0SLASH'+Math.random()+'\0';
      -var escOpen = '\0OPEN'+Math.random()+'\0';
      -var escClose = '\0CLOSE'+Math.random()+'\0';
      -var escComma = '\0COMMA'+Math.random()+'\0';
      -var escPeriod = '\0PERIOD'+Math.random()+'\0';
      -
      -function numeric(str) {
      -  return parseInt(str, 10) == str
      -    ? parseInt(str, 10)
      -    : str.charCodeAt(0);
      -}
      -
      -function escapeBraces(str) {
      -  return str.split('\\\\').join(escSlash)
      -            .split('\\{').join(escOpen)
      -            .split('\\}').join(escClose)
      -            .split('\\,').join(escComma)
      -            .split('\\.').join(escPeriod);
      -}
      -
      -function unescapeBraces(str) {
      -  return str.split(escSlash).join('\\')
      -            .split(escOpen).join('{')
      -            .split(escClose).join('}')
      -            .split(escComma).join(',')
      -            .split(escPeriod).join('.');
      -}
      -
      -
      -// Basically just str.split(","), but handling cases
      -// where we have nested braced sections, which should be
      -// treated as individual members, like {a,{b,c},d}
      -function parseCommaParts(str) {
      -  if (!str)
      -    return [''];
      -
      -  var parts = [];
      -  var m = balanced('{', '}', str);
      -
      -  if (!m)
      -    return str.split(',');
      -
      -  var pre = m.pre;
      -  var body = m.body;
      -  var post = m.post;
      -  var p = pre.split(',');
      -
      -  p[p.length-1] += '{' + body + '}';
      -  var postParts = parseCommaParts(post);
      -  if (post.length) {
      -    p[p.length-1] += postParts.shift();
      -    p.push.apply(p, postParts);
      -  }
      -
      -  parts.push.apply(parts, p);
      -
      -  return parts;
      -}
      -
      -function expandTop(str) {
      -  if (!str)
      -    return [];
      -
      -  // I don't know why Bash 4.3 does this, but it does.
      -  // Anything starting with {} will have the first two bytes preserved
      -  // but *only* at the top level, so {},a}b will not expand to anything,
      -  // but a{},b}c will be expanded to [a}c,abc].
      -  // One could argue that this is a bug in Bash, but since the goal of
      -  // this module is to match Bash's rules, we escape a leading {}
      -  if (str.substr(0, 2) === '{}') {
      -    str = '\\{\\}' + str.substr(2);
      -  }
      -
      -  return expand(escapeBraces(str), true).map(unescapeBraces);
      -}
      -
      -function embrace(str) {
      -  return '{' + str + '}';
      -}
      -function isPadded(el) {
      -  return /^-?0\d/.test(el);
      -}
      -
      -function lte(i, y) {
      -  return i <= y;
      -}
      -function gte(i, y) {
      -  return i >= y;
      -}
      -
      -function expand(str, isTop) {
      -  var expansions = [];
      -
      -  var m = balanced('{', '}', str);
      -  if (!m) return [str];
      -
      -  // no need to expand pre, since it is guaranteed to be free of brace-sets
      -  var pre = m.pre;
      -  var post = m.post.length
      -    ? expand(m.post, false)
      -    : [''];
      -
      -  if (/\$$/.test(m.pre)) {
      -    for (var k = 0; k < post.length; k++) {
      -      var expansion = pre+ '{' + m.body + '}' + post[k];
      -      expansions.push(expansion);
      -    }
      -  } else {
      -    var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
      -    var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
      -    var isSequence = isNumericSequence || isAlphaSequence;
      -    var isOptions = m.body.indexOf(',') >= 0;
      -    if (!isSequence && !isOptions) {
      -      // {a},b}
      -      if (m.post.match(/,(?!,).*\}/)) {
      -        str = m.pre + '{' + m.body + escClose + m.post;
      -        return expand(str);
      -      }
      -      return [str];
      -    }
      -
      -    var n;
      -    if (isSequence) {
      -      n = m.body.split(/\.\./);
      -    } else {
      -      n = parseCommaParts(m.body);
      -      if (n.length === 1) {
      -        // x{{a,b}}y ==> x{a}y x{b}y
      -        n = expand(n[0], false).map(embrace);
      -        if (n.length === 1) {
      -          return post.map(function(p) {
      -            return m.pre + n[0] + p;
      -          });
      -        }
      -      }
      -    }
      -
      -    // at this point, n is the parts, and we know it's not a comma set
      -    // with a single entry.
      -    var N;
      -
      -    if (isSequence) {
      -      var x = numeric(n[0]);
      -      var y = numeric(n[1]);
      -      var width = Math.max(n[0].length, n[1].length)
      -      var incr = n.length == 3
      -        ? Math.abs(numeric(n[2]))
      -        : 1;
      -      var test = lte;
      -      var reverse = y < x;
      -      if (reverse) {
      -        incr *= -1;
      -        test = gte;
      -      }
      -      var pad = n.some(isPadded);
      -
      -      N = [];
      -
      -      for (var i = x; test(i, y); i += incr) {
      -        var c;
      -        if (isAlphaSequence) {
      -          c = String.fromCharCode(i);
      -          if (c === '\\')
      -            c = '';
      -        } else {
      -          c = String(i);
      -          if (pad) {
      -            var need = width - c.length;
      -            if (need > 0) {
      -              var z = new Array(need + 1).join('0');
      -              if (i < 0)
      -                c = '-' + z + c.slice(1);
      -              else
      -                c = z + c;
      -            }
      -          }
      -        }
      -        N.push(c);
      -      }
      -    } else {
      -      N = [];
      -
      -      for (var j = 0; j < n.length; j++) {
      -        N.push.apply(N, expand(n[j], false));
      -      }
      -    }
      -
      -    for (var j = 0; j < N.length; j++) {
      -      for (var k = 0; k < post.length; k++) {
      -        var expansion = pre + N[j] + post[k];
      -        if (!isTop || isSequence || expansion)
      -          expansions.push(expansion);
      -      }
      -    }
      -  }
      -
      -  return expansions;
      -}
      -
      diff --git a/deps/npm/node_modules/brace-expansion/package.json b/deps/npm/node_modules/brace-expansion/package.json
      deleted file mode 100644
      index c7eee34511002a..00000000000000
      --- a/deps/npm/node_modules/brace-expansion/package.json
      +++ /dev/null
      @@ -1,49 +0,0 @@
      -{
      -  "name": "brace-expansion",
      -  "description": "Brace expansion as known from sh/bash",
      -  "version": "2.0.2",
      -  "repository": {
      -    "type": "git",
      -    "url": "git://github.com/juliangruber/brace-expansion.git"
      -  },
      -  "homepage": "https://github.com/juliangruber/brace-expansion",
      -  "main": "index.js",
      -  "scripts": {
      -    "test": "tape test/*.js",
      -    "gentest": "bash test/generate.sh",
      -    "bench": "matcha test/perf/bench.js"
      -  },
      -  "dependencies": {
      -    "balanced-match": "^1.0.0"
      -  },
      -  "devDependencies": {
      -    "@c4312/matcha": "^1.3.1",
      -    "tape": "^4.6.0"
      -  },
      -  "keywords": [],
      -  "author": {
      -    "name": "Julian Gruber",
      -    "email": "mail@juliangruber.com",
      -    "url": "http://juliangruber.com"
      -  },
      -  "license": "MIT",
      -  "testling": {
      -    "files": "test/*.js",
      -    "browsers": [
      -      "ie/8..latest",
      -      "firefox/20..latest",
      -      "firefox/nightly",
      -      "chrome/25..latest",
      -      "chrome/canary",
      -      "opera/12..latest",
      -      "opera/next",
      -      "safari/5.1..latest",
      -      "ipad/6.0..latest",
      -      "iphone/6.0..latest",
      -      "android-browser/4.2..latest"
      -    ]
      -  },
      -  "publishConfig": {
      -    "tag": "2.x"
      -  }
      -}
      diff --git a/deps/npm/node_modules/common-ancestor-path/LICENSE b/deps/npm/node_modules/common-ancestor-path/LICENSE
      deleted file mode 100644
      index 05eeeb88c2ef4c..00000000000000
      --- a/deps/npm/node_modules/common-ancestor-path/LICENSE
      +++ /dev/null
      @@ -1,15 +0,0 @@
      -The ISC License
      -
      -Copyright (c) Isaac Z. Schlueter
      -
      -Permission to use, copy, modify, and/or distribute this software for any
      -purpose with or without fee is hereby granted, provided that the above
      -copyright notice and this permission notice appear in all copies.
      -
      -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
      -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      diff --git a/deps/npm/node_modules/common-ancestor-path/LICENSE.md b/deps/npm/node_modules/common-ancestor-path/LICENSE.md
      new file mode 100644
      index 00000000000000..c5402b9577a8cd
      --- /dev/null
      +++ b/deps/npm/node_modules/common-ancestor-path/LICENSE.md
      @@ -0,0 +1,55 @@
      +# Blue Oak Model License
      +
      +Version 1.0.0
      +
      +## Purpose
      +
      +This license gives everyone as much permission to work with
      +this software as possible, while protecting contributors
      +from liability.
      +
      +## Acceptance
      +
      +In order to receive this license, you must agree to its
      +rules.  The rules of this license are both obligations
      +under that agreement and conditions to your license.
      +You must not do anything with this software that triggers
      +a rule that you cannot or will not follow.
      +
      +## Copyright
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe that contributor's
      +copyright in it.
      +
      +## Notices
      +
      +You must ensure that everyone who gets a copy of
      +any part of this software from you, with or without
      +changes, also gets the text of this license or a link to
      +.
      +
      +## Excuse
      +
      +If anyone notifies you in writing that you have not
      +complied with [Notices](#notices), you can keep your
      +license by taking all practical steps to comply within 30
      +days after the notice.  If you do not do so, your license
      +ends immediately.
      +
      +## Patent
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe any patent claims
      +they can license or become able to license.
      +
      +## Reliability
      +
      +No contributor can revoke this license.
      +
      +## No Liability
      +
      +***As far as the law allows, this software comes as is,
      +without any warranty or condition, and no contributor
      +will be liable to anyone for any damages related to this
      +software or this license, under any kind of legal claim.***
      diff --git a/deps/npm/node_modules/common-ancestor-path/dist/commonjs/index.js b/deps/npm/node_modules/common-ancestor-path/dist/commonjs/index.js
      new file mode 100644
      index 00000000000000..70a3604fb0f3b9
      --- /dev/null
      +++ b/deps/npm/node_modules/common-ancestor-path/dist/commonjs/index.js
      @@ -0,0 +1,20 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.commonAncestorPath = void 0;
      +const node_path_1 = require("node:path");
      +function* commonArrayMembers(a, b) {
      +    const [l, s] = a.length > b.length ? [a, b] : [b, a];
      +    for (const x of s) {
      +        if (x === l.shift())
      +            yield x;
      +        else
      +            break;
      +    }
      +}
      +const cap = (a, b) => a === b ? a
      +    : !a || !b ? null
      +        : (0, node_path_1.parse)(a).root !== (0, node_path_1.parse)(b).root ? null
      +            : [...commonArrayMembers((0, node_path_1.normalize)(a).split(node_path_1.sep), (0, node_path_1.normalize)(b).split(node_path_1.sep))].join(node_path_1.sep);
      +const commonAncestorPath = (...paths) => paths.reduce(cap);
      +exports.commonAncestorPath = commonAncestorPath;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/package.json b/deps/npm/node_modules/common-ancestor-path/dist/commonjs/package.json
      similarity index 100%
      rename from deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/commonjs/package.json
      rename to deps/npm/node_modules/common-ancestor-path/dist/commonjs/package.json
      diff --git a/deps/npm/node_modules/common-ancestor-path/dist/esm/index.js b/deps/npm/node_modules/common-ancestor-path/dist/esm/index.js
      new file mode 100644
      index 00000000000000..abb7c92931a614
      --- /dev/null
      +++ b/deps/npm/node_modules/common-ancestor-path/dist/esm/index.js
      @@ -0,0 +1,16 @@
      +import { parse, sep, normalize as norm } from 'node:path';
      +function* commonArrayMembers(a, b) {
      +    const [l, s] = a.length > b.length ? [a, b] : [b, a];
      +    for (const x of s) {
      +        if (x === l.shift())
      +            yield x;
      +        else
      +            break;
      +    }
      +}
      +const cap = (a, b) => a === b ? a
      +    : !a || !b ? null
      +        : parse(a).root !== parse(b).root ? null
      +            : [...commonArrayMembers(norm(a).split(sep), norm(b).split(sep))].join(sep);
      +export const commonAncestorPath = (...paths) => paths.reduce(cap);
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/package.json b/deps/npm/node_modules/common-ancestor-path/dist/esm/package.json
      similarity index 100%
      rename from deps/npm/node_modules/@tufjs/models/node_modules/minimatch/dist/esm/package.json
      rename to deps/npm/node_modules/common-ancestor-path/dist/esm/package.json
      diff --git a/deps/npm/node_modules/common-ancestor-path/index.js b/deps/npm/node_modules/common-ancestor-path/index.js
      deleted file mode 100644
      index 09ae3178295adb..00000000000000
      --- a/deps/npm/node_modules/common-ancestor-path/index.js
      +++ /dev/null
      @@ -1,17 +0,0 @@
      -const {parse, sep, normalize: norm} = require('path')
      -
      -function* commonArrayMembers (a, b) {
      -  const [l, s] = a.length > b.length ? [a, b] : [b, a]
      -  for (const x of s) {
      -    if (x === l.shift())
      -      yield x
      -    else
      -      break
      -  }
      -}
      -
      -const commonAncestorPath = (a, b) => a === b ? a
      -  : parse(a).root !== parse(b).root ? null
      -  : [...commonArrayMembers(norm(a).split(sep), norm(b).split(sep))].join(sep)
      -
      -module.exports = (...paths) => paths.reduce(commonAncestorPath)
      diff --git a/deps/npm/node_modules/common-ancestor-path/package.json b/deps/npm/node_modules/common-ancestor-path/package.json
      index 4375d1d0818ac7..c98b78300d1438 100644
      --- a/deps/npm/node_modules/common-ancestor-path/package.json
      +++ b/deps/npm/node_modules/common-ancestor-path/package.json
      @@ -1,28 +1,60 @@
       {
         "name": "common-ancestor-path",
      -  "version": "1.0.1",
      +  "version": "2.0.0",
         "files": [
      -    "index.js"
      +    "dist"
         ],
         "description": "Find the common ancestor of 2 or more paths on Windows or Unix",
         "repository": {
           "type": "git",
      -    "url": "git+https://github.com/isaacs/common-ancestor-path"
      +    "url": "git@github.com:isaacs/common-ancestor-path"
         },
         "author": "Isaac Z. Schlueter  (https://izs.me)",
      -  "license": "ISC",
      +  "license": "BlueOak-1.0.0",
         "scripts": {
      -    "test": "tap",
      -    "snap": "tap",
           "preversion": "npm test",
           "postversion": "npm publish",
      -    "prepublishOnly": "git push origin --follow-tags"
      -  },
      -  "tap": {
      -    "check-coverage": true
      +    "prepublishOnly": "git push origin --follow-tags",
      +    "prepare": "tshy",
      +    "pretest": "npm run prepare",
      +    "presnap": "npm run prepare",
      +    "test": "tap",
      +    "snap": "tap",
      +    "format": "prettier --write . --log-level warn --cache",
      +    "typedoc": "typedoc"
         },
         "devDependencies": {
      +    "@types/node": "^24.10.1",
      +    "prettier": "^3.6.2",
           "require-inject": "^1.4.4",
      -    "tap": "^14.10.7"
      +    "tap": "^21.1.6",
      +    "tshy": "^3.1.0",
      +    "typedoc": "^0.28.14"
      +  },
      +  "type": "module",
      +  "tshy": {
      +    "exports": {
      +      "./package.json": "./package.json",
      +      ".": "./src/index.ts"
      +    }
      +  },
      +  "exports": {
      +    "./package.json": "./package.json",
      +    ".": {
      +      "import": {
      +        "types": "./dist/esm/index.d.ts",
      +        "default": "./dist/esm/index.js"
      +      },
      +      "require": {
      +        "types": "./dist/commonjs/index.d.ts",
      +        "default": "./dist/commonjs/index.js"
      +      }
      +    }
      +  },
      +  "main": "./dist/commonjs/index.js",
      +  "types": "./dist/commonjs/index.d.ts",
      +  "module": "./dist/esm/index.js",
      +  "engines": {
      +    "node": ">= 18"
         }
       }
      diff --git a/deps/npm/node_modules/diff/dist/diff.js b/deps/npm/node_modules/diff/dist/diff.js
      index 0d00e82e8ab2a8..6b25f903236806 100644
      --- a/deps/npm/node_modules/diff/dist/diff.js
      +++ b/deps/npm/node_modules/diff/dist/diff.js
      @@ -370,7 +370,7 @@
           }
           function trailingWs(string) {
               // Yes, this looks overcomplicated and dumb - why not replace the whole function with
      -        //     return string match(/\s*$/)[0]
      +        //     return string.match(/\s*$/)[0]
               // you ask? Because:
               // 1. the trap described at https://markamery.com/blog/quadratic-time-regexes/ would mean doing
               //    this would cause this function to take O(n²) time in the worst case (specifically when
      @@ -396,27 +396,29 @@
       
           // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode
           //
      -    // Ranges and exceptions:
      -    // Latin-1 Supplement, 0080–00FF
      -    //  - U+00D7  × Multiplication sign
      -    //  - U+00F7  ÷ Division sign
      -    // Latin Extended-A, 0100–017F
      -    // Latin Extended-B, 0180–024F
      -    // IPA Extensions, 0250–02AF
      -    // Spacing Modifier Letters, 02B0–02FF
      -    //  - U+02C7  ˇ ˇ  Caron
      -    //  - U+02D8  ˘ ˘  Breve
      -    //  - U+02D9  ˙ ˙  Dot Above
      -    //  - U+02DA  ˚ ˚  Ring Above
      -    //  - U+02DB  ˛ ˛  Ogonek
      -    //  - U+02DC  ˜ ˜  Small Tilde
      -    //  - U+02DD  ˝ ˝  Double Acute Accent
      -    // Latin Extended Additional, 1E00–1EFF
      -    const extendedWordChars = 'a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
      +    // Chars/ranges counted as "word" characters by this regex are as follows:
      +    //
      +    // + U+00AD  Soft hyphen
      +    // + 00C0–00FF (letters with diacritics from the Latin-1 Supplement), except:
      +    //   - U+00D7  × Multiplication sign
      +    //   - U+00F7  ÷ Division sign
      +    // + Latin Extended-A, 0100–017F
      +    // + Latin Extended-B, 0180–024F
      +    // + IPA Extensions, 0250–02AF
      +    // + Spacing Modifier Letters, 02B0–02FF, except:
      +    //   - U+02C7  ˇ ˇ  Caron
      +    //   - U+02D8  ˘ ˘  Breve
      +    //   - U+02D9  ˙ ˙  Dot Above
      +    //   - U+02DA  ˚ ˚  Ring Above
      +    //   - U+02DB  ˛ ˛  Ogonek
      +    //   - U+02DC  ˜ ˜  Small Tilde
      +    //   - U+02DD  ˝ ˝  Double Acute Accent
      +    // + Latin Extended Additional, 1E00–1EFF
      +    const extendedWordChars = 'a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
           // Each token is one of the following:
           // - A punctuation mark plus the surrounding whitespace
           // - A word plus the surrounding whitespace
      -    // - Pure whitespace (but only in the special case where this the entire text
      +    // - Pure whitespace (but only in the special case where the entire text
           //   is just whitespace)
           //
           // We have to include surrounding whitespace in the tokens because the two
      @@ -453,7 +455,25 @@
                       if (segmenter.resolvedOptions().granularity != 'word') {
                           throw new Error('The segmenter passed must have a granularity of "word"');
                       }
      -                parts = Array.from(segmenter.segment(value), segment => segment.segment);
      +                // We want `parts` to be an array whose elements alternate between being
      +                // pure whitespace and being pure non-whitespace. This is ALMOST what the
      +                // segments returned by a word-based Intl.Segmenter already look like,
      +                // and therefore we can ALMOST get what we want by simply doing...
      +                //     parts = Array.from(segmenter.segment(value), segment => segment.segment);
      +                // ... but not QUITE, because there's of one annoying special case: every
      +                // newline character gets its own segment, instead of sharing a segment
      +                // with other surrounding whitespace. We therefore need to manually merge
      +                // consecutive segments of whitespace into a single part:
      +                parts = [];
      +                for (const segmentObj of Array.from(segmenter.segment(value))) {
      +                    const segment = segmentObj.segment;
      +                    if (parts.length && (/\s/).test(parts[parts.length - 1]) && (/\s/).test(segment)) {
      +                        parts[parts.length - 1] += segment;
      +                    }
      +                    else {
      +                        parts.push(segment);
      +                    }
      +                }
                   }
                   else {
                       parts = value.match(tokenizeIncludingWhitespace) || [];
      @@ -656,7 +676,7 @@
           class WordsWithSpaceDiff extends Diff {
               tokenize(value) {
                   // Slightly different to the tokenizeIncludingWhitespace regex used above in
      -            // that this one treats each individual newline as a distinct tokens, rather
      +            // that this one treats each individual newline as a distinct token, rather
                   // than merging them into other surrounding whitespace. This was requested
                   // in https://github.com/kpdecker/jsdiff/issues/180 &
                   //    https://github.com/kpdecker/jsdiff/issues/211
      @@ -957,10 +977,27 @@
                       if ((/^(---|\+\+\+|@@)\s/).test(line)) {
                           break;
                       }
      -                // Diff index
      -                const header = (/^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/).exec(line);
      -                if (header) {
      -                    index.index = header[1];
      +                // Try to parse the line as a diff header, like
      +                //     Index: README.md
      +                // or
      +                //     diff -r 9117c6561b0b -r 273ce12ad8f1 .hgignore
      +                // or
      +                //     Index: something with multiple words
      +                // and extract the filename (or whatever else is used as an index name)
      +                // from the end (i.e. 'README.md', '.hgignore', or
      +                // 'something with multiple words' in the examples above).
      +                //
      +                // TODO: It seems awkward that we indiscriminately trim off trailing
      +                //       whitespace here. Theoretically, couldn't that be meaningful -
      +                //       e.g. if the patch represents a diff of a file whose name ends
      +                //       with a space? Seems wrong to nuke it.
      +                //       But this behaviour has been around since v2.2.1 in 2015, so if
      +                //       it's going to change, it should be done cautiously and in a new
      +                //       major release, for backwards-compat reasons.
      +                //       -- ExplodingCabbage
      +                const headerMatch = (/^(?:Index:|diff(?: -r \w+)+)\s+/).exec(line);
      +                if (headerMatch) {
      +                    index.index = line.substring(headerMatch[0].length).trim();
                       }
                       i++;
                   }
      @@ -989,14 +1026,14 @@
               // Parses the --- and +++ headers, if none are found, no lines
               // are consumed.
               function parseFileHeader(index) {
      -            const fileHeader = (/^(---|\+\+\+)\s+(.*)\r?$/).exec(diffstr[i]);
      -            if (fileHeader) {
      -                const data = fileHeader[2].split('\t', 2), header = (data[1] || '').trim();
      +            const fileHeaderMatch = (/^(---|\+\+\+)\s+/).exec(diffstr[i]);
      +            if (fileHeaderMatch) {
      +                const prefix = fileHeaderMatch[1], data = diffstr[i].substring(3).trim().split('\t', 2), header = (data[1] || '').trim();
                       let fileName = data[0].replace(/\\\\/g, '\\');
      -                if ((/^".*"$/).test(fileName)) {
      +                if (fileName.startsWith('"') && fileName.endsWith('"')) {
                           fileName = fileName.substr(1, fileName.length - 2);
                       }
      -                if (fileHeader[1] === '---') {
      +                if (prefix === '---') {
                           index.oldFileName = fileName;
                           index.oldHeader = header;
                       }
      @@ -1386,6 +1423,21 @@
                   }) });
           }
       
      +    const INCLUDE_HEADERS = {
      +        includeIndex: true,
      +        includeUnderline: true,
      +        includeFileHeaders: true
      +    };
      +    const FILE_HEADERS_ONLY = {
      +        includeIndex: false,
      +        includeUnderline: false,
      +        includeFileHeaders: true
      +    };
      +    const OMIT_HEADERS = {
      +        includeIndex: false,
      +        includeUnderline: false,
      +        includeFileHeaders: false
      +    };
           function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
               let optionsObj;
               if (!options) {
      @@ -1515,17 +1567,29 @@
            * creates a unified diff patch.
            * @param patch either a single structured patch object (as returned by `structuredPatch`) or an array of them (as returned by `parsePatch`)
            */
      -    function formatPatch(patch) {
      +    function formatPatch(patch, headerOptions) {
      +        if (!headerOptions) {
      +            headerOptions = INCLUDE_HEADERS;
      +        }
               if (Array.isArray(patch)) {
      -            return patch.map(formatPatch).join('\n');
      +            if (patch.length > 1 && !headerOptions.includeFileHeaders) {
      +                throw new Error('Cannot omit file headers on a multi-file patch. '
      +                    + '(The result would be unparseable; how would a tool trying to apply '
      +                    + 'the patch know which changes are to which file?)');
      +            }
      +            return patch.map(p => formatPatch(p, headerOptions)).join('\n');
               }
               const ret = [];
      -        if (patch.oldFileName == patch.newFileName) {
      +        if (headerOptions.includeIndex && patch.oldFileName == patch.newFileName) {
                   ret.push('Index: ' + patch.oldFileName);
               }
      -        ret.push('===================================================================');
      -        ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      -        ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +        if (headerOptions.includeUnderline) {
      +            ret.push('===================================================================');
      +        }
      +        if (headerOptions.includeFileHeaders) {
      +            ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      +            ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +        }
               for (let i = 0; i < patch.hunks.length; i++) {
                   const hunk = patch.hunks[i];
                   // Unified Diff Format quirk: If the chunk size is 0,
      @@ -1555,7 +1619,7 @@
                   if (!patchObj) {
                       return;
                   }
      -            return formatPatch(patchObj);
      +            return formatPatch(patchObj, options === null || options === void 0 ? void 0 : options.headerOptions);
               }
               else {
                   const { callback } = options;
      @@ -1564,7 +1628,7 @@
                               callback(undefined);
                           }
                           else {
      -                        callback(formatPatch(patchObj));
      +                        callback(formatPatch(patchObj, options.headerOptions));
                           }
                       } }));
               }
      @@ -1642,6 +1706,9 @@
           }
       
           exports.Diff = Diff;
      +    exports.FILE_HEADERS_ONLY = FILE_HEADERS_ONLY;
      +    exports.INCLUDE_HEADERS = INCLUDE_HEADERS;
      +    exports.OMIT_HEADERS = OMIT_HEADERS;
           exports.applyPatch = applyPatch;
           exports.applyPatches = applyPatches;
           exports.arrayDiff = arrayDiff;
      diff --git a/deps/npm/node_modules/diff/dist/diff.min.js b/deps/npm/node_modules/diff/dist/diff.min.js
      index 6fd5d020d282c4..8ae55324ed93bc 100644
      --- a/deps/npm/node_modules/diff/dist/diff.min.js
      +++ b/deps/npm/node_modules/diff/dist/diff.min.js
      @@ -1 +1 @@
      -((global,factory)=>{"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).Diff={})})(this,function(exports){class Diff{diff(oldStr,newStr,options={}){let callback;"function"==typeof options?(callback=options,options={}):"callback"in options&&(callback=options.callback);oldStr=this.castInput(oldStr,options),newStr=this.castInput(newStr,options),oldStr=this.removeEmpty(this.tokenize(oldStr,options)),newStr=this.removeEmpty(this.tokenize(newStr,options));return this.diffWithOptionsObj(oldStr,newStr,options,callback)}diffWithOptionsObj(oldTokens,newTokens,options,callback){let _a,done=value=>{if(value=this.postProcess(value,options),!callback)return value;setTimeout(function(){callback(value)},0)},newLen=newTokens.length,oldLen=oldTokens.length,editLength=1,maxEditLength=newLen+oldLen;null!=options.maxEditLength&&(maxEditLength=Math.min(maxEditLength,options.maxEditLength));var maxExecutionTime=null!=(_a=options.timeout)?_a:1/0;let abortAfterTimestamp=Date.now()+maxExecutionTime,bestPath=[{oldPos:-1,lastComponent:void 0}],newPos=this.extractCommon(bestPath[0],newTokens,oldTokens,0,options);if(bestPath[0].oldPos+1>=oldLen&&newPos+1>=newLen)return done(this.buildValues(bestPath[0].lastComponent,newTokens,oldTokens));let minDiagonalToConsider=-1/0,maxDiagonalToConsider=1/0,execEditLength=()=>{for(let diagonalPath=Math.max(minDiagonalToConsider,-editLength);diagonalPath<=Math.min(maxDiagonalToConsider,editLength);diagonalPath+=2){let basePath;var removePath=bestPath[diagonalPath-1],addPath=bestPath[diagonalPath+1];removePath&&(bestPath[diagonalPath-1]=void 0);let canAdd=!1;addPath&&(addPathNewPos=addPath.oldPos-diagonalPath,canAdd=addPath&&0<=addPathNewPos&&addPathNewPos=oldLen&&newPos+1>=newLen)return done(this.buildValues(basePath.lastComponent,newTokens,oldTokens))||!0;(bestPath[diagonalPath]=basePath).oldPos+1>=oldLen&&(maxDiagonalToConsider=Math.min(maxDiagonalToConsider,diagonalPath-1)),newPos+1>=newLen&&(minDiagonalToConsider=Math.max(minDiagonalToConsider,diagonalPath+1))}else bestPath[diagonalPath]=void 0}editLength++};if(callback)!function exec(){setTimeout(function(){if(editLength>maxEditLength||Date.now()>abortAfterTimestamp)return callback(void 0);execEditLength()||exec()},0)}();else for(;editLength<=maxEditLength&&Date.now()<=abortAfterTimestamp;){var ret=execEditLength();if(ret)return ret}}addToPath(path,added,removed,oldPosInc,options){var last=path.lastComponent;return last&&!options.oneChangePerToken&&last.added===added&&last.removed===removed?{oldPos:path.oldPos+oldPosInc,lastComponent:{count:last.count+1,added:added,removed:removed,previousComponent:last.previousComponent}}:{oldPos:path.oldPos+oldPosInc,lastComponent:{count:1,added:added,removed:removed,previousComponent:last}}}extractCommon(basePath,newTokens,oldTokens,diagonalPath,options){var newLen=newTokens.length,oldLen=oldTokens.length;let oldPos=basePath.oldPos,newPos=oldPos-diagonalPath,commonCount=0;for(;newPos+1value.length?i:value}),component.value=this.join(value)}else component.value=this.join(newTokens.slice(newPos,newPos+component.count));newPos+=component.count,component.added||(oldPos+=component.count)}}return components}}class CharacterDiff extends Diff{}let characterDiff=new CharacterDiff;function longestCommonPrefix(str1,str2){let i;for(i=0;i{let startA=0,endB=(a.length>b.length&&(startA=a.length-b.length),b.length),map=(a.lengthsegment.segment)}else parts=value.match(tokenizeIncludingWhitespace)||[];let tokens=[],prevPart=null;return parts.forEach(part=>{/\s/.test(part)?null==prevPart?tokens.push(part):tokens.push(tokens.pop()+part):null!=prevPart&&/\s/.test(prevPart)?tokens[tokens.length-1]==prevPart?tokens.push(tokens.pop()+part):tokens.push(prevPart+part):tokens.push(part),prevPart=part}),tokens}join(tokens){return tokens.map((token,i)=>0==i?token:token.replace(/^\s+/,"")).join("")}postProcess(changes,options){if(changes&&!options.oneChangePerToken){let lastKeep=null,insertion=null,deletion=null;changes.forEach(change=>{change.added?insertion=change:deletion=change.removed?change:((insertion||deletion)&&dedupeWhitespaceInChangeObjects(lastKeep,deletion,insertion,change),lastKeep=change,insertion=null)}),(insertion||deletion)&&dedupeWhitespaceInChangeObjects(lastKeep,deletion,insertion,null)}return changes}}let wordDiff=new WordDiff;function dedupeWhitespaceInChangeObjects(startKeep,deletion,insertion,endKeep){if(deletion&&insertion){var oldWsPrefix=leadingWs(deletion.value),oldWsSuffix=trailingWs(deletion.value),newWsPrefix=leadingWs(insertion.value),newWsSuffix=trailingWs(insertion.value);startKeep&&(oldWsPrefix=longestCommonPrefix(oldWsPrefix,newWsPrefix),startKeep.value=replaceSuffix(startKeep.value,newWsPrefix,oldWsPrefix),deletion.value=removePrefix(deletion.value,oldWsPrefix),insertion.value=removePrefix(insertion.value,oldWsPrefix)),endKeep&&(newWsPrefix=longestCommonSuffix(oldWsSuffix,newWsSuffix),endKeep.value=replacePrefix(endKeep.value,newWsSuffix,newWsPrefix),deletion.value=removeSuffix(deletion.value,newWsPrefix),insertion.value=removeSuffix(insertion.value,newWsPrefix))}else if(insertion){if(startKeep&&(oldWsPrefix=leadingWs(insertion.value),insertion.value=insertion.value.substring(oldWsPrefix.length)),endKeep){let ws=leadingWs(endKeep.value);endKeep.value=endKeep.value.substring(ws.length)}}else if(startKeep&&endKeep){oldWsSuffix=leadingWs(endKeep.value),newWsSuffix=leadingWs(deletion.value),newWsPrefix=trailingWs(deletion.value),insertion=longestCommonPrefix(oldWsSuffix,newWsSuffix),oldWsPrefix=(deletion.value=removePrefix(deletion.value,insertion),longestCommonSuffix(removePrefix(oldWsSuffix,insertion),newWsPrefix));deletion.value=removeSuffix(deletion.value,oldWsPrefix),endKeep.value=replacePrefix(endKeep.value,oldWsSuffix,oldWsPrefix),startKeep.value=replaceSuffix(startKeep.value,oldWsSuffix,oldWsSuffix.slice(0,oldWsSuffix.length-oldWsPrefix.length))}else if(endKeep){newWsSuffix=leadingWs(endKeep.value),insertion=maximumOverlap(trailingWs(deletion.value),newWsSuffix);deletion.value=removeSuffix(deletion.value,insertion)}else if(startKeep){let overlap=maximumOverlap(trailingWs(startKeep.value),leadingWs(deletion.value));deletion.value=removePrefix(deletion.value,overlap)}}class WordsWithSpaceDiff extends Diff{tokenize(value){var regex=new RegExp(`(\\r?\\n)|[${extendedWordChars}]+|[^\\S\\n\\r]+|[^${extendedWordChars}]`,"ug");return value.match(regex)||[]}}let wordsWithSpaceDiff=new WordsWithSpaceDiff;function diffWordsWithSpace(oldStr,newStr,options){return wordsWithSpaceDiff.diff(oldStr,newStr,options)}class LineDiff extends Diff{constructor(){super(...arguments),this.tokenize=tokenize}equals(left,right,options){return options.ignoreWhitespace?(options.newlineIsToken&&left.includes("\n")||(left=left.trim()),options.newlineIsToken&&right.includes("\n")||(right=right.trim())):options.ignoreNewlineAtEof&&!options.newlineIsToken&&(left.endsWith("\n")&&(left=left.slice(0,-1)),right.endsWith("\n"))&&(right=right.slice(0,-1)),super.equals(left,right,options)}}let lineDiff=new LineDiff;function diffLines(oldStr,newStr,options){return lineDiff.diff(oldStr,newStr,options)}function tokenize(value,options){var retLines=[],linesAndNewlines=(value=options.stripTrailingCr?value.replace(/\r\n/g,"\n"):value).split(/(\n|\r\n)/);linesAndNewlines[linesAndNewlines.length-1]||linesAndNewlines.pop();for(let i=0;ivoid 0===v?undefinedReplacement:v}=options;return"string"==typeof value?value:JSON.stringify(canonicalize(value,null,null,stringifyReplacer),null,"  ")}equals(left,right,options){return super.equals(left.replace(/,([\r\n])/g,"$1"),right.replace(/,([\r\n])/g,"$1"),options)}}let jsonDiff=new JsonDiff;function canonicalize(obj,stack,replacementStack,replacer,key){stack=stack||[],replacementStack=replacementStack||[],replacer&&(obj=replacer(void 0===key?"":key,obj));let i;for(i=0;i{var chunkHeaderIndex=i,chunkHeaderLine=diffstr[i++],hunk={oldStart:+(chunkHeaderLine=chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/))[1],oldLines:void 0===chunkHeaderLine[2]?1:+chunkHeaderLine[2],newStart:+chunkHeaderLine[3],newLines:void 0===chunkHeaderLine[4]?1:+chunkHeaderLine[4],lines:[]};0===hunk.oldLines&&(hunk.oldStart+=1),0===hunk.newLines&&(hunk.newStart+=1);let addCount=0,removeCount=0;for(;i{!options.autoConvertLineEndings&&null!=options.autoConvertLineEndings||((string=>string.includes("\r\n")&&!string.startsWith("\n")&&!string.match(/[^\r]\n/))(source)&&(patch=>!(patch=Array.isArray(patch)?patch:[patch]).some(index=>index.hunks.some(hunk=>hunk.lines.some(line=>!line.startsWith("\\")&&line.endsWith("\r")))))(patch)?patch=function unixToWin(patch){return Array.isArray(patch)?patch.map(p=>unixToWin(p)):Object.assign(Object.assign({},patch),{hunks:patch.hunks.map(hunk=>Object.assign(Object.assign({},hunk),{lines:hunk.lines.map((line,i)=>line.startsWith("\\")||line.endsWith("\r")||null!=(i=hunk.lines[i+1])&&i.startsWith("\\")?line:line+"\r")}))})}(patch):(string=>!string.includes("\r\n")&&string.includes("\n"))(source)&&(patch=>(patch=Array.isArray(patch)?patch:[patch]).some(index=>index.hunks.some(hunk=>hunk.lines.some(line=>line.endsWith("\r"))))&&patch.every(index=>index.hunks.every(hunk=>hunk.lines.every((line,i)=>line.startsWith("\\")||line.endsWith("\r")||(null==(line=hunk.lines[i+1])?void 0:line.startsWith("\\"))))))(patch)&&(patch=function winToUnix(patch){return Array.isArray(patch)?patch.map(p=>winToUnix(p)):Object.assign(Object.assign({},patch),{hunks:patch.hunks.map(hunk=>Object.assign(Object.assign({},hunk),{lines:hunk.lines.map(line=>line.endsWith("\r")?line.substring(0,line.length-1):line)}))})}(patch)));let lines=source.split("\n"),hunks=patch.hunks,compareLine=options.compareLine||((lineNumber,line,operation,patchContent)=>line===patchContent),fuzzFactor=options.fuzzFactor||0,minLine=0;if(fuzzFactor<0||!Number.isInteger(fuzzFactor))throw new Error("fuzzFactor must be a non-negative integer");if(!hunks.length)return source;let prevLine="",removeEOFNL=!1,addEOFNL=!1;for(let i=0;i{let wantForward=!0,backwardExhausted=!1,forwardExhausted=!1,localOffset=1;return function iterator(){if(wantForward&&!forwardExhausted){if(backwardExhausted?localOffset++:wantForward=!1,start+localOffset<=maxLine)return start+localOffset;forwardExhausted=!0}if(!backwardExhausted)return forwardExhausted||(wantForward=!0),minLine<=start-localOffset?start-localOffset++:(backwardExhausted=!0,iterator())}})(toPos=hunk.oldStart+prevHunkOffset-1,minLine,maxLine);void 0!==toPos&&!(hunkResult=function applyHunk(hunkLines,toPos,maxErrors,hunkLinesI=0,lastContextLineMatched=!0,patchedLines=[],patchedLinesLength=0){let nConsecutiveOldContextLines=0,nextContextLineMustMatch=!1;for(;hunkLinesI{diff=diffLinesResultToPatch(diff);callback(diff)}}))}function diffLinesResultToPatch(diff){if(diff){diff.push({value:"",lines:[]});var hunks=[];let oldRangeStart=0,newRangeStart=0,curRange=[],oldLine=1,newLine=1;for(let i=0;i{var hasTrailingNl=text.endsWith("\n"),text=text.split("\n").map(line=>line+"\n");return hasTrailingNl?text.pop():text.push(text.pop().slice(0,-1)),text})(current.value);if(current.lines=lines,current.added||current.removed){oldRangeStart||(prev=diff[i-1],oldRangeStart=oldLine,newRangeStart=newLine,prev&&(curRange=0{patchObj?callback(formatPatch(patchObj)):callback(void 0)}}))}else{oldFileName=structuredPatch(oldFileName,newFileName,oldStr,newStr,oldHeader,newHeader,options);if(oldFileName)return formatPatch(oldFileName)}}exports.Diff=Diff,exports.applyPatch=applyPatch,exports.applyPatches=function(uniDiff,options){let spDiff="string"==typeof uniDiff?parsePatch(uniDiff):uniDiff,currentIndex=0;!function processIndex(){let index=spDiff[currentIndex++];if(!index)return options.complete();options.loadFile(index,function(err,data){if(err)return options.complete(err);err=applyPatch(data,index,options),options.patched(index,err,function(err){if(err)return options.complete(err);processIndex()})})}()},exports.arrayDiff=arrayDiff,exports.canonicalize=canonicalize,exports.characterDiff=characterDiff,exports.convertChangesToDMP=function(changes){var ret=[];let change,operation;for(let i=0;i"):change.removed&&ret.push(""),ret.push((s=>{let n=s;return n=(n=(n=(n=n.replace(/&/g,"&")).replace(//g,">")).replace(/"/g,""")})(change.value)),change.added?ret.push(""):change.removed&&ret.push("")}return ret.join("")},exports.createPatch=function(fileName,oldStr,newStr,oldHeader,newHeader,options){return createTwoFilesPatch(fileName,fileName,oldStr,newStr,oldHeader,newHeader,options)},exports.createTwoFilesPatch=createTwoFilesPatch,exports.cssDiff=cssDiff,exports.diffArrays=function(oldArr,newArr,options){return arrayDiff.diff(oldArr,newArr,options)},exports.diffChars=function(oldStr,newStr,options){return characterDiff.diff(oldStr,newStr,options)},exports.diffCss=function(oldStr,newStr,options){return cssDiff.diff(oldStr,newStr,options)},exports.diffJson=function(oldStr,newStr,options){return jsonDiff.diff(oldStr,newStr,options)},exports.diffLines=diffLines,exports.diffSentences=function(oldStr,newStr,options){return sentenceDiff.diff(oldStr,newStr,options)},exports.diffTrimmedLines=function(oldStr,newStr,options){return options=((options,defaults)=>{if("function"==typeof options)defaults.callback=options;else if(options)for(var name in options)Object.prototype.hasOwnProperty.call(options,name)&&(defaults[name]=options[name]);return defaults})(options,{ignoreWhitespace:!0}),lineDiff.diff(oldStr,newStr,options)},exports.diffWords=function(oldStr,newStr,options){return null==(null==options?void 0:options.ignoreWhitespace)||options.ignoreWhitespace?wordDiff.diff(oldStr,newStr,options):diffWordsWithSpace(oldStr,newStr,options)},exports.diffWordsWithSpace=diffWordsWithSpace,exports.formatPatch=formatPatch,exports.jsonDiff=jsonDiff,exports.lineDiff=lineDiff,exports.parsePatch=parsePatch,exports.reversePatch=function reversePatch(structuredPatch){return Array.isArray(structuredPatch)?structuredPatch.map(patch=>reversePatch(patch)).reverse():Object.assign(Object.assign({},structuredPatch),{oldFileName:structuredPatch.newFileName,oldHeader:structuredPatch.newHeader,newFileName:structuredPatch.oldFileName,newHeader:structuredPatch.oldHeader,hunks:structuredPatch.hunks.map(hunk=>({oldLines:hunk.newLines,oldStart:hunk.newStart,newLines:hunk.oldLines,newStart:hunk.oldStart,lines:hunk.lines.map(l=>l.startsWith("-")?"+"+l.slice(1):l.startsWith("+")?"-"+l.slice(1):l)}))})},exports.sentenceDiff=sentenceDiff,exports.structuredPatch=structuredPatch,exports.wordDiff=wordDiff,exports.wordsWithSpaceDiff=wordsWithSpaceDiff});
      \ No newline at end of file
      +((global,factory)=>{"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).Diff={})})(this,function(exports){class Diff{diff(oldStr,newStr,options={}){let callback;"function"==typeof options?(callback=options,options={}):"callback"in options&&(callback=options.callback);oldStr=this.castInput(oldStr,options),newStr=this.castInput(newStr,options),oldStr=this.removeEmpty(this.tokenize(oldStr,options)),newStr=this.removeEmpty(this.tokenize(newStr,options));return this.diffWithOptionsObj(oldStr,newStr,options,callback)}diffWithOptionsObj(oldTokens,newTokens,options,callback){let _a,done=value=>{if(value=this.postProcess(value,options),!callback)return value;setTimeout(function(){callback(value)},0)},newLen=newTokens.length,oldLen=oldTokens.length,editLength=1,maxEditLength=newLen+oldLen;null!=options.maxEditLength&&(maxEditLength=Math.min(maxEditLength,options.maxEditLength));var maxExecutionTime=null!=(_a=options.timeout)?_a:1/0;let abortAfterTimestamp=Date.now()+maxExecutionTime,bestPath=[{oldPos:-1,lastComponent:void 0}],newPos=this.extractCommon(bestPath[0],newTokens,oldTokens,0,options);if(bestPath[0].oldPos+1>=oldLen&&newPos+1>=newLen)return done(this.buildValues(bestPath[0].lastComponent,newTokens,oldTokens));let minDiagonalToConsider=-1/0,maxDiagonalToConsider=1/0,execEditLength=()=>{for(let diagonalPath=Math.max(minDiagonalToConsider,-editLength);diagonalPath<=Math.min(maxDiagonalToConsider,editLength);diagonalPath+=2){let basePath;var removePath=bestPath[diagonalPath-1],addPath=bestPath[diagonalPath+1];removePath&&(bestPath[diagonalPath-1]=void 0);let canAdd=!1;addPath&&(addPathNewPos=addPath.oldPos-diagonalPath,canAdd=addPath&&0<=addPathNewPos&&addPathNewPos=oldLen&&newPos+1>=newLen)return done(this.buildValues(basePath.lastComponent,newTokens,oldTokens))||!0;(bestPath[diagonalPath]=basePath).oldPos+1>=oldLen&&(maxDiagonalToConsider=Math.min(maxDiagonalToConsider,diagonalPath-1)),newPos+1>=newLen&&(minDiagonalToConsider=Math.max(minDiagonalToConsider,diagonalPath+1))}else bestPath[diagonalPath]=void 0}editLength++};if(callback)!function exec(){setTimeout(function(){if(editLength>maxEditLength||Date.now()>abortAfterTimestamp)return callback(void 0);execEditLength()||exec()},0)}();else for(;editLength<=maxEditLength&&Date.now()<=abortAfterTimestamp;){var ret=execEditLength();if(ret)return ret}}addToPath(path,added,removed,oldPosInc,options){var last=path.lastComponent;return last&&!options.oneChangePerToken&&last.added===added&&last.removed===removed?{oldPos:path.oldPos+oldPosInc,lastComponent:{count:last.count+1,added:added,removed:removed,previousComponent:last.previousComponent}}:{oldPos:path.oldPos+oldPosInc,lastComponent:{count:1,added:added,removed:removed,previousComponent:last}}}extractCommon(basePath,newTokens,oldTokens,diagonalPath,options){var newLen=newTokens.length,oldLen=oldTokens.length;let oldPos=basePath.oldPos,newPos=oldPos-diagonalPath,commonCount=0;for(;newPos+1value.length?i:value}),component.value=this.join(value)}else component.value=this.join(newTokens.slice(newPos,newPos+component.count));newPos+=component.count,component.added||(oldPos+=component.count)}}return components}}class CharacterDiff extends Diff{}let characterDiff=new CharacterDiff;function longestCommonPrefix(str1,str2){let i;for(i=0;i{let startA=0,endB=(a.length>b.length&&(startA=a.length-b.length),b.length),map=(a.length{/\s/.test(part)?null==prevPart?tokens.push(part):tokens.push(tokens.pop()+part):null!=prevPart&&/\s/.test(prevPart)?tokens[tokens.length-1]==prevPart?tokens.push(tokens.pop()+part):tokens.push(prevPart+part):tokens.push(part),prevPart=part}),tokens}join(tokens){return tokens.map((token,i)=>0==i?token:token.replace(/^\s+/,"")).join("")}postProcess(changes,options){if(changes&&!options.oneChangePerToken){let lastKeep=null,insertion=null,deletion=null;changes.forEach(change=>{change.added?insertion=change:deletion=change.removed?change:((insertion||deletion)&&dedupeWhitespaceInChangeObjects(lastKeep,deletion,insertion,change),lastKeep=change,insertion=null)}),(insertion||deletion)&&dedupeWhitespaceInChangeObjects(lastKeep,deletion,insertion,null)}return changes}}let wordDiff=new WordDiff;function dedupeWhitespaceInChangeObjects(startKeep,deletion,insertion,endKeep){if(deletion&&insertion){var oldWsPrefix=leadingWs(deletion.value),oldWsSuffix=trailingWs(deletion.value),newWsPrefix=leadingWs(insertion.value),newWsSuffix=trailingWs(insertion.value);startKeep&&(oldWsPrefix=longestCommonPrefix(oldWsPrefix,newWsPrefix),startKeep.value=replaceSuffix(startKeep.value,newWsPrefix,oldWsPrefix),deletion.value=removePrefix(deletion.value,oldWsPrefix),insertion.value=removePrefix(insertion.value,oldWsPrefix)),endKeep&&(newWsPrefix=longestCommonSuffix(oldWsSuffix,newWsSuffix),endKeep.value=replacePrefix(endKeep.value,newWsSuffix,newWsPrefix),deletion.value=removeSuffix(deletion.value,newWsPrefix),insertion.value=removeSuffix(insertion.value,newWsPrefix))}else if(insertion){if(startKeep&&(oldWsPrefix=leadingWs(insertion.value),insertion.value=insertion.value.substring(oldWsPrefix.length)),endKeep){let ws=leadingWs(endKeep.value);endKeep.value=endKeep.value.substring(ws.length)}}else if(startKeep&&endKeep){oldWsSuffix=leadingWs(endKeep.value),newWsSuffix=leadingWs(deletion.value),newWsPrefix=trailingWs(deletion.value),insertion=longestCommonPrefix(oldWsSuffix,newWsSuffix),oldWsPrefix=(deletion.value=removePrefix(deletion.value,insertion),longestCommonSuffix(removePrefix(oldWsSuffix,insertion),newWsPrefix));deletion.value=removeSuffix(deletion.value,oldWsPrefix),endKeep.value=replacePrefix(endKeep.value,oldWsSuffix,oldWsPrefix),startKeep.value=replaceSuffix(startKeep.value,oldWsSuffix,oldWsSuffix.slice(0,oldWsSuffix.length-oldWsPrefix.length))}else if(endKeep){newWsSuffix=leadingWs(endKeep.value),insertion=maximumOverlap(trailingWs(deletion.value),newWsSuffix);deletion.value=removeSuffix(deletion.value,insertion)}else if(startKeep){let overlap=maximumOverlap(trailingWs(startKeep.value),leadingWs(deletion.value));deletion.value=removePrefix(deletion.value,overlap)}}class WordsWithSpaceDiff extends Diff{tokenize(value){var regex=new RegExp(`(\\r?\\n)|[${extendedWordChars}]+|[^\\S\\n\\r]+|[^${extendedWordChars}]`,"ug");return value.match(regex)||[]}}let wordsWithSpaceDiff=new WordsWithSpaceDiff;function diffWordsWithSpace(oldStr,newStr,options){return wordsWithSpaceDiff.diff(oldStr,newStr,options)}class LineDiff extends Diff{constructor(){super(...arguments),this.tokenize=tokenize}equals(left,right,options){return options.ignoreWhitespace?(options.newlineIsToken&&left.includes("\n")||(left=left.trim()),options.newlineIsToken&&right.includes("\n")||(right=right.trim())):options.ignoreNewlineAtEof&&!options.newlineIsToken&&(left.endsWith("\n")&&(left=left.slice(0,-1)),right.endsWith("\n"))&&(right=right.slice(0,-1)),super.equals(left,right,options)}}let lineDiff=new LineDiff;function diffLines(oldStr,newStr,options){return lineDiff.diff(oldStr,newStr,options)}function tokenize(value,options){var retLines=[],linesAndNewlines=(value=options.stripTrailingCr?value.replace(/\r\n/g,"\n"):value).split(/(\n|\r\n)/);linesAndNewlines[linesAndNewlines.length-1]||linesAndNewlines.pop();for(let i=0;ivoid 0===v?undefinedReplacement:v}=options;return"string"==typeof value?value:JSON.stringify(canonicalize(value,null,null,stringifyReplacer),null,"  ")}equals(left,right,options){return super.equals(left.replace(/,([\r\n])/g,"$1"),right.replace(/,([\r\n])/g,"$1"),options)}}let jsonDiff=new JsonDiff;function canonicalize(obj,stack,replacementStack,replacer,key){stack=stack||[],replacementStack=replacementStack||[],replacer&&(obj=replacer(void 0===key?"":key,obj));let i;for(i=0;i{var chunkHeaderIndex=i,chunkHeaderLine=diffstr[i++],hunk={oldStart:+(chunkHeaderLine=chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/))[1],oldLines:void 0===chunkHeaderLine[2]?1:+chunkHeaderLine[2],newStart:+chunkHeaderLine[3],newLines:void 0===chunkHeaderLine[4]?1:+chunkHeaderLine[4],lines:[]};0===hunk.oldLines&&(hunk.oldStart+=1),0===hunk.newLines&&(hunk.newStart+=1);let addCount=0,removeCount=0;for(;i{!options.autoConvertLineEndings&&null!=options.autoConvertLineEndings||((string=>string.includes("\r\n")&&!string.startsWith("\n")&&!string.match(/[^\r]\n/))(source)&&(patch=>!(patch=Array.isArray(patch)?patch:[patch]).some(index=>index.hunks.some(hunk=>hunk.lines.some(line=>!line.startsWith("\\")&&line.endsWith("\r")))))(patch)?patch=function unixToWin(patch){return Array.isArray(patch)?patch.map(p=>unixToWin(p)):Object.assign(Object.assign({},patch),{hunks:patch.hunks.map(hunk=>Object.assign(Object.assign({},hunk),{lines:hunk.lines.map((line,i)=>line.startsWith("\\")||line.endsWith("\r")||null!=(i=hunk.lines[i+1])&&i.startsWith("\\")?line:line+"\r")}))})}(patch):(string=>!string.includes("\r\n")&&string.includes("\n"))(source)&&(patch=>(patch=Array.isArray(patch)?patch:[patch]).some(index=>index.hunks.some(hunk=>hunk.lines.some(line=>line.endsWith("\r"))))&&patch.every(index=>index.hunks.every(hunk=>hunk.lines.every((line,i)=>line.startsWith("\\")||line.endsWith("\r")||(null==(line=hunk.lines[i+1])?void 0:line.startsWith("\\"))))))(patch)&&(patch=function winToUnix(patch){return Array.isArray(patch)?patch.map(p=>winToUnix(p)):Object.assign(Object.assign({},patch),{hunks:patch.hunks.map(hunk=>Object.assign(Object.assign({},hunk),{lines:hunk.lines.map(line=>line.endsWith("\r")?line.substring(0,line.length-1):line)}))})}(patch)));let lines=source.split("\n"),hunks=patch.hunks,compareLine=options.compareLine||((lineNumber,line,operation,patchContent)=>line===patchContent),fuzzFactor=options.fuzzFactor||0,minLine=0;if(fuzzFactor<0||!Number.isInteger(fuzzFactor))throw new Error("fuzzFactor must be a non-negative integer");if(!hunks.length)return source;let prevLine="",removeEOFNL=!1,addEOFNL=!1;for(let i=0;i{let wantForward=!0,backwardExhausted=!1,forwardExhausted=!1,localOffset=1;return function iterator(){if(wantForward&&!forwardExhausted){if(backwardExhausted?localOffset++:wantForward=!1,start+localOffset<=maxLine)return start+localOffset;forwardExhausted=!0}if(!backwardExhausted)return forwardExhausted||(wantForward=!0),minLine<=start-localOffset?start-localOffset++:(backwardExhausted=!0,iterator())}})(toPos=hunk.oldStart+prevHunkOffset-1,minLine,maxLine);void 0!==toPos&&!(hunkResult=function applyHunk(hunkLines,toPos,maxErrors,hunkLinesI=0,lastContextLineMatched=!0,patchedLines=[],patchedLinesLength=0){let nConsecutiveOldContextLines=0,nextContextLineMustMatch=!1;for(;hunkLinesI{diff=diffLinesResultToPatch(diff);callback(diff)}}))}function diffLinesResultToPatch(diff){if(diff){diff.push({value:"",lines:[]});var hunks=[];let oldRangeStart=0,newRangeStart=0,curRange=[],oldLine=1,newLine=1;for(let i=0;i{var hasTrailingNl=text.endsWith("\n"),text=text.split("\n").map(line=>line+"\n");return hasTrailingNl?text.pop():text.push(text.pop().slice(0,-1)),text})(current.value);if(current.lines=lines,current.added||current.removed){oldRangeStart||(prev=diff[i-1],oldRangeStart=oldLine,newRangeStart=newLine,prev&&(curRange=0formatPatch(p,headerOptions)).join("\n")}var ret=[];headerOptions.includeIndex&&patch.oldFileName==patch.newFileName&&ret.push("Index: "+patch.oldFileName),headerOptions.includeUnderline&&ret.push("==================================================================="),headerOptions.includeFileHeaders&&(ret.push("--- "+patch.oldFileName+(void 0===patch.oldHeader?"":"\t"+patch.oldHeader)),ret.push("+++ "+patch.newFileName+(void 0===patch.newHeader?"":"\t"+patch.newHeader)));for(let i=0;i{patchObj?callback(formatPatch(patchObj,options.headerOptions)):callback(void 0)}}))}else{oldFileName=structuredPatch(oldFileName,newFileName,oldStr,newStr,oldHeader,newHeader,options);if(oldFileName)return formatPatch(oldFileName,null==options?void 0:options.headerOptions)}}exports.Diff=Diff,exports.FILE_HEADERS_ONLY={includeIndex:!1,includeUnderline:!1,includeFileHeaders:!0},exports.INCLUDE_HEADERS=INCLUDE_HEADERS,exports.OMIT_HEADERS={includeIndex:!1,includeUnderline:!1,includeFileHeaders:!1},exports.applyPatch=applyPatch,exports.applyPatches=function(uniDiff,options){let spDiff="string"==typeof uniDiff?parsePatch(uniDiff):uniDiff,currentIndex=0;!function processIndex(){let index=spDiff[currentIndex++];if(!index)return options.complete();options.loadFile(index,function(err,data){if(err)return options.complete(err);err=applyPatch(data,index,options),options.patched(index,err,function(err){if(err)return options.complete(err);processIndex()})})}()},exports.arrayDiff=arrayDiff,exports.canonicalize=canonicalize,exports.characterDiff=characterDiff,exports.convertChangesToDMP=function(changes){var ret=[];let change,operation;for(let i=0;i"):change.removed&&ret.push(""),ret.push((s=>{let n=s;return n=(n=(n=(n=n.replace(/&/g,"&")).replace(//g,">")).replace(/"/g,""")})(change.value)),change.added?ret.push(""):change.removed&&ret.push("")}return ret.join("")},exports.createPatch=function(fileName,oldStr,newStr,oldHeader,newHeader,options){return createTwoFilesPatch(fileName,fileName,oldStr,newStr,oldHeader,newHeader,options)},exports.createTwoFilesPatch=createTwoFilesPatch,exports.cssDiff=cssDiff,exports.diffArrays=function(oldArr,newArr,options){return arrayDiff.diff(oldArr,newArr,options)},exports.diffChars=function(oldStr,newStr,options){return characterDiff.diff(oldStr,newStr,options)},exports.diffCss=function(oldStr,newStr,options){return cssDiff.diff(oldStr,newStr,options)},exports.diffJson=function(oldStr,newStr,options){return jsonDiff.diff(oldStr,newStr,options)},exports.diffLines=diffLines,exports.diffSentences=function(oldStr,newStr,options){return sentenceDiff.diff(oldStr,newStr,options)},exports.diffTrimmedLines=function(oldStr,newStr,options){return options=((options,defaults)=>{if("function"==typeof options)defaults.callback=options;else if(options)for(var name in options)Object.prototype.hasOwnProperty.call(options,name)&&(defaults[name]=options[name]);return defaults})(options,{ignoreWhitespace:!0}),lineDiff.diff(oldStr,newStr,options)},exports.diffWords=function(oldStr,newStr,options){return null==(null==options?void 0:options.ignoreWhitespace)||options.ignoreWhitespace?wordDiff.diff(oldStr,newStr,options):diffWordsWithSpace(oldStr,newStr,options)},exports.diffWordsWithSpace=diffWordsWithSpace,exports.formatPatch=formatPatch,exports.jsonDiff=jsonDiff,exports.lineDiff=lineDiff,exports.parsePatch=parsePatch,exports.reversePatch=function reversePatch(structuredPatch){return Array.isArray(structuredPatch)?structuredPatch.map(patch=>reversePatch(patch)).reverse():Object.assign(Object.assign({},structuredPatch),{oldFileName:structuredPatch.newFileName,oldHeader:structuredPatch.newHeader,newFileName:structuredPatch.oldFileName,newHeader:structuredPatch.oldHeader,hunks:structuredPatch.hunks.map(hunk=>({oldLines:hunk.newLines,oldStart:hunk.newStart,newLines:hunk.oldLines,newStart:hunk.oldStart,lines:hunk.lines.map(l=>l.startsWith("-")?"+"+l.slice(1):l.startsWith("+")?"-"+l.slice(1):l)}))})},exports.sentenceDiff=sentenceDiff,exports.structuredPatch=structuredPatch,exports.wordDiff=wordDiff,exports.wordsWithSpaceDiff=wordsWithSpaceDiff});
      \ No newline at end of file
      diff --git a/deps/npm/node_modules/diff/libcjs/diff/word.js b/deps/npm/node_modules/diff/libcjs/diff/word.js
      index 8c76eb2691a644..e3cf8ba6bc1ee3 100644
      --- a/deps/npm/node_modules/diff/libcjs/diff/word.js
      +++ b/deps/npm/node_modules/diff/libcjs/diff/word.js
      @@ -22,27 +22,29 @@ var base_js_1 = require("./base.js");
       var string_js_1 = require("../util/string.js");
       // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode
       //
      -// Ranges and exceptions:
      -// Latin-1 Supplement, 0080–00FF
      -//  - U+00D7  × Multiplication sign
      -//  - U+00F7  ÷ Division sign
      -// Latin Extended-A, 0100–017F
      -// Latin Extended-B, 0180–024F
      -// IPA Extensions, 0250–02AF
      -// Spacing Modifier Letters, 02B0–02FF
      -//  - U+02C7  ˇ ˇ  Caron
      -//  - U+02D8  ˘ ˘  Breve
      -//  - U+02D9  ˙ ˙  Dot Above
      -//  - U+02DA  ˚ ˚  Ring Above
      -//  - U+02DB  ˛ ˛  Ogonek
      -//  - U+02DC  ˜ ˜  Small Tilde
      -//  - U+02DD  ˝ ˝  Double Acute Accent
      -// Latin Extended Additional, 1E00–1EFF
      -var extendedWordChars = 'a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
      +// Chars/ranges counted as "word" characters by this regex are as follows:
      +//
      +// + U+00AD  Soft hyphen
      +// + 00C0–00FF (letters with diacritics from the Latin-1 Supplement), except:
      +//   - U+00D7  × Multiplication sign
      +//   - U+00F7  ÷ Division sign
      +// + Latin Extended-A, 0100–017F
      +// + Latin Extended-B, 0180–024F
      +// + IPA Extensions, 0250–02AF
      +// + Spacing Modifier Letters, 02B0–02FF, except:
      +//   - U+02C7  ˇ ˇ  Caron
      +//   - U+02D8  ˘ ˘  Breve
      +//   - U+02D9  ˙ ˙  Dot Above
      +//   - U+02DA  ˚ ˚  Ring Above
      +//   - U+02DB  ˛ ˛  Ogonek
      +//   - U+02DC  ˜ ˜  Small Tilde
      +//   - U+02DD  ˝ ˝  Double Acute Accent
      +// + Latin Extended Additional, 1E00–1EFF
      +var extendedWordChars = 'a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
       // Each token is one of the following:
       // - A punctuation mark plus the surrounding whitespace
       // - A word plus the surrounding whitespace
      -// - Pure whitespace (but only in the special case where this the entire text
      +// - Pure whitespace (but only in the special case where the entire text
       //   is just whitespace)
       //
       // We have to include surrounding whitespace in the tokens because the two
      @@ -84,7 +86,26 @@ var WordDiff = /** @class */ (function (_super) {
                   if (segmenter.resolvedOptions().granularity != 'word') {
                       throw new Error('The segmenter passed must have a granularity of "word"');
                   }
      -            parts = Array.from(segmenter.segment(value), function (segment) { return segment.segment; });
      +            // We want `parts` to be an array whose elements alternate between being
      +            // pure whitespace and being pure non-whitespace. This is ALMOST what the
      +            // segments returned by a word-based Intl.Segmenter already look like,
      +            // and therefore we can ALMOST get what we want by simply doing...
      +            //     parts = Array.from(segmenter.segment(value), segment => segment.segment);
      +            // ... but not QUITE, because there's of one annoying special case: every
      +            // newline character gets its own segment, instead of sharing a segment
      +            // with other surrounding whitespace. We therefore need to manually merge
      +            // consecutive segments of whitespace into a single part:
      +            parts = [];
      +            for (var _i = 0, _a = Array.from(segmenter.segment(value)); _i < _a.length; _i++) {
      +                var segmentObj = _a[_i];
      +                var segment = segmentObj.segment;
      +                if (parts.length && (/\s/).test(parts[parts.length - 1]) && (/\s/).test(segment)) {
      +                    parts[parts.length - 1] += segment;
      +                }
      +                else {
      +                    parts.push(segment);
      +                }
      +            }
               }
               else {
                   parts = value.match(tokenizeIncludingWhitespace) || [];
      @@ -292,7 +313,7 @@ var WordsWithSpaceDiff = /** @class */ (function (_super) {
           }
           WordsWithSpaceDiff.prototype.tokenize = function (value) {
               // Slightly different to the tokenizeIncludingWhitespace regex used above in
      -        // that this one treats each individual newline as a distinct tokens, rather
      +        // that this one treats each individual newline as a distinct token, rather
               // than merging them into other surrounding whitespace. This was requested
               // in https://github.com/kpdecker/jsdiff/issues/180 &
               //    https://github.com/kpdecker/jsdiff/issues/211
      diff --git a/deps/npm/node_modules/diff/libcjs/index.js b/deps/npm/node_modules/diff/libcjs/index.js
      index e07c46b0dd4046..3ad381e4f34601 100644
      --- a/deps/npm/node_modules/diff/libcjs/index.js
      +++ b/deps/npm/node_modules/diff/libcjs/index.js
      @@ -1,7 +1,7 @@
       "use strict";
       /* See LICENSE file for terms of use */
       Object.defineProperty(exports, "__esModule", { value: true });
      -exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.reversePatch = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.formatPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.arrayDiff = exports.diffArrays = exports.jsonDiff = exports.diffJson = exports.cssDiff = exports.diffCss = exports.sentenceDiff = exports.diffSentences = exports.diffTrimmedLines = exports.lineDiff = exports.diffLines = exports.wordsWithSpaceDiff = exports.diffWordsWithSpace = exports.wordDiff = exports.diffWords = exports.characterDiff = exports.diffChars = exports.Diff = void 0;
      +exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.reversePatch = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.OMIT_HEADERS = exports.FILE_HEADERS_ONLY = exports.INCLUDE_HEADERS = exports.formatPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.arrayDiff = exports.diffArrays = exports.jsonDiff = exports.diffJson = exports.cssDiff = exports.diffCss = exports.sentenceDiff = exports.diffSentences = exports.diffTrimmedLines = exports.lineDiff = exports.diffLines = exports.wordsWithSpaceDiff = exports.diffWordsWithSpace = exports.wordDiff = exports.diffWords = exports.characterDiff = exports.diffChars = exports.Diff = void 0;
       /*
        * Text diff implementation.
        *
      @@ -55,6 +55,9 @@ Object.defineProperty(exports, "structuredPatch", { enumerable: true, get: funct
       Object.defineProperty(exports, "createTwoFilesPatch", { enumerable: true, get: function () { return create_js_1.createTwoFilesPatch; } });
       Object.defineProperty(exports, "createPatch", { enumerable: true, get: function () { return create_js_1.createPatch; } });
       Object.defineProperty(exports, "formatPatch", { enumerable: true, get: function () { return create_js_1.formatPatch; } });
      +Object.defineProperty(exports, "INCLUDE_HEADERS", { enumerable: true, get: function () { return create_js_1.INCLUDE_HEADERS; } });
      +Object.defineProperty(exports, "FILE_HEADERS_ONLY", { enumerable: true, get: function () { return create_js_1.FILE_HEADERS_ONLY; } });
      +Object.defineProperty(exports, "OMIT_HEADERS", { enumerable: true, get: function () { return create_js_1.OMIT_HEADERS; } });
       var dmp_js_1 = require("./convert/dmp.js");
       Object.defineProperty(exports, "convertChangesToDMP", { enumerable: true, get: function () { return dmp_js_1.convertChangesToDMP; } });
       var xml_js_1 = require("./convert/xml.js");
      diff --git a/deps/npm/node_modules/diff/libcjs/patch/create.js b/deps/npm/node_modules/diff/libcjs/patch/create.js
      index 0f0a9ee7239283..d9328c2e7709fe 100644
      --- a/deps/npm/node_modules/diff/libcjs/patch/create.js
      +++ b/deps/npm/node_modules/diff/libcjs/patch/create.js
      @@ -11,11 +11,27 @@ var __assign = (this && this.__assign) || function () {
           return __assign.apply(this, arguments);
       };
       Object.defineProperty(exports, "__esModule", { value: true });
      +exports.OMIT_HEADERS = exports.FILE_HEADERS_ONLY = exports.INCLUDE_HEADERS = void 0;
       exports.structuredPatch = structuredPatch;
       exports.formatPatch = formatPatch;
       exports.createTwoFilesPatch = createTwoFilesPatch;
       exports.createPatch = createPatch;
       var line_js_1 = require("../diff/line.js");
      +exports.INCLUDE_HEADERS = {
      +    includeIndex: true,
      +    includeUnderline: true,
      +    includeFileHeaders: true
      +};
      +exports.FILE_HEADERS_ONLY = {
      +    includeIndex: false,
      +    includeUnderline: false,
      +    includeFileHeaders: true
      +};
      +exports.OMIT_HEADERS = {
      +    includeIndex: false,
      +    includeUnderline: false,
      +    includeFileHeaders: false
      +};
       function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
           var optionsObj;
           if (!options) {
      @@ -149,17 +165,29 @@ function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, ne
        * creates a unified diff patch.
        * @param patch either a single structured patch object (as returned by `structuredPatch`) or an array of them (as returned by `parsePatch`)
        */
      -function formatPatch(patch) {
      +function formatPatch(patch, headerOptions) {
      +    if (!headerOptions) {
      +        headerOptions = exports.INCLUDE_HEADERS;
      +    }
           if (Array.isArray(patch)) {
      -        return patch.map(formatPatch).join('\n');
      +        if (patch.length > 1 && !headerOptions.includeFileHeaders) {
      +            throw new Error('Cannot omit file headers on a multi-file patch. '
      +                + '(The result would be unparseable; how would a tool trying to apply '
      +                + 'the patch know which changes are to which file?)');
      +        }
      +        return patch.map(function (p) { return formatPatch(p, headerOptions); }).join('\n');
           }
           var ret = [];
      -    if (patch.oldFileName == patch.newFileName) {
      +    if (headerOptions.includeIndex && patch.oldFileName == patch.newFileName) {
               ret.push('Index: ' + patch.oldFileName);
           }
      -    ret.push('===================================================================');
      -    ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      -    ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +    if (headerOptions.includeUnderline) {
      +        ret.push('===================================================================');
      +    }
      +    if (headerOptions.includeFileHeaders) {
      +        ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      +        ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +    }
           for (var i = 0; i < patch.hunks.length; i++) {
               var hunk = patch.hunks[i];
               // Unified Diff Format quirk: If the chunk size is 0,
      @@ -190,7 +218,7 @@ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader
               if (!patchObj) {
                   return;
               }
      -        return formatPatch(patchObj);
      +        return formatPatch(patchObj, options === null || options === void 0 ? void 0 : options.headerOptions);
           }
           else {
               var callback_2 = options.callback;
      @@ -199,7 +227,7 @@ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader
                           callback_2(undefined);
                       }
                       else {
      -                    callback_2(formatPatch(patchObj));
      +                    callback_2(formatPatch(patchObj, options.headerOptions));
                       }
                   } }));
           }
      diff --git a/deps/npm/node_modules/diff/libcjs/patch/parse.js b/deps/npm/node_modules/diff/libcjs/patch/parse.js
      index 247262032e34a0..f2769cff9a5378 100644
      --- a/deps/npm/node_modules/diff/libcjs/patch/parse.js
      +++ b/deps/npm/node_modules/diff/libcjs/patch/parse.js
      @@ -19,10 +19,27 @@ function parsePatch(uniDiff) {
                   if ((/^(---|\+\+\+|@@)\s/).test(line)) {
                       break;
                   }
      -            // Diff index
      -            var header = (/^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/).exec(line);
      -            if (header) {
      -                index.index = header[1];
      +            // Try to parse the line as a diff header, like
      +            //     Index: README.md
      +            // or
      +            //     diff -r 9117c6561b0b -r 273ce12ad8f1 .hgignore
      +            // or
      +            //     Index: something with multiple words
      +            // and extract the filename (or whatever else is used as an index name)
      +            // from the end (i.e. 'README.md', '.hgignore', or
      +            // 'something with multiple words' in the examples above).
      +            //
      +            // TODO: It seems awkward that we indiscriminately trim off trailing
      +            //       whitespace here. Theoretically, couldn't that be meaningful -
      +            //       e.g. if the patch represents a diff of a file whose name ends
      +            //       with a space? Seems wrong to nuke it.
      +            //       But this behaviour has been around since v2.2.1 in 2015, so if
      +            //       it's going to change, it should be done cautiously and in a new
      +            //       major release, for backwards-compat reasons.
      +            //       -- ExplodingCabbage
      +            var headerMatch = (/^(?:Index:|diff(?: -r \w+)+)\s+/).exec(line);
      +            if (headerMatch) {
      +                index.index = line.substring(headerMatch[0].length).trim();
                   }
                   i++;
               }
      @@ -51,14 +68,14 @@ function parsePatch(uniDiff) {
           // Parses the --- and +++ headers, if none are found, no lines
           // are consumed.
           function parseFileHeader(index) {
      -        var fileHeader = (/^(---|\+\+\+)\s+(.*)\r?$/).exec(diffstr[i]);
      -        if (fileHeader) {
      -            var data = fileHeader[2].split('\t', 2), header = (data[1] || '').trim();
      +        var fileHeaderMatch = (/^(---|\+\+\+)\s+/).exec(diffstr[i]);
      +        if (fileHeaderMatch) {
      +            var prefix = fileHeaderMatch[1], data = diffstr[i].substring(3).trim().split('\t', 2), header = (data[1] || '').trim();
                   var fileName = data[0].replace(/\\\\/g, '\\');
      -            if ((/^".*"$/).test(fileName)) {
      +            if (fileName.startsWith('"') && fileName.endsWith('"')) {
                       fileName = fileName.substr(1, fileName.length - 2);
                   }
      -            if (fileHeader[1] === '---') {
      +            if (prefix === '---') {
                       index.oldFileName = fileName;
                       index.oldHeader = header;
                   }
      diff --git a/deps/npm/node_modules/diff/libcjs/util/string.js b/deps/npm/node_modules/diff/libcjs/util/string.js
      index 847ec88a88f5da..a36bf61eea2e4b 100644
      --- a/deps/npm/node_modules/diff/libcjs/util/string.js
      +++ b/deps/npm/node_modules/diff/libcjs/util/string.js
      @@ -116,7 +116,7 @@ function hasOnlyUnixLineEndings(string) {
       }
       function trailingWs(string) {
           // Yes, this looks overcomplicated and dumb - why not replace the whole function with
      -    //     return string match(/\s*$/)[0]
      +    //     return string.match(/\s*$/)[0]
           // you ask? Because:
           // 1. the trap described at https://markamery.com/blog/quadratic-time-regexes/ would mean doing
           //    this would cause this function to take O(n²) time in the worst case (specifically when
      diff --git a/deps/npm/node_modules/diff/libesm/diff/word.js b/deps/npm/node_modules/diff/libesm/diff/word.js
      index 5f8e03a09283ee..e828f825020f4a 100644
      --- a/deps/npm/node_modules/diff/libesm/diff/word.js
      +++ b/deps/npm/node_modules/diff/libesm/diff/word.js
      @@ -2,27 +2,29 @@ import Diff from './base.js';
       import { longestCommonPrefix, longestCommonSuffix, replacePrefix, replaceSuffix, removePrefix, removeSuffix, maximumOverlap, leadingWs, trailingWs } from '../util/string.js';
       // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode
       //
      -// Ranges and exceptions:
      -// Latin-1 Supplement, 0080–00FF
      -//  - U+00D7  × Multiplication sign
      -//  - U+00F7  ÷ Division sign
      -// Latin Extended-A, 0100–017F
      -// Latin Extended-B, 0180–024F
      -// IPA Extensions, 0250–02AF
      -// Spacing Modifier Letters, 02B0–02FF
      -//  - U+02C7  ˇ ˇ  Caron
      -//  - U+02D8  ˘ ˘  Breve
      -//  - U+02D9  ˙ ˙  Dot Above
      -//  - U+02DA  ˚ ˚  Ring Above
      -//  - U+02DB  ˛ ˛  Ogonek
      -//  - U+02DC  ˜ ˜  Small Tilde
      -//  - U+02DD  ˝ ˝  Double Acute Accent
      -// Latin Extended Additional, 1E00–1EFF
      -const extendedWordChars = 'a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
      +// Chars/ranges counted as "word" characters by this regex are as follows:
      +//
      +// + U+00AD  Soft hyphen
      +// + 00C0–00FF (letters with diacritics from the Latin-1 Supplement), except:
      +//   - U+00D7  × Multiplication sign
      +//   - U+00F7  ÷ Division sign
      +// + Latin Extended-A, 0100–017F
      +// + Latin Extended-B, 0180–024F
      +// + IPA Extensions, 0250–02AF
      +// + Spacing Modifier Letters, 02B0–02FF, except:
      +//   - U+02C7  ˇ ˇ  Caron
      +//   - U+02D8  ˘ ˘  Breve
      +//   - U+02D9  ˙ ˙  Dot Above
      +//   - U+02DA  ˚ ˚  Ring Above
      +//   - U+02DB  ˛ ˛  Ogonek
      +//   - U+02DC  ˜ ˜  Small Tilde
      +//   - U+02DD  ˝ ˝  Double Acute Accent
      +// + Latin Extended Additional, 1E00–1EFF
      +const extendedWordChars = 'a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}';
       // Each token is one of the following:
       // - A punctuation mark plus the surrounding whitespace
       // - A word plus the surrounding whitespace
      -// - Pure whitespace (but only in the special case where this the entire text
      +// - Pure whitespace (but only in the special case where the entire text
       //   is just whitespace)
       //
       // We have to include surrounding whitespace in the tokens because the two
      @@ -59,7 +61,25 @@ class WordDiff extends Diff {
                   if (segmenter.resolvedOptions().granularity != 'word') {
                       throw new Error('The segmenter passed must have a granularity of "word"');
                   }
      -            parts = Array.from(segmenter.segment(value), segment => segment.segment);
      +            // We want `parts` to be an array whose elements alternate between being
      +            // pure whitespace and being pure non-whitespace. This is ALMOST what the
      +            // segments returned by a word-based Intl.Segmenter already look like,
      +            // and therefore we can ALMOST get what we want by simply doing...
      +            //     parts = Array.from(segmenter.segment(value), segment => segment.segment);
      +            // ... but not QUITE, because there's of one annoying special case: every
      +            // newline character gets its own segment, instead of sharing a segment
      +            // with other surrounding whitespace. We therefore need to manually merge
      +            // consecutive segments of whitespace into a single part:
      +            parts = [];
      +            for (const segmentObj of Array.from(segmenter.segment(value))) {
      +                const segment = segmentObj.segment;
      +                if (parts.length && (/\s/).test(parts[parts.length - 1]) && (/\s/).test(segment)) {
      +                    parts[parts.length - 1] += segment;
      +                }
      +                else {
      +                    parts.push(segment);
      +                }
      +            }
               }
               else {
                   parts = value.match(tokenizeIncludingWhitespace) || [];
      @@ -262,7 +282,7 @@ function dedupeWhitespaceInChangeObjects(startKeep, deletion, insertion, endKeep
       class WordsWithSpaceDiff extends Diff {
           tokenize(value) {
               // Slightly different to the tokenizeIncludingWhitespace regex used above in
      -        // that this one treats each individual newline as a distinct tokens, rather
      +        // that this one treats each individual newline as a distinct token, rather
               // than merging them into other surrounding whitespace. This was requested
               // in https://github.com/kpdecker/jsdiff/issues/180 &
               //    https://github.com/kpdecker/jsdiff/issues/211
      diff --git a/deps/npm/node_modules/diff/libesm/index.js b/deps/npm/node_modules/diff/libesm/index.js
      index 48c8a7af6a4120..18a495a18f6637 100644
      --- a/deps/npm/node_modules/diff/libesm/index.js
      +++ b/deps/npm/node_modules/diff/libesm/index.js
      @@ -24,7 +24,7 @@ import { diffArrays, arrayDiff } from './diff/array.js';
       import { applyPatch, applyPatches } from './patch/apply.js';
       import { parsePatch } from './patch/parse.js';
       import { reversePatch } from './patch/reverse.js';
      -import { structuredPatch, createTwoFilesPatch, createPatch, formatPatch } from './patch/create.js';
      +import { structuredPatch, createTwoFilesPatch, createPatch, formatPatch, INCLUDE_HEADERS, FILE_HEADERS_ONLY, OMIT_HEADERS } from './patch/create.js';
       import { convertChangesToDMP } from './convert/dmp.js';
       import { convertChangesToXML } from './convert/xml.js';
      -export { Diff, diffChars, characterDiff, diffWords, wordDiff, diffWordsWithSpace, wordsWithSpaceDiff, diffLines, lineDiff, diffTrimmedLines, diffSentences, sentenceDiff, diffCss, cssDiff, diffJson, jsonDiff, diffArrays, arrayDiff, structuredPatch, createTwoFilesPatch, createPatch, formatPatch, applyPatch, applyPatches, parsePatch, reversePatch, convertChangesToDMP, convertChangesToXML, canonicalize };
      +export { Diff, diffChars, characterDiff, diffWords, wordDiff, diffWordsWithSpace, wordsWithSpaceDiff, diffLines, lineDiff, diffTrimmedLines, diffSentences, sentenceDiff, diffCss, cssDiff, diffJson, jsonDiff, diffArrays, arrayDiff, structuredPatch, createTwoFilesPatch, createPatch, formatPatch, INCLUDE_HEADERS, FILE_HEADERS_ONLY, OMIT_HEADERS, applyPatch, applyPatches, parsePatch, reversePatch, convertChangesToDMP, convertChangesToXML, canonicalize };
      diff --git a/deps/npm/node_modules/diff/libesm/patch/create.js b/deps/npm/node_modules/diff/libesm/patch/create.js
      index 7019c3c5ec46e7..73ba2969cf94a8 100644
      --- a/deps/npm/node_modules/diff/libesm/patch/create.js
      +++ b/deps/npm/node_modules/diff/libesm/patch/create.js
      @@ -1,4 +1,19 @@
       import { diffLines } from '../diff/line.js';
      +export const INCLUDE_HEADERS = {
      +    includeIndex: true,
      +    includeUnderline: true,
      +    includeFileHeaders: true
      +};
      +export const FILE_HEADERS_ONLY = {
      +    includeIndex: false,
      +    includeUnderline: false,
      +    includeFileHeaders: true
      +};
      +export const OMIT_HEADERS = {
      +    includeIndex: false,
      +    includeUnderline: false,
      +    includeFileHeaders: false
      +};
       export function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
           let optionsObj;
           if (!options) {
      @@ -128,17 +143,29 @@ export function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHea
        * creates a unified diff patch.
        * @param patch either a single structured patch object (as returned by `structuredPatch`) or an array of them (as returned by `parsePatch`)
        */
      -export function formatPatch(patch) {
      +export function formatPatch(patch, headerOptions) {
      +    if (!headerOptions) {
      +        headerOptions = INCLUDE_HEADERS;
      +    }
           if (Array.isArray(patch)) {
      -        return patch.map(formatPatch).join('\n');
      +        if (patch.length > 1 && !headerOptions.includeFileHeaders) {
      +            throw new Error('Cannot omit file headers on a multi-file patch. '
      +                + '(The result would be unparseable; how would a tool trying to apply '
      +                + 'the patch know which changes are to which file?)');
      +        }
      +        return patch.map(p => formatPatch(p, headerOptions)).join('\n');
           }
           const ret = [];
      -    if (patch.oldFileName == patch.newFileName) {
      +    if (headerOptions.includeIndex && patch.oldFileName == patch.newFileName) {
               ret.push('Index: ' + patch.oldFileName);
           }
      -    ret.push('===================================================================');
      -    ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      -    ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +    if (headerOptions.includeUnderline) {
      +        ret.push('===================================================================');
      +    }
      +    if (headerOptions.includeFileHeaders) {
      +        ret.push('--- ' + patch.oldFileName + (typeof patch.oldHeader === 'undefined' ? '' : '\t' + patch.oldHeader));
      +        ret.push('+++ ' + patch.newFileName + (typeof patch.newHeader === 'undefined' ? '' : '\t' + patch.newHeader));
      +    }
           for (let i = 0; i < patch.hunks.length; i++) {
               const hunk = patch.hunks[i];
               // Unified Diff Format quirk: If the chunk size is 0,
      @@ -168,7 +195,7 @@ export function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, ol
               if (!patchObj) {
                   return;
               }
      -        return formatPatch(patchObj);
      +        return formatPatch(patchObj, options === null || options === void 0 ? void 0 : options.headerOptions);
           }
           else {
               const { callback } = options;
      @@ -177,7 +204,7 @@ export function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, ol
                           callback(undefined);
                       }
                       else {
      -                    callback(formatPatch(patchObj));
      +                    callback(formatPatch(patchObj, options.headerOptions));
                       }
                   } }));
           }
      diff --git a/deps/npm/node_modules/diff/libesm/patch/parse.js b/deps/npm/node_modules/diff/libesm/patch/parse.js
      index 3f9a0d7904f60a..1dacac74bcf000 100644
      --- a/deps/npm/node_modules/diff/libesm/patch/parse.js
      +++ b/deps/npm/node_modules/diff/libesm/patch/parse.js
      @@ -16,10 +16,27 @@ export function parsePatch(uniDiff) {
                   if ((/^(---|\+\+\+|@@)\s/).test(line)) {
                       break;
                   }
      -            // Diff index
      -            const header = (/^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/).exec(line);
      -            if (header) {
      -                index.index = header[1];
      +            // Try to parse the line as a diff header, like
      +            //     Index: README.md
      +            // or
      +            //     diff -r 9117c6561b0b -r 273ce12ad8f1 .hgignore
      +            // or
      +            //     Index: something with multiple words
      +            // and extract the filename (or whatever else is used as an index name)
      +            // from the end (i.e. 'README.md', '.hgignore', or
      +            // 'something with multiple words' in the examples above).
      +            //
      +            // TODO: It seems awkward that we indiscriminately trim off trailing
      +            //       whitespace here. Theoretically, couldn't that be meaningful -
      +            //       e.g. if the patch represents a diff of a file whose name ends
      +            //       with a space? Seems wrong to nuke it.
      +            //       But this behaviour has been around since v2.2.1 in 2015, so if
      +            //       it's going to change, it should be done cautiously and in a new
      +            //       major release, for backwards-compat reasons.
      +            //       -- ExplodingCabbage
      +            const headerMatch = (/^(?:Index:|diff(?: -r \w+)+)\s+/).exec(line);
      +            if (headerMatch) {
      +                index.index = line.substring(headerMatch[0].length).trim();
                   }
                   i++;
               }
      @@ -48,14 +65,14 @@ export function parsePatch(uniDiff) {
           // Parses the --- and +++ headers, if none are found, no lines
           // are consumed.
           function parseFileHeader(index) {
      -        const fileHeader = (/^(---|\+\+\+)\s+(.*)\r?$/).exec(diffstr[i]);
      -        if (fileHeader) {
      -            const data = fileHeader[2].split('\t', 2), header = (data[1] || '').trim();
      +        const fileHeaderMatch = (/^(---|\+\+\+)\s+/).exec(diffstr[i]);
      +        if (fileHeaderMatch) {
      +            const prefix = fileHeaderMatch[1], data = diffstr[i].substring(3).trim().split('\t', 2), header = (data[1] || '').trim();
                   let fileName = data[0].replace(/\\\\/g, '\\');
      -            if ((/^".*"$/).test(fileName)) {
      +            if (fileName.startsWith('"') && fileName.endsWith('"')) {
                       fileName = fileName.substr(1, fileName.length - 2);
                   }
      -            if (fileHeader[1] === '---') {
      +            if (prefix === '---') {
                       index.oldFileName = fileName;
                       index.oldHeader = header;
                   }
      diff --git a/deps/npm/node_modules/diff/libesm/util/string.js b/deps/npm/node_modules/diff/libesm/util/string.js
      index 36cfb3aa85ddfe..32ab86455bf3fb 100644
      --- a/deps/npm/node_modules/diff/libesm/util/string.js
      +++ b/deps/npm/node_modules/diff/libesm/util/string.js
      @@ -103,7 +103,7 @@ export function hasOnlyUnixLineEndings(string) {
       }
       export function trailingWs(string) {
           // Yes, this looks overcomplicated and dumb - why not replace the whole function with
      -    //     return string match(/\s*$/)[0]
      +    //     return string.match(/\s*$/)[0]
           // you ask? Because:
           // 1. the trap described at https://markamery.com/blog/quadratic-time-regexes/ would mean doing
           //    this would cause this function to take O(n²) time in the worst case (specifically when
      diff --git a/deps/npm/node_modules/diff/package.json b/deps/npm/node_modules/diff/package.json
      index b941f247c27e47..f5a87f0610a884 100644
      --- a/deps/npm/node_modules/diff/package.json
      +++ b/deps/npm/node_modules/diff/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "diff",
      -  "version": "8.0.2",
      +  "version": "8.0.3",
         "description": "A JavaScript text diff implementation.",
         "keywords": [
           "diff",
      @@ -23,7 +23,7 @@
         "license": "BSD-3-Clause",
         "repository": {
           "type": "git",
      -    "url": "git://github.com/kpdecker/jsdiff.git"
      +    "url": "https://github.com/kpdecker/jsdiff.git"
         },
         "engines": {
           "node": ">=0.3.1"
      @@ -127,5 +127,6 @@
           "lines": 100,
           "functions": 100,
           "statements": 100
      -  }
      +  },
      +  "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
       }
      diff --git a/deps/npm/node_modules/diff/release-notes.md b/deps/npm/node_modules/diff/release-notes.md
      index 28219b2b0e5d4a..28b633788c3949 100644
      --- a/deps/npm/node_modules/diff/release-notes.md
      +++ b/deps/npm/node_modules/diff/release-notes.md
      @@ -1,5 +1,12 @@
       # Release Notes
       
      +## 8.0.3
      +
      +- [#631](https://github.com/kpdecker/jsdiff/pull/631) - **fix support for using an `Intl.Segmenter` with `diffWords`**. This has been almost completely broken since the feature was added in v6.0.0, since it would outright crash on any text that featured two consecutive newlines between a pair of words (a very common case).
      +- [#635](https://github.com/kpdecker/jsdiff/pull/635) - **small tweaks to tokenization behaviour of `diffWords`** when used *without* an `Intl.Segmenter`. Specifically, the soft hyphen (U+00AD) is no longer considered to be a word break, and the multiplication and division signs (`×` and `÷`) are now treated as punctuation instead of as letters / word characters.
      +- [#641](https://github.com/kpdecker/jsdiff/pull/641) - **the format of file headers in `createPatch` etc. patches can now be customised somewhat**. It now takes a `headerOptions` option that can be used to disable the file headers entirely, or omit the `Index:` line and/or the underline. In particular, this was motivated by a request to make jsdiff patches compatible with react-diff-view, which they now are if produced with `headerOptions: FILE_HEADERS_ONLY`.
      +- [#647](https://github.com/kpdecker/jsdiff/pull/647) and [#649](https://github.com/kpdecker/jsdiff/pull/649) - **fix denial-of-service vulnerabilities in `parsePatch` whereby adversarial input could cause a memory-leaking infinite loop, typically crashing the calling process**. Also fixed ReDOS vulnerabilities whereby adversarially-crafted patch headers could take cubic time to parse. Now, `parsePatch` should reliably take linear time. (Handling of headers that include the line break characters `\r`, `\u2028`, or `\u2029` in non-trailing positions is also now more reasonable as side effect of the fix.)
      +
       ## 8.0.2
       
       - [#616](https://github.com/kpdecker/jsdiff/pull/616) **Restored compatibility of `diffSentences` with old Safari versions.** This was broken in 8.0.0 by the introduction of a regex with a [lookbehind assertion](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion); these weren't supported in Safari prior to version 16.4.
      @@ -28,7 +35,7 @@
       
         * **`diff/lib/index.es6.js` and `diff/lib/index.mjs` no longer exist, and the ESM version of the library is no longer bundled into a single file.**
       
      -  * **The `ignoreWhitespace` option for `diffWords` is no longer included in the type declarations**. The effect of passing `ignoreWhitespace: true` has always been to make `diffWords` just call `diffWordsWithSpace` instead, which was confusing, because that behaviour doesn't seem properly described as "ignoring" whitespace at all. The property remains available to non-TypeScript applications for the sake of backwards compatability, but TypeScript applications will now see a type error if they try to pass `ignoreWhitespace: true` to `diffWords` and should change their code to call `diffWordsWithSpace` instead.
      +  * **The `ignoreWhitespace` option for `diffWords` is no longer included in the type declarations**. The effect of passing `ignoreWhitespace: true` has always been to make `diffWords` just call `diffWordsWithSpace` instead, which was confusing, because that behaviour doesn't seem properly described as "ignoring" whitespace at all. The property remains available to non-TypeScript applications for the sake of backwards compatibility, but TypeScript applications will now see a type error if they try to pass `ignoreWhitespace: true` to `diffWords` and should change their code to call `diffWordsWithSpace` instead.
       
         * JsDiff no longer purports to support ES3 environments. (I'm pretty sure it never truly did, despite claiming to in its README, since even the 1.0.0 release used `Array.map` which was added in ES5.)
       - [#601](https://github.com/kpdecker/jsdiff/pull/601) - **`diffJson`'s `stringifyReplacer` option behaves more like `JSON.stringify`'s `replacer` argument now.** In particular:
      @@ -67,7 +74,7 @@ This is a release containing many, *many* breaking changes. The objective of thi
       - [#480](https://github.com/kpdecker/jsdiff/pull/480) **Passing `maxEditLength` to `createPatch` & `createTwoFilesPatch` now works properly** (i.e. returns undefined if the max edit distance is exceeded; previous behavior was to crash with a `TypeError` if the edit distance was exceeded).
       - [#486](https://github.com/kpdecker/jsdiff/pull/486) **The `ignoreWhitespace` option of `diffLines` behaves more sensibly now.** `value`s in returned change objects now include leading/trailing whitespace even when `ignoreWhitespace` is used, just like how with `ignoreCase` the `value`s still reflect the case of one of the original texts instead of being all-lowercase. `ignoreWhitespace` is also now compatible with `newlineIsToken`. Finally, **`diffTrimmedLines` is deprecated** (and removed from the docs) in favour of using `diffLines` with `ignoreWhitespace: true`; the two are, and always have been, equivalent.
       - [#490](https://github.com/kpdecker/jsdiff/pull/490) **When calling diffing functions in async mode by passing a `callback` option, the diff result will now be passed as the *first* argument to the callback instead of the second.** (Previously, the first argument was never used at all and would always have value `undefined`.)
      -- [#489](github.com/kpdecker/jsdiff/pull/489) **`this.options` no longer exists on `Diff` objects.** Instead, `options` is now passed as an argument to methods that rely on options, like `equals(left, right, options)`. This fixes a race condition in async mode, where diffing behaviour could be changed mid-execution if a concurrent usage of the same `Diff` instances overwrote its `options`.
      +- [#489](https://github.com/kpdecker/jsdiff/pull/489) **`this.options` no longer exists on `Diff` objects.** Instead, `options` is now passed as an argument to methods that rely on options, like `equals(left, right, options)`. This fixes a race condition in async mode, where diffing behaviour could be changed mid-execution if a concurrent usage of the same `Diff` instances overwrote its `options`.
       - [#518](https://github.com/kpdecker/jsdiff/pull/518) **`linedelimiters` no longer exists** on patch objects; instead, when a patch with Windows-style CRLF line endings is parsed, **the lines in `lines` will end with `\r`**. There is now a **new `autoConvertLineEndings` option, on by default**, which makes it so that when a patch with Windows-style line endings is applied to a source file with Unix style line endings, the patch gets autoconverted to use Unix-style line endings, and when a patch with Unix-style line endings is applied to a source file with Windows-style line endings, it gets autoconverted to use Windows-style line endings.
       - [#521](https://github.com/kpdecker/jsdiff/pull/521) **the `callback` option is now supported by `structuredPatch`, `createPatch`, and `createTwoFilesPatch`**
       - [#529](https://github.com/kpdecker/jsdiff/pull/529) **`parsePatch` can now parse patches where lines starting with `--` or `++` are deleted/inserted**; previously, there were edge cases where the parser would choke on valid patches or give wrong results.
      diff --git a/deps/npm/node_modules/ip-address/dist/ipv4.js b/deps/npm/node_modules/ip-address/dist/ipv4.js
      index f1b60064c5fd5a..311c89c6965cb8 100644
      --- a/deps/npm/node_modules/ip-address/dist/ipv4.js
      +++ b/deps/npm/node_modules/ip-address/dist/ipv4.js
      @@ -252,6 +252,39 @@ class Address4 {
           static fromBigInt(bigInt) {
               return Address4.fromHex(bigInt.toString(16));
           }
      +    /**
      +     * Convert a byte array to an Address4 object
      +     * @memberof Address4
      +     * @static
      +     * @param {Array} bytes - an array of 4 bytes (0-255)
      +     * @returns {Address4}
      +     */
      +    static fromByteArray(bytes) {
      +        if (bytes.length !== 4) {
      +            throw new address_error_1.AddressError('IPv4 addresses require exactly 4 bytes');
      +        }
      +        // Validate that all bytes are within valid range (0-255)
      +        for (let i = 0; i < bytes.length; i++) {
      +            if (!Number.isInteger(bytes[i]) || bytes[i] < 0 || bytes[i] > 255) {
      +                throw new address_error_1.AddressError('All bytes must be integers between 0 and 255');
      +            }
      +        }
      +        return this.fromUnsignedByteArray(bytes);
      +    }
      +    /**
      +     * Convert an unsigned byte array to an Address4 object
      +     * @memberof Address4
      +     * @static
      +     * @param {Array} bytes - an array of 4 unsigned bytes (0-255)
      +     * @returns {Address4}
      +     */
      +    static fromUnsignedByteArray(bytes) {
      +        if (bytes.length !== 4) {
      +            throw new address_error_1.AddressError('IPv4 addresses require exactly 4 bytes');
      +        }
      +        const address = bytes.join('.');
      +        return new Address4(address);
      +    }
           /**
            * Returns the first n bits of the address, defaulting to the
            * subnet mask
      diff --git a/deps/npm/node_modules/ip-address/package.json b/deps/npm/node_modules/ip-address/package.json
      index 87795e06433cb6..5cf811e8c563af 100644
      --- a/deps/npm/node_modules/ip-address/package.json
      +++ b/deps/npm/node_modules/ip-address/package.json
      @@ -7,7 +7,7 @@
           "browser",
           "validation"
         ],
      -  "version": "10.0.1",
      +  "version": "10.1.0",
         "author": "Beau Gunderson  (https://beaugunderson.com/)",
         "license": "MIT",
         "main": "dist/ip-address.js",
      diff --git a/deps/npm/node_modules/libnpmdiff/package.json b/deps/npm/node_modules/libnpmdiff/package.json
      index 7fef730160bc07..288bc4b17677f4 100644
      --- a/deps/npm/node_modules/libnpmdiff/package.json
      +++ b/deps/npm/node_modules/libnpmdiff/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "libnpmdiff",
      -  "version": "8.0.12",
      +  "version": "8.0.13",
         "description": "The registry diff",
         "repository": {
           "type": "git",
      @@ -47,7 +47,7 @@
           "tap": "^16.3.8"
         },
         "dependencies": {
      -    "@npmcli/arborist": "^9.1.9",
      +    "@npmcli/arborist": "^9.1.10",
           "@npmcli/installed-package-contents": "^4.0.0",
           "binary-extensions": "^3.0.0",
           "diff": "^8.0.2",
      diff --git a/deps/npm/node_modules/libnpmexec/package.json b/deps/npm/node_modules/libnpmexec/package.json
      index 95a5ce8c68676d..b1712b94f792e2 100644
      --- a/deps/npm/node_modules/libnpmexec/package.json
      +++ b/deps/npm/node_modules/libnpmexec/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "libnpmexec",
      -  "version": "10.1.11",
      +  "version": "10.1.12",
         "files": [
           "bin/",
           "lib/"
      @@ -60,7 +60,7 @@
           "tap": "^16.3.8"
         },
         "dependencies": {
      -    "@npmcli/arborist": "^9.1.9",
      +    "@npmcli/arborist": "^9.1.10",
           "@npmcli/package-json": "^7.0.0",
           "@npmcli/run-script": "^10.0.0",
           "ci-info": "^4.0.0",
      diff --git a/deps/npm/node_modules/libnpmfund/package.json b/deps/npm/node_modules/libnpmfund/package.json
      index 7163345a9cbd83..015f9903f0cded 100644
      --- a/deps/npm/node_modules/libnpmfund/package.json
      +++ b/deps/npm/node_modules/libnpmfund/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "libnpmfund",
      -  "version": "7.0.12",
      +  "version": "7.0.13",
         "main": "lib/index.js",
         "files": [
           "bin/",
      @@ -46,7 +46,7 @@
           "tap": "^16.3.8"
         },
         "dependencies": {
      -    "@npmcli/arborist": "^9.1.9"
      +    "@npmcli/arborist": "^9.1.10"
         },
         "engines": {
           "node": "^20.17.0 || >=22.9.0"
      diff --git a/deps/npm/node_modules/libnpmpack/package.json b/deps/npm/node_modules/libnpmpack/package.json
      index 98107c092446e0..efdb31f0e43a36 100644
      --- a/deps/npm/node_modules/libnpmpack/package.json
      +++ b/deps/npm/node_modules/libnpmpack/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "libnpmpack",
      -  "version": "9.0.12",
      +  "version": "9.0.13",
         "description": "Programmatic API for the bits behind npm pack",
         "author": "GitHub Inc.",
         "main": "lib/index.js",
      @@ -37,7 +37,7 @@
         "bugs": "https://github.com/npm/libnpmpack/issues",
         "homepage": "https://npmjs.com/package/libnpmpack",
         "dependencies": {
      -    "@npmcli/arborist": "^9.1.9",
      +    "@npmcli/arborist": "^9.1.10",
           "@npmcli/run-script": "^10.0.0",
           "npm-package-arg": "^13.0.0",
           "pacote": "^21.0.2"
      diff --git a/deps/npm/node_modules/lru-cache/LICENSE b/deps/npm/node_modules/lru-cache/LICENSE
      deleted file mode 100644
      index f785757cd63f86..00000000000000
      --- a/deps/npm/node_modules/lru-cache/LICENSE
      +++ /dev/null
      @@ -1,15 +0,0 @@
      -The ISC License
      -
      -Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors
      -
      -Permission to use, copy, modify, and/or distribute this software for any
      -purpose with or without fee is hereby granted, provided that the above
      -copyright notice and this permission notice appear in all copies.
      -
      -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
      -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      diff --git a/deps/npm/node_modules/lru-cache/LICENSE.md b/deps/npm/node_modules/lru-cache/LICENSE.md
      new file mode 100644
      index 00000000000000..c5402b9577a8cd
      --- /dev/null
      +++ b/deps/npm/node_modules/lru-cache/LICENSE.md
      @@ -0,0 +1,55 @@
      +# Blue Oak Model License
      +
      +Version 1.0.0
      +
      +## Purpose
      +
      +This license gives everyone as much permission to work with
      +this software as possible, while protecting contributors
      +from liability.
      +
      +## Acceptance
      +
      +In order to receive this license, you must agree to its
      +rules.  The rules of this license are both obligations
      +under that agreement and conditions to your license.
      +You must not do anything with this software that triggers
      +a rule that you cannot or will not follow.
      +
      +## Copyright
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe that contributor's
      +copyright in it.
      +
      +## Notices
      +
      +You must ensure that everyone who gets a copy of
      +any part of this software from you, with or without
      +changes, also gets the text of this license or a link to
      +.
      +
      +## Excuse
      +
      +If anyone notifies you in writing that you have not
      +complied with [Notices](#notices), you can keep your
      +license by taking all practical steps to comply within 30
      +days after the notice.  If you do not do so, your license
      +ends immediately.
      +
      +## Patent
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe any patent claims
      +they can license or become able to license.
      +
      +## Reliability
      +
      +No contributor can revoke this license.
      +
      +## No Liability
      +
      +***As far as the law allows, this software comes as is,
      +without any warranty or condition, and no contributor
      +will be liable to anyone for any damages related to this
      +software or this license, under any kind of legal claim.***
      diff --git a/deps/npm/node_modules/lru-cache/dist/commonjs/index.js b/deps/npm/node_modules/lru-cache/dist/commonjs/index.js
      index 71e5f56c375459..76923a8337c7df 100644
      --- a/deps/npm/node_modules/lru-cache/dist/commonjs/index.js
      +++ b/deps/npm/node_modules/lru-cache/dist/commonjs/index.js
      @@ -230,6 +230,7 @@ class LRUCache {
           #sizes;
           #starts;
           #ttls;
      +    #autopurgeTimers;
           #hasDispose;
           #hasFetchMethod;
           #hasDisposeAfter;
      @@ -248,6 +249,7 @@ class LRUCache {
                   // properties
                   starts: c.#starts,
                   ttls: c.#ttls,
      +            autopurgeTimers: c.#autopurgeTimers,
                   sizes: c.#sizes,
                   keyMap: c.#keyMap,
                   keyList: c.#keyList,
      @@ -349,13 +351,11 @@ class LRUCache {
                       throw new TypeError('sizeCalculation set to non-function');
                   }
               }
      -        if (memoMethod !== undefined &&
      -            typeof memoMethod !== 'function') {
      +        if (memoMethod !== undefined && typeof memoMethod !== 'function') {
                   throw new TypeError('memoMethod must be a function if defined');
               }
               this.#memoMethod = memoMethod;
      -        if (fetchMethod !== undefined &&
      -            typeof fetchMethod !== 'function') {
      +        if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {
                   throw new TypeError('fetchMethod must be a function if specified');
               }
               this.#fetchMethod = fetchMethod;
      @@ -410,9 +410,7 @@ class LRUCache {
               this.updateAgeOnGet = !!updateAgeOnGet;
               this.updateAgeOnHas = !!updateAgeOnHas;
               this.ttlResolution =
      -            isPosInt(ttlResolution) || ttlResolution === 0 ?
      -                ttlResolution
      -                : 1;
      +            isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1;
               this.ttlAutopurge = !!ttlAutopurge;
               this.ttl = ttl || 0;
               if (this.ttl) {
      @@ -447,10 +445,21 @@ class LRUCache {
               const starts = new ZeroArray(this.#max);
               this.#ttls = ttls;
               this.#starts = starts;
      +        const purgeTimers = this.ttlAutopurge ?
      +            new Array(this.#max)
      +            : undefined;
      +        this.#autopurgeTimers = purgeTimers;
               this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {
                   starts[index] = ttl !== 0 ? start : 0;
                   ttls[index] = ttl;
      -            if (ttl !== 0 && this.ttlAutopurge) {
      +            // clear out the purge timer if we're setting TTL to 0, and
      +            // previously had a ttl purge timer running, so it doesn't
      +            // fire unnecessarily.
      +            if (purgeTimers?.[index]) {
      +                clearTimeout(purgeTimers[index]);
      +                purgeTimers[index] = undefined;
      +            }
      +            if (ttl !== 0 && purgeTimers) {
                       const t = setTimeout(() => {
                           if (this.#isStale(index)) {
                               this.#delete(this.#keyList[index], 'expire');
      @@ -462,6 +471,7 @@ class LRUCache {
                           t.unref();
                       }
                       /* c8 ignore stop */
      +                purgeTimers[index] = t;
                   }
               };
               this.#updateItemAge = index => {
      @@ -653,8 +663,7 @@ class LRUCache {
           *keys() {
               for (const i of this.#indexes()) {
                   const k = this.#keyList[i];
      -            if (k !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield k;
                   }
               }
      @@ -668,8 +677,7 @@ class LRUCache {
           *rkeys() {
               for (const i of this.#rindexes()) {
                   const k = this.#keyList[i];
      -            if (k !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield k;
                   }
               }
      @@ -681,8 +689,7 @@ class LRUCache {
           *values() {
               for (const i of this.#indexes()) {
                   const v = this.#valList[i];
      -            if (v !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield this.#valList[i];
                   }
               }
      @@ -696,8 +703,7 @@ class LRUCache {
           *rvalues() {
               for (const i of this.#rindexes()) {
                   const v = this.#valList[i];
      -            if (v !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield this.#valList[i];
                   }
               }
      @@ -1055,6 +1061,10 @@ class LRUCache {
                   }
               }
               this.#removeItemSize(head);
      +        if (this.#autopurgeTimers?.[head]) {
      +            clearTimeout(this.#autopurgeTimers[head]);
      +            this.#autopurgeTimers[head] = undefined;
      +        }
               // if we aren't about to use the index, then null these out
               if (free) {
                   this.#keyList[head] = undefined;
      @@ -1127,8 +1137,7 @@ class LRUCache {
           peek(k, peekOptions = {}) {
               const { allowStale = this.allowStale } = peekOptions;
               const index = this.#keyMap.get(k);
      -        if (index === undefined ||
      -            (!allowStale && this.#isStale(index))) {
      +        if (index === undefined || (!allowStale && this.#isStale(index))) {
                   return;
               }
               const v = this.#valList[index];
      @@ -1174,7 +1183,7 @@ class LRUCache {
                   // cache and ignore the abort, or if it's still pending on this specific
                   // background request, then write it to the cache.
                   const vl = this.#valList[index];
      -            if (vl === p || ignoreAbort && updateCache && vl === undefined) {
      +            if (vl === p || (ignoreAbort && updateCache && vl === undefined)) {
                       if (v === undefined) {
                           if (bf.__staleWhileFetching !== undefined) {
                               this.#valList[index] = bf.__staleWhileFetching;
      @@ -1238,8 +1247,7 @@ class LRUCache {
                   // defer check until we are actually aborting,
                   // so fetchMethod can override.
                   ac.signal.addEventListener('abort', () => {
      -                if (!options.ignoreFetchAbort ||
      -                    options.allowStaleOnFetchAbort) {
      +                if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {
                           res(undefined);
                           // when it eventually resolves, update the cache.
                           if (options.allowStaleOnFetchAbort) {
      @@ -1471,6 +1479,10 @@ class LRUCache {
               if (this.#size !== 0) {
                   const index = this.#keyMap.get(k);
                   if (index !== undefined) {
      +                if (this.#autopurgeTimers?.[index]) {
      +                    clearTimeout(this.#autopurgeTimers?.[index]);
      +                    this.#autopurgeTimers[index] = undefined;
      +                }
                       deleted = true;
                       if (this.#size === 1) {
                           this.#clear(reason);
      @@ -1546,6 +1558,11 @@ class LRUCache {
               if (this.#ttls && this.#starts) {
                   this.#ttls.fill(0);
                   this.#starts.fill(0);
      +            for (const t of this.#autopurgeTimers ?? []) {
      +                if (t !== undefined)
      +                    clearTimeout(t);
      +            }
      +            this.#autopurgeTimers?.fill(undefined);
               }
               if (this.#sizes) {
                   this.#sizes.fill(0);
      diff --git a/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js b/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js
      index be835d75ffb542..b82c2ef780beaa 100644
      --- a/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js
      +++ b/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js
      @@ -1,2 +1,2 @@
      -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,x=new Set,R=typeof process=="object"&&process?process:{},U=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,L=globalThis.AbortSignal;if(typeof C>"u"){L=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new L;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,U("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!x.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),I=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?E:null:null,E=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#l=!1;static create(t){let e=I(t);if(!e)return[];a.#l=!0;let i=new a(t,e);return a.#l=!1,i}constructor(t,e){if(!a.#l)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},D=class a{#l;#c;#p;#z;#w;#D;#L;#S;get perf(){return this.#S}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#o;#h;#m;#r;#b;#y;#d;#A;#v;#f;#x;static unsafeExposeInternals(t){return{starts:t.#y,ttls:t.#d,sizes:t.#b,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#o},get tail(){return t.#h},free:t.#m,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#M(e,i,s,n),moveToTail:e=>t.#W(e),indexes:e=>t.#F(e),rindexes:e=>t.#T(e),isStale:e=>t.#g(e)}}get max(){return this.#l}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#D}get memoMethod(){return this.#L}get dispose(){return this.#p}get onInsert(){return this.#z}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:p,onInsert:m,disposeAfter:f,noDisposeOnSet:u,noUpdateTTL:d,maxSize:A=0,maxEntrySize:g=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:c,allowStaleOnFetchRejection:S,allowStaleOnFetchAbort:v,ignoreFetchAbort:F,perf:z}=t;if(z!==void 0&&typeof z?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#S=z??M,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let T=e?I(e):Array;if(!T)throw new Error("invalid max value: "+e);if(this.#l=e,this.#c=A,this.maxEntrySize=g||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#L=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#D=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new T(e),this.#u=new T(e),this.#o=0,this.#h=0,this.#m=W.create(e),this.#n=0,this.#_=0,typeof p=="function"&&(this.#p=p),typeof m=="function"&&(this.#z=m),typeof f=="function"?(this.#w=f,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#A=!!this.#p,this.#x=!!this.#z,this.#f=!!this.#w,this.noDisposeOnSet=!!u,this.noUpdateTTL=!!d,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!S,this.allowStaleOnFetchAbort=!!v,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#V()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!c,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#G()}if(this.#l===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#l&&!this.#c){let O="LRU_CACHE_UNBOUNDED";G(O)&&(x.add(O),U("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",O,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#G(){let t=new E(this.#l),e=new E(this.#l);this.#d=t,this.#y=e,this.#j=(n,h,o=this.#S.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#g(n)&&this.#O(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#C=n=>{e[n]=t[n]!==0?this.#S.now():0},this.#E=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let p=n.now-r;n.remainingTTL=o-p}};let i=0,s=()=>{let n=this.#S.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let p=(i||s())-r;return o-p},this.#g=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#C=()=>{};#E=()=>{};#j=()=>{};#g=()=>!1;#V(){let t=new E(this.#l);this.#_=0,this.#b=t,this.#R=e=>{this.#_-=t[e],t[e]=0},this.#N=(e,i,s,n)=>{if(this.#e(i))return 0;if(!y(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#U=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#_>n;)this.#I(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#R=t=>{};#U=(t,e,i)=>{};#N=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#P(e)||((t||!this.#g(e))&&(yield e),e===this.#o));)e=this.#u[e]}*#T({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#P(e)||((t||!this.#g(e))&&(yield e),e===this.#h));)e=this.#a[e]}#P(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#T())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#T()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#T())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#T()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#T({allowStale:!0}))this.#g(e)&&(this.#O(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#y){let h=this.#d[e],o=this.#y[e];if(h&&o){let r=h-(this.#S.now()-o);n.ttl=r,n.start=Date.now()}}return this.#b&&(n.size=this.#b[e]),n}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#d&&this.#y){h.ttl=this.#d[e];let o=this.#S.now()-this.#y[e];h.start=Math.floor(Date.now()-o)}this.#b&&(h.size=this.#b[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#S.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:p=this.noUpdateTTL}=i,m=this.#N(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#O(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#m.length!==0?this.#m.pop():this.#n===this.#l?this.#I(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#a[this.#h]=f,this.#u[f]=this.#h,this.#h=f,this.#n++,this.#U(f,m,r),r&&(r.set="add"),p=!1,this.#x&&this.#z?.(e,t,"add");else{this.#W(f);let u=this.#t[f];if(e!==u){if(this.#v&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:d}=u;d!==void 0&&!h&&(this.#A&&this.#p?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]))}else h||(this.#A&&this.#p?.(u,t,"set"),this.#f&&this.#r?.push([u,t,"set"]));if(this.#R(f),this.#U(f,m,r),this.#t[f]=e,r){r.set="replace";let d=u&&this.#e(u)?u.__staleWhileFetching:u;d!==void 0&&(r.oldValue=d)}}else r&&(r.set="update");this.#x&&this.onInsert?.(e,t,e===u?"update":"replace")}if(s!==0&&!this.#d&&this.#G(),this.#d&&(p||this.#j(f,s,n),r&&this.#E(r,f)),!h&&this.#f&&this.#r){let u=this.#r,d;for(;d=u?.shift();)this.#w?.(...d)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#I(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#I(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#A||this.#f)&&(this.#A&&this.#p?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#R(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#m.push(e)),this.#n===1?(this.#o=this.#h=0,this.#m.length=0):this.#o=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#g(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#C(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#g(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#M(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new C,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},p=(g,_=!1)=>{let{aborted:l}=h.signal,w=i.ignoreFetchAbort&&g!==void 0;if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return f(h.signal.reason);let b=d,c=this.#t[e];return(c===d||w&&_&&c===void 0)&&(g===void 0?b.__staleWhileFetching!==void 0?this.#t[e]=b.__staleWhileFetching:this.#O(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,g,r.options))),g},m=g=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=g),f(g)),f=g=>{let{aborted:_}=h.signal,l=_&&i.allowStaleOnFetchAbort,w=l||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,c=d;if(this.#t[e]===d&&(!b||c.__staleWhileFetching===void 0?this.#O(t,"fetch"):l||(this.#t[e]=c.__staleWhileFetching)),w)return i.status&&c.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),c.__staleWhileFetching;if(c.__returned===c)throw g},u=(g,_)=>{let l=this.#D?.(t,n,r);l&&l instanceof Promise&&l.then(w=>g(w===void 0?void 0:w),_),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(g(void 0),i.allowStaleOnFetchAbort&&(g=w=>p(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let d=new Promise(u).then(p,m),A=Object.assign(d,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:p=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:d=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:g,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:p,noUpdateTTL:m,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:A,ignoreFetchAbort:d,status:l,signal:w},c=this.#s.get(t);if(c===void 0){l&&(l.fetch="miss");let S=this.#M(t,c,b,g);return S.__returned=S}else{let S=this.#t[c];if(this.#e(S)){let O=i&&S.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",O&&(l.returnedStale=!0)),O?S.__staleWhileFetching:S.__returned=S}let v=this.#g(c);if(!_&&!v)return l&&(l.fetch="hit"),this.#W(c),s&&this.#C(c),l&&this.#E(l,c),S;let F=this.#M(t,c,b,g),T=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=v?"stale":"refresh",T&&v&&(l.returnedStale=!0)),T?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#L;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],p=this.#e(r);return h&&this.#E(h,o),this.#g(o)?(h&&(h.get="stale"),p?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#O(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),p?r.__staleWhileFetching:(this.#W(o),s&&this.#C(o),r))}else h&&(h.get="miss")}#H(t,e){this.#u[e]=t,this.#a[t]=e}#W(t){t!==this.#h&&(t===this.#o?this.#o=this.#a[t]:this.#H(this.#u[t],this.#a[t]),this.#H(this.#h,t),this.#h=t)}delete(t){return this.#O(t,"delete")}#O(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#k(e);else{this.#R(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#A||this.#f)&&(this.#A&&this.#p?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#o)this.#o=this.#a[s];else{let h=this.#u[s];this.#a[h]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#m.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#k("delete")}#k(t){for(let e of this.#T({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#A&&this.#p?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#y&&(this.#d.fill(0),this.#y.fill(0)),this.#b&&this.#b.fill(0),this.#o=0,this.#h=0,this.#m.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};exports.LRUCache=D;
      +"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var x=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,U=new Set,R=typeof process=="object"&&process?process:{},I=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,L=globalThis.AbortSignal;if(typeof C>"u"){L=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new L;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,I("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!U.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),M=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?E:null:null,E=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#o=!1;static create(t){let e=M(t);if(!e)return[];a.#o=!0;let i=new a(t,e);return a.#o=!1,i}constructor(t,e){if(!a.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},D=class a{#o;#c;#w;#C;#S;#L;#U;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#z;#f;#I;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,h)=>t.#G(e,i,s,h),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#O(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#U}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:h,updateAgeOnGet:n,updateAgeOnHas:o,allowStale:r,dispose:f,onInsert:S,disposeAfter:c,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:u,allowStaleOnFetchRejection:m,allowStaleOnFetchAbort:v,ignoreFetchAbort:T,perf:z}=t;if(z!==void 0&&typeof z?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=z??x,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let F=e?M(e):Array;if(!F)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#U=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#z=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new F(e),this.#u=new F(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof f=="function"&&(this.#w=f),typeof S=="function"&&(this.#C=S),typeof c=="function"?(this.#S=c,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#I=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!m,this.allowStaleOnFetchAbort=!!v,this.ignoreFetchAbort=!!T,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!u,this.updateAgeOnGet=!!n,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!h,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let O="LRU_CACHE_UNBOUNDED";G(O)&&(U.add(O),I("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",O,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new E(this.#o),e=new E(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(n,o,r=this.#m.now())=>{if(e[n]=o!==0?r:0,t[n]=o,i?.[n]&&(clearTimeout(i[n]),i[n]=void 0),o!==0&&i){let f=setTimeout(()=>{this.#p(n)&&this.#E(this.#i[n],"expire")},o+1);f.unref&&f.unref(),i[n]=f}},this.#R=n=>{e[n]=t[n]!==0?this.#m.now():0},this.#v=(n,o)=>{if(t[o]){let r=t[o],f=e[o];if(!r||!f)return;n.ttl=r,n.start=f,n.now=s||h();let S=n.now-f;n.remainingTTL=r-S}};let s=0,h=()=>{let n=this.#m.now();if(this.ttlResolution>0){s=n;let o=setTimeout(()=>s=0,this.ttlResolution);o.unref&&o.unref()}return n};this.getRemainingTTL=n=>{let o=this.#s.get(n);if(o===void 0)return 0;let r=t[o],f=e[o];if(!r||!f)return 1/0;let S=(s||h())-f;return r-S},this.#p=n=>{let o=e[n],r=t[n];return!!r&&!!o&&(s||h())-o>r}}#R=()=>{};#v=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new E(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,h)=>{if(this.#e(i))return 0;if(!y(s))if(h){if(typeof h!="function")throw new TypeError("sizeCalculation must be a function");if(s=h(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#M=(e,i,s)=>{if(t[e]=i,this.#c){let h=this.#c-t[e];for(;this.#_>h;)this.#x(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#M=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#O({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#O())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#O()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#O())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;if(h!==void 0&&t(h,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#O()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#O({allowStale:!0}))this.#p(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let h={value:s};if(this.#d&&this.#A){let n=this.#d[e],o=this.#A[e];if(n&&o){let r=n-(this.#m.now()-o);h.ttl=r,h.start=Date.now()}}return this.#y&&(h.size=this.#y[e]),h}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],h=this.#e(s)?s.__staleWhileFetching:s;if(h===void 0||i===void 0)continue;let n={value:h};if(this.#d&&this.#A){n.ttl=this.#d[e];let o=this.#m.now()-this.#A[e];n.start=Math.floor(Date.now()-o)}this.#y&&(n.size=this.#y[e]),t.unshift([i,n])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:h,noDisposeOnSet:n=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:f=this.noUpdateTTL}=i,S=this.#P(t,e,i.size||0,o);if(this.maxEntrySize&&S>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let c=this.#n===0?void 0:this.#s.get(t);if(c===void 0)c=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#x(!1):this.#n,this.#i[c]=t,this.#t[c]=e,this.#s.set(t,c),this.#a[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#M(c,S,r),r&&(r.set="add"),f=!1,this.#I&&this.#C?.(e,t,"add");else{this.#D(c);let d=this.#t[c];if(e!==d){if(this.#z&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!n&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else n||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(c),this.#M(c,S,r),this.#t[c]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#I&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(f||this.#N(c,s,h),r&&this.#v(r,c)),!n&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#x(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#x(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#z&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,h=this.#s.get(t);if(h!==void 0){let n=this.#t[h];if(this.#e(n)&&n.__staleWhileFetching===void 0)return!1;if(this.#p(h))s&&(s.has="stale",this.#v(s,h));else return i&&this.#R(h),s&&(s.has="hit",this.#v(s,h)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let h=this.#t[s];return this.#e(h)?h.__staleWhileFetching:h}#G(t,e,i,s){let h=e===void 0?void 0:this.#t[e];if(this.#e(h))return h;let n=new C,{signal:o}=i;o?.addEventListener("abort",()=>n.abort(o.reason),{signal:n.signal});let r={signal:n.signal,options:i,context:s},f=(p,_=!1)=>{let{aborted:l}=n.signal,w=i.ignoreFetchAbort&&p!==void 0;if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=n.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return c(n.signal.reason);let b=g,u=this.#t[e];return(u===g||w&&_&&u===void 0)&&(p===void 0?b.__staleWhileFetching!==void 0?this.#t[e]=b.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},S=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),c(p)),c=p=>{let{aborted:_}=n.signal,l=_&&i.allowStaleOnFetchAbort,w=l||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!b||u.__staleWhileFetching===void 0?this.#E(t,"fetch"):l||(this.#t[e]=u.__staleWhileFetching)),w)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,h,r);l&&l instanceof Promise&&l.then(w=>p(w===void 0?void 0:w),_),n.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=w=>f(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(f,S),A=Object.assign(g,{__abortController:n,__staleWhileFetching:h,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#z)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,ttl:n=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:f=this.sizeCalculation,noUpdateTTL:S=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#z)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,ttl:n,noDisposeOnSet:o,size:r,sizeCalculation:f,noUpdateTTL:S,noDeleteOnFetchRejection:c,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:w},u=this.#s.get(t);if(u===void 0){l&&(l.fetch="miss");let m=this.#G(t,u,b,p);return m.__returned=m}else{let m=this.#t[u];if(this.#e(m)){let O=i&&m.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",O&&(l.returnedStale=!0)),O?m.__staleWhileFetching:m.__returned=m}let v=this.#p(u);if(!_&&!v)return l&&(l.fetch="hit"),this.#D(u),s&&this.#R(u),l&&this.#v(l,u),m;let T=this.#G(t,u,b,p),F=T.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=v?"stale":"refresh",F&&v&&(l.returnedStale=!0)),F?T.__staleWhileFetching:T.__returned=T}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#U;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:h,...n}=e,o=this.get(t,n);if(!h&&o!==void 0)return o;let r=i(t,o,{options:n,context:s});return this.set(t,r,n),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,status:n}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],f=this.#e(r);return n&&this.#v(n,o),this.#p(o)?(n&&(n.get="stale"),f?(n&&i&&r.__staleWhileFetching!==void 0&&(n.returnedStale=!0),i?r.__staleWhileFetching:void 0):(h||this.#E(t,"expire"),n&&i&&(n.returnedStale=!0),i?r:void 0)):(n&&(n.get="hit"),f?r.__staleWhileFetching:(this.#D(o),s&&this.#R(o),r))}else n&&(n.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let h=this.#t[s];if(this.#e(h)?h.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(h,t,e),this.#f&&this.#r?.push([h,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let n=this.#u[s];this.#a[n]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,h;for(;h=s?.shift();)this.#S?.(...h)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#O({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=D;
       //# sourceMappingURL=index.min.js.map
      diff --git a/deps/npm/node_modules/lru-cache/dist/esm/index.js b/deps/npm/node_modules/lru-cache/dist/esm/index.js
      index a9182b36d78e2b..ef179ea2d8035a 100644
      --- a/deps/npm/node_modules/lru-cache/dist/esm/index.js
      +++ b/deps/npm/node_modules/lru-cache/dist/esm/index.js
      @@ -227,6 +227,7 @@ export class LRUCache {
           #sizes;
           #starts;
           #ttls;
      +    #autopurgeTimers;
           #hasDispose;
           #hasFetchMethod;
           #hasDisposeAfter;
      @@ -245,6 +246,7 @@ export class LRUCache {
                   // properties
                   starts: c.#starts,
                   ttls: c.#ttls,
      +            autopurgeTimers: c.#autopurgeTimers,
                   sizes: c.#sizes,
                   keyMap: c.#keyMap,
                   keyList: c.#keyList,
      @@ -346,13 +348,11 @@ export class LRUCache {
                       throw new TypeError('sizeCalculation set to non-function');
                   }
               }
      -        if (memoMethod !== undefined &&
      -            typeof memoMethod !== 'function') {
      +        if (memoMethod !== undefined && typeof memoMethod !== 'function') {
                   throw new TypeError('memoMethod must be a function if defined');
               }
               this.#memoMethod = memoMethod;
      -        if (fetchMethod !== undefined &&
      -            typeof fetchMethod !== 'function') {
      +        if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {
                   throw new TypeError('fetchMethod must be a function if specified');
               }
               this.#fetchMethod = fetchMethod;
      @@ -407,9 +407,7 @@ export class LRUCache {
               this.updateAgeOnGet = !!updateAgeOnGet;
               this.updateAgeOnHas = !!updateAgeOnHas;
               this.ttlResolution =
      -            isPosInt(ttlResolution) || ttlResolution === 0 ?
      -                ttlResolution
      -                : 1;
      +            isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1;
               this.ttlAutopurge = !!ttlAutopurge;
               this.ttl = ttl || 0;
               if (this.ttl) {
      @@ -444,10 +442,21 @@ export class LRUCache {
               const starts = new ZeroArray(this.#max);
               this.#ttls = ttls;
               this.#starts = starts;
      +        const purgeTimers = this.ttlAutopurge ?
      +            new Array(this.#max)
      +            : undefined;
      +        this.#autopurgeTimers = purgeTimers;
               this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {
                   starts[index] = ttl !== 0 ? start : 0;
                   ttls[index] = ttl;
      -            if (ttl !== 0 && this.ttlAutopurge) {
      +            // clear out the purge timer if we're setting TTL to 0, and
      +            // previously had a ttl purge timer running, so it doesn't
      +            // fire unnecessarily.
      +            if (purgeTimers?.[index]) {
      +                clearTimeout(purgeTimers[index]);
      +                purgeTimers[index] = undefined;
      +            }
      +            if (ttl !== 0 && purgeTimers) {
                       const t = setTimeout(() => {
                           if (this.#isStale(index)) {
                               this.#delete(this.#keyList[index], 'expire');
      @@ -459,6 +468,7 @@ export class LRUCache {
                           t.unref();
                       }
                       /* c8 ignore stop */
      +                purgeTimers[index] = t;
                   }
               };
               this.#updateItemAge = index => {
      @@ -650,8 +660,7 @@ export class LRUCache {
           *keys() {
               for (const i of this.#indexes()) {
                   const k = this.#keyList[i];
      -            if (k !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield k;
                   }
               }
      @@ -665,8 +674,7 @@ export class LRUCache {
           *rkeys() {
               for (const i of this.#rindexes()) {
                   const k = this.#keyList[i];
      -            if (k !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield k;
                   }
               }
      @@ -678,8 +686,7 @@ export class LRUCache {
           *values() {
               for (const i of this.#indexes()) {
                   const v = this.#valList[i];
      -            if (v !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield this.#valList[i];
                   }
               }
      @@ -693,8 +700,7 @@ export class LRUCache {
           *rvalues() {
               for (const i of this.#rindexes()) {
                   const v = this.#valList[i];
      -            if (v !== undefined &&
      -                !this.#isBackgroundFetch(this.#valList[i])) {
      +            if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {
                       yield this.#valList[i];
                   }
               }
      @@ -1052,6 +1058,10 @@ export class LRUCache {
                   }
               }
               this.#removeItemSize(head);
      +        if (this.#autopurgeTimers?.[head]) {
      +            clearTimeout(this.#autopurgeTimers[head]);
      +            this.#autopurgeTimers[head] = undefined;
      +        }
               // if we aren't about to use the index, then null these out
               if (free) {
                   this.#keyList[head] = undefined;
      @@ -1124,8 +1134,7 @@ export class LRUCache {
           peek(k, peekOptions = {}) {
               const { allowStale = this.allowStale } = peekOptions;
               const index = this.#keyMap.get(k);
      -        if (index === undefined ||
      -            (!allowStale && this.#isStale(index))) {
      +        if (index === undefined || (!allowStale && this.#isStale(index))) {
                   return;
               }
               const v = this.#valList[index];
      @@ -1171,7 +1180,7 @@ export class LRUCache {
                   // cache and ignore the abort, or if it's still pending on this specific
                   // background request, then write it to the cache.
                   const vl = this.#valList[index];
      -            if (vl === p || ignoreAbort && updateCache && vl === undefined) {
      +            if (vl === p || (ignoreAbort && updateCache && vl === undefined)) {
                       if (v === undefined) {
                           if (bf.__staleWhileFetching !== undefined) {
                               this.#valList[index] = bf.__staleWhileFetching;
      @@ -1235,8 +1244,7 @@ export class LRUCache {
                   // defer check until we are actually aborting,
                   // so fetchMethod can override.
                   ac.signal.addEventListener('abort', () => {
      -                if (!options.ignoreFetchAbort ||
      -                    options.allowStaleOnFetchAbort) {
      +                if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {
                           res(undefined);
                           // when it eventually resolves, update the cache.
                           if (options.allowStaleOnFetchAbort) {
      @@ -1468,6 +1476,10 @@ export class LRUCache {
               if (this.#size !== 0) {
                   const index = this.#keyMap.get(k);
                   if (index !== undefined) {
      +                if (this.#autopurgeTimers?.[index]) {
      +                    clearTimeout(this.#autopurgeTimers?.[index]);
      +                    this.#autopurgeTimers[index] = undefined;
      +                }
                       deleted = true;
                       if (this.#size === 1) {
                           this.#clear(reason);
      @@ -1543,6 +1555,11 @@ export class LRUCache {
               if (this.#ttls && this.#starts) {
                   this.#ttls.fill(0);
                   this.#starts.fill(0);
      +            for (const t of this.#autopurgeTimers ?? []) {
      +                if (t !== undefined)
      +                    clearTimeout(t);
      +            }
      +            this.#autopurgeTimers?.fill(undefined);
               }
               if (this.#sizes) {
                   this.#sizes.fill(0);
      diff --git a/deps/npm/node_modules/lru-cache/dist/esm/index.min.js b/deps/npm/node_modules/lru-cache/dist/esm/index.min.js
      index 8ad29b768ed9ea..5949b5c71b5bd9 100644
      --- a/deps/npm/node_modules/lru-cache/dist/esm/index.min.js
      +++ b/deps/npm/node_modules/lru-cache/dist/esm/index.min.js
      @@ -1,2 +1,2 @@
      -var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,x=new Set,R=typeof process=="object"&&process?process:{},I=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,D=globalThis.AbortSignal;if(typeof C>"u"){D=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new D;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,I("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!x.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),U=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#l=!1;static create(t){let e=U(t);if(!e)return[];a.#l=!0;let i=new a(t,e);return a.#l=!1,i}constructor(t,e){if(!a.#l)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class a{#l;#c;#p;#v;#w;#D;#L;#S;get perf(){return this.#S}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#o;#h;#m;#r;#b;#y;#d;#A;#z;#f;#x;static unsafeExposeInternals(t){return{starts:t.#y,ttls:t.#d,sizes:t.#b,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#o},get tail(){return t.#h},free:t.#m,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#M(e,i,s,n),moveToTail:e=>t.#W(e),indexes:e=>t.#F(e),rindexes:e=>t.#T(e),isStale:e=>t.#g(e)}}get max(){return this.#l}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#D}get memoMethod(){return this.#L}get dispose(){return this.#p}get onInsert(){return this.#v}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:p,onInsert:m,disposeAfter:f,noDisposeOnSet:u,noUpdateTTL:d,maxSize:A=0,maxEntrySize:g=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:c,allowStaleOnFetchRejection:S,allowStaleOnFetchAbort:z,ignoreFetchAbort:F,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#S=v??M,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let T=e?U(e):Array;if(!T)throw new Error("invalid max value: "+e);if(this.#l=e,this.#c=A,this.maxEntrySize=g||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#L=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#D=l,this.#z=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new T(e),this.#u=new T(e),this.#o=0,this.#h=0,this.#m=W.create(e),this.#n=0,this.#_=0,typeof p=="function"&&(this.#p=p),typeof m=="function"&&(this.#v=m),typeof f=="function"?(this.#w=f,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#A=!!this.#p,this.#x=!!this.#v,this.#f=!!this.#w,this.noDisposeOnSet=!!u,this.noUpdateTTL=!!d,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!S,this.allowStaleOnFetchAbort=!!z,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#V()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!c,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#G()}if(this.#l===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#l&&!this.#c){let E="LRU_CACHE_UNBOUNDED";G(E)&&(x.add(E),I("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#G(){let t=new O(this.#l),e=new O(this.#l);this.#d=t,this.#y=e,this.#j=(n,h,o=this.#S.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#g(n)&&this.#E(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#C=n=>{e[n]=t[n]!==0?this.#S.now():0},this.#O=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let p=n.now-r;n.remainingTTL=o-p}};let i=0,s=()=>{let n=this.#S.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let p=(i||s())-r;return o-p},this.#g=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#C=()=>{};#O=()=>{};#j=()=>{};#g=()=>!1;#V(){let t=new O(this.#l);this.#_=0,this.#b=t,this.#R=e=>{this.#_-=t[e],t[e]=0},this.#N=(e,i,s,n)=>{if(this.#e(i))return 0;if(!y(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#I=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#_>n;)this.#U(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#R=t=>{};#I=(t,e,i)=>{};#N=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#P(e)||((t||!this.#g(e))&&(yield e),e===this.#o));)e=this.#u[e]}*#T({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#P(e)||((t||!this.#g(e))&&(yield e),e===this.#h));)e=this.#a[e]}#P(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#T())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#T()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#T())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#T()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#T({allowStale:!0}))this.#g(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#y){let h=this.#d[e],o=this.#y[e];if(h&&o){let r=h-(this.#S.now()-o);n.ttl=r,n.start=Date.now()}}return this.#b&&(n.size=this.#b[e]),n}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#d&&this.#y){h.ttl=this.#d[e];let o=this.#S.now()-this.#y[e];h.start=Math.floor(Date.now()-o)}this.#b&&(h.size=this.#b[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#S.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:p=this.noUpdateTTL}=i,m=this.#N(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#m.length!==0?this.#m.pop():this.#n===this.#l?this.#U(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#a[this.#h]=f,this.#u[f]=this.#h,this.#h=f,this.#n++,this.#I(f,m,r),r&&(r.set="add"),p=!1,this.#x&&this.#v?.(e,t,"add");else{this.#W(f);let u=this.#t[f];if(e!==u){if(this.#z&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:d}=u;d!==void 0&&!h&&(this.#A&&this.#p?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]))}else h||(this.#A&&this.#p?.(u,t,"set"),this.#f&&this.#r?.push([u,t,"set"]));if(this.#R(f),this.#I(f,m,r),this.#t[f]=e,r){r.set="replace";let d=u&&this.#e(u)?u.__staleWhileFetching:u;d!==void 0&&(r.oldValue=d)}}else r&&(r.set="update");this.#x&&this.onInsert?.(e,t,e===u?"update":"replace")}if(s!==0&&!this.#d&&this.#G(),this.#d&&(p||this.#j(f,s,n),r&&this.#O(r,f)),!h&&this.#f&&this.#r){let u=this.#r,d;for(;d=u?.shift();)this.#w?.(...d)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#U(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#U(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#z&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#A||this.#f)&&(this.#A&&this.#p?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#R(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#m.push(e)),this.#n===1?(this.#o=this.#h=0,this.#m.length=0):this.#o=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#g(n))s&&(s.has="stale",this.#O(s,n));else return i&&this.#C(n),s&&(s.has="hit",this.#O(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#g(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#M(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new C,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},p=(g,_=!1)=>{let{aborted:l}=h.signal,w=i.ignoreFetchAbort&&g!==void 0;if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return f(h.signal.reason);let b=d,c=this.#t[e];return(c===d||w&&_&&c===void 0)&&(g===void 0?b.__staleWhileFetching!==void 0?this.#t[e]=b.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,g,r.options))),g},m=g=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=g),f(g)),f=g=>{let{aborted:_}=h.signal,l=_&&i.allowStaleOnFetchAbort,w=l||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,c=d;if(this.#t[e]===d&&(!b||c.__staleWhileFetching===void 0?this.#E(t,"fetch"):l||(this.#t[e]=c.__staleWhileFetching)),w)return i.status&&c.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),c.__staleWhileFetching;if(c.__returned===c)throw g},u=(g,_)=>{let l=this.#D?.(t,n,r);l&&l instanceof Promise&&l.then(w=>g(w===void 0?void 0:w),_),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(g(void 0),i.allowStaleOnFetchAbort&&(g=w=>p(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let d=new Promise(u).then(p,m),A=Object.assign(d,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#z)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:p=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:d=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:g,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#z)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:p,noUpdateTTL:m,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:A,ignoreFetchAbort:d,status:l,signal:w},c=this.#s.get(t);if(c===void 0){l&&(l.fetch="miss");let S=this.#M(t,c,b,g);return S.__returned=S}else{let S=this.#t[c];if(this.#e(S)){let E=i&&S.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?S.__staleWhileFetching:S.__returned=S}let z=this.#g(c);if(!_&&!z)return l&&(l.fetch="hit"),this.#W(c),s&&this.#C(c),l&&this.#O(l,c),S;let F=this.#M(t,c,b,g),T=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=z?"stale":"refresh",T&&z&&(l.returnedStale=!0)),T?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#L;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],p=this.#e(r);return h&&this.#O(h,o),this.#g(o)?(h&&(h.get="stale"),p?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#E(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),p?r.__staleWhileFetching:(this.#W(o),s&&this.#C(o),r))}else h&&(h.get="miss")}#H(t,e){this.#u[e]=t,this.#a[t]=e}#W(t){t!==this.#h&&(t===this.#o?this.#o=this.#a[t]:this.#H(this.#u[t],this.#a[t]),this.#H(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#k(e);else{this.#R(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#A||this.#f)&&(this.#A&&this.#p?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#o)this.#o=this.#a[s];else{let h=this.#u[s];this.#a[h]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#m.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#k("delete")}#k(t){for(let e of this.#T({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#A&&this.#p?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#y&&(this.#d.fill(0),this.#y.fill(0)),this.#b&&this.#b.fill(0),this.#o=0,this.#h=0,this.#m.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};export{L as LRUCache};
      +var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,I=new Set,R=typeof process=="object"&&process?process:{},x=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,D=globalThis.AbortSignal;if(typeof C>"u"){D=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new D;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,x("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!I.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),U=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#o=!1;static create(t){let e=U(t);if(!e)return[];a.#o=!0;let i=new a(t,e);return a.#o=!1,i}constructor(t,e){if(!a.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class a{#o;#c;#w;#C;#S;#L;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#v;#f;#x;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,h)=>t.#G(e,i,s,h),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#E(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#I}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:h,updateAgeOnGet:n,updateAgeOnHas:o,allowStale:r,dispose:f,onInsert:S,disposeAfter:c,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:u,allowStaleOnFetchRejection:m,allowStaleOnFetchAbort:z,ignoreFetchAbort:T,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??M,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let F=e?U(e):Array;if(!F)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new F(e),this.#u=new F(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof f=="function"&&(this.#w=f),typeof S=="function"&&(this.#C=S),typeof c=="function"?(this.#S=c,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#x=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!m,this.allowStaleOnFetchAbort=!!z,this.ignoreFetchAbort=!!T,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!u,this.updateAgeOnGet=!!n,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!h,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let E="LRU_CACHE_UNBOUNDED";G(E)&&(I.add(E),x("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new O(this.#o),e=new O(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(n,o,r=this.#m.now())=>{if(e[n]=o!==0?r:0,t[n]=o,i?.[n]&&(clearTimeout(i[n]),i[n]=void 0),o!==0&&i){let f=setTimeout(()=>{this.#p(n)&&this.#O(this.#i[n],"expire")},o+1);f.unref&&f.unref(),i[n]=f}},this.#R=n=>{e[n]=t[n]!==0?this.#m.now():0},this.#z=(n,o)=>{if(t[o]){let r=t[o],f=e[o];if(!r||!f)return;n.ttl=r,n.start=f,n.now=s||h();let S=n.now-f;n.remainingTTL=r-S}};let s=0,h=()=>{let n=this.#m.now();if(this.ttlResolution>0){s=n;let o=setTimeout(()=>s=0,this.ttlResolution);o.unref&&o.unref()}return n};this.getRemainingTTL=n=>{let o=this.#s.get(n);if(o===void 0)return 0;let r=t[o],f=e[o];if(!r||!f)return 1/0;let S=(s||h())-f;return r-S},this.#p=n=>{let o=e[n],r=t[n];return!!r&&!!o&&(s||h())-o>r}}#R=()=>{};#z=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new O(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,h)=>{if(this.#e(i))return 0;if(!y(s))if(h){if(typeof h!="function")throw new TypeError("sizeCalculation must be a function");if(s=h(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#U=(e,i,s)=>{if(t[e]=i,this.#c){let h=this.#c-t[e];for(;this.#_>h;)this.#M(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#U=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#E({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#E())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#E()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#E())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;if(h!==void 0&&t(h,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#E()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#E({allowStale:!0}))this.#p(e)&&(this.#O(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let h={value:s};if(this.#d&&this.#A){let n=this.#d[e],o=this.#A[e];if(n&&o){let r=n-(this.#m.now()-o);h.ttl=r,h.start=Date.now()}}return this.#y&&(h.size=this.#y[e]),h}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],h=this.#e(s)?s.__staleWhileFetching:s;if(h===void 0||i===void 0)continue;let n={value:h};if(this.#d&&this.#A){n.ttl=this.#d[e];let o=this.#m.now()-this.#A[e];n.start=Math.floor(Date.now()-o)}this.#y&&(n.size=this.#y[e]),t.unshift([i,n])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:h,noDisposeOnSet:n=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:f=this.noUpdateTTL}=i,S=this.#P(t,e,i.size||0,o);if(this.maxEntrySize&&S>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#O(t,"set"),this;let c=this.#n===0?void 0:this.#s.get(t);if(c===void 0)c=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#M(!1):this.#n,this.#i[c]=t,this.#t[c]=e,this.#s.set(t,c),this.#a[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#U(c,S,r),r&&(r.set="add"),f=!1,this.#x&&this.#C?.(e,t,"add");else{this.#D(c);let d=this.#t[c];if(e!==d){if(this.#v&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!n&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else n||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(c),this.#U(c,S,r),this.#t[c]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#x&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(f||this.#N(c,s,h),r&&this.#z(r,c)),!n&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#M(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#M(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,h=this.#s.get(t);if(h!==void 0){let n=this.#t[h];if(this.#e(n)&&n.__staleWhileFetching===void 0)return!1;if(this.#p(h))s&&(s.has="stale",this.#z(s,h));else return i&&this.#R(h),s&&(s.has="hit",this.#z(s,h)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let h=this.#t[s];return this.#e(h)?h.__staleWhileFetching:h}#G(t,e,i,s){let h=e===void 0?void 0:this.#t[e];if(this.#e(h))return h;let n=new C,{signal:o}=i;o?.addEventListener("abort",()=>n.abort(o.reason),{signal:n.signal});let r={signal:n.signal,options:i,context:s},f=(p,_=!1)=>{let{aborted:l}=n.signal,w=i.ignoreFetchAbort&&p!==void 0;if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=n.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return c(n.signal.reason);let b=g,u=this.#t[e];return(u===g||w&&_&&u===void 0)&&(p===void 0?b.__staleWhileFetching!==void 0?this.#t[e]=b.__staleWhileFetching:this.#O(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},S=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),c(p)),c=p=>{let{aborted:_}=n.signal,l=_&&i.allowStaleOnFetchAbort,w=l||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!b||u.__staleWhileFetching===void 0?this.#O(t,"fetch"):l||(this.#t[e]=u.__staleWhileFetching)),w)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,h,r);l&&l instanceof Promise&&l.then(w=>p(w===void 0?void 0:w),_),n.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=w=>f(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(f,S),A=Object.assign(g,{__abortController:n,__staleWhileFetching:h,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,ttl:n=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:f=this.sizeCalculation,noUpdateTTL:S=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,ttl:n,noDisposeOnSet:o,size:r,sizeCalculation:f,noUpdateTTL:S,noDeleteOnFetchRejection:c,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:w},u=this.#s.get(t);if(u===void 0){l&&(l.fetch="miss");let m=this.#G(t,u,b,p);return m.__returned=m}else{let m=this.#t[u];if(this.#e(m)){let E=i&&m.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?m.__staleWhileFetching:m.__returned=m}let z=this.#p(u);if(!_&&!z)return l&&(l.fetch="hit"),this.#D(u),s&&this.#R(u),l&&this.#z(l,u),m;let T=this.#G(t,u,b,p),F=T.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=z?"stale":"refresh",F&&z&&(l.returnedStale=!0)),F?T.__staleWhileFetching:T.__returned=T}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:h,...n}=e,o=this.get(t,n);if(!h&&o!==void 0)return o;let r=i(t,o,{options:n,context:s});return this.set(t,r,n),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,status:n}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],f=this.#e(r);return n&&this.#z(n,o),this.#p(o)?(n&&(n.get="stale"),f?(n&&i&&r.__staleWhileFetching!==void 0&&(n.returnedStale=!0),i?r.__staleWhileFetching:void 0):(h||this.#O(t,"expire"),n&&i&&(n.returnedStale=!0),i?r:void 0)):(n&&(n.get="hit"),f?r.__staleWhileFetching:(this.#D(o),s&&this.#R(o),r))}else n&&(n.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#O(t,"delete")}#O(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let h=this.#t[s];if(this.#e(h)?h.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(h,t,e),this.#f&&this.#r?.push([h,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let n=this.#u[s];this.#a[n]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,h;for(;h=s?.shift();)this.#S?.(...h)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#E({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};export{L as LRUCache};
       //# sourceMappingURL=index.min.js.map
      diff --git a/deps/npm/node_modules/lru-cache/package.json b/deps/npm/node_modules/lru-cache/package.json
      index 24bb077d632ea6..3c6365bec83867 100644
      --- a/deps/npm/node_modules/lru-cache/package.json
      +++ b/deps/npm/node_modules/lru-cache/package.json
      @@ -1,7 +1,7 @@
       {
         "name": "lru-cache",
         "description": "A cache object that deletes the least-recently-used items.",
      -  "version": "11.2.2",
      +  "version": "11.2.4",
         "author": "Isaac Z. Schlueter ",
         "keywords": [
           "mru",
      @@ -59,25 +59,13 @@
           "tshy": "^3.0.2",
           "typedoc": "^0.28.12"
         },
      -  "license": "ISC",
      +  "license": "BlueOak-1.0.0",
         "files": [
           "dist"
         ],
         "engines": {
           "node": "20 || >=22"
         },
      -  "prettier": {
      -    "experimentalTernaries": true,
      -    "semi": false,
      -    "printWidth": 70,
      -    "tabWidth": 2,
      -    "useTabs": false,
      -    "singleQuote": true,
      -    "jsxSingleQuote": false,
      -    "bracketSameLine": true,
      -    "arrowParens": "avoid",
      -    "endOfLine": "lf"
      -  },
         "tap": {
           "node-arg": [
             "--expose-gc"
      diff --git a/deps/npm/node_modules/path-scurry/dist/commonjs/index.js b/deps/npm/node_modules/path-scurry/dist/commonjs/index.js
      index af3e7595f577f0..112f732d69a3f5 100644
      --- a/deps/npm/node_modules/path-scurry/dist/commonjs/index.js
      +++ b/deps/npm/node_modules/path-scurry/dist/commonjs/index.js
      @@ -99,7 +99,7 @@ const entToType = (s) => s.isFile() ? IFREG
                               : s.isFIFO() ? IFIFO
                                   : UNKNOWN;
       // normalize unicode path names
      -const normalizeCache = new Map();
      +const normalizeCache = new lru_cache_1.LRUCache({ max: 2 ** 12 });
       const normalize = (s) => {
           const c = normalizeCache.get(s);
           if (c)
      @@ -108,7 +108,7 @@ const normalize = (s) => {
           normalizeCache.set(s, n);
           return n;
       };
      -const normalizeNocaseCache = new Map();
      +const normalizeNocaseCache = new lru_cache_1.LRUCache({ max: 2 ** 12 });
       const normalizeNocase = (s) => {
           const c = normalizeNocaseCache.get(s);
           if (c)
      @@ -299,6 +299,7 @@ class PathBase {
           get parentPath() {
               return (this.parent || this).fullpath();
           }
      +    /* c8 ignore start */
           /**
            * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
            * this property refers to the *parent* path, not the path object itself.
      @@ -308,6 +309,7 @@ class PathBase {
           get path() {
               return this.parentPath;
           }
      +    /* c8 ignore stop */
           /**
            * Do not create new Path objects directly.  They should always be accessed
            * via the PathScurry class or other methods on the Path class.
      diff --git a/deps/npm/node_modules/path-scurry/dist/esm/index.js b/deps/npm/node_modules/path-scurry/dist/esm/index.js
      index 42be74c37ad9db..dc7cae493aa50f 100644
      --- a/deps/npm/node_modules/path-scurry/dist/esm/index.js
      +++ b/deps/npm/node_modules/path-scurry/dist/esm/index.js
      @@ -73,7 +73,7 @@ const entToType = (s) => s.isFile() ? IFREG
                               : s.isFIFO() ? IFIFO
                                   : UNKNOWN;
       // normalize unicode path names
      -const normalizeCache = new Map();
      +const normalizeCache = new LRUCache({ max: 2 ** 12 });
       const normalize = (s) => {
           const c = normalizeCache.get(s);
           if (c)
      @@ -82,7 +82,7 @@ const normalize = (s) => {
           normalizeCache.set(s, n);
           return n;
       };
      -const normalizeNocaseCache = new Map();
      +const normalizeNocaseCache = new LRUCache({ max: 2 ** 12 });
       const normalizeNocase = (s) => {
           const c = normalizeNocaseCache.get(s);
           if (c)
      @@ -271,6 +271,7 @@ export class PathBase {
           get parentPath() {
               return (this.parent || this).fullpath();
           }
      +    /* c8 ignore start */
           /**
            * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
            * this property refers to the *parent* path, not the path object itself.
      @@ -280,6 +281,7 @@ export class PathBase {
           get path() {
               return this.parentPath;
           }
      +    /* c8 ignore stop */
           /**
            * Do not create new Path objects directly.  They should always be accessed
            * via the PathScurry class or other methods on the Path class.
      diff --git a/deps/npm/node_modules/path-scurry/package.json b/deps/npm/node_modules/path-scurry/package.json
      index c3cb39dced545a..831f23469b7865 100644
      --- a/deps/npm/node_modules/path-scurry/package.json
      +++ b/deps/npm/node_modules/path-scurry/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "path-scurry",
      -  "version": "2.0.0",
      +  "version": "2.0.1",
         "description": "walk paths fast and efficiently",
         "author": "Isaac Z. Schlueter  (https://blog.izs.me)",
         "main": "./dist/commonjs/index.js",
      diff --git a/deps/npm/node_modules/postcss-selector-parser/dist/parser.js b/deps/npm/node_modules/postcss-selector-parser/dist/parser.js
      index ada61582777805..e36af64dbd3380 100644
      --- a/deps/npm/node_modules/postcss-selector-parser/dist/parser.js
      +++ b/deps/npm/node_modules/postcss-selector-parser/dist/parser.js
      @@ -548,7 +548,7 @@ var Parser = /*#__PURE__*/function () {
             if (_space2.endsWith(' ') && _rawSpace2.endsWith(' ')) {
               spaces.before = _space2.slice(0, _space2.length - 1);
               raws.spaces.before = _rawSpace2.slice(0, _rawSpace2.length - 1);
      -      } else if (_space2.startsWith(' ') && _rawSpace2.startsWith(' ')) {
      +      } else if (_space2[0] === ' ' && _rawSpace2[0] === ' ') {
               spaces.after = _space2.slice(1);
               raws.spaces.after = _rawSpace2.slice(1);
             } else {
      diff --git a/deps/npm/node_modules/postcss-selector-parser/package.json b/deps/npm/node_modules/postcss-selector-parser/package.json
      index f8b1d3619c0be1..c4f057c915bfd8 100644
      --- a/deps/npm/node_modules/postcss-selector-parser/package.json
      +++ b/deps/npm/node_modules/postcss-selector-parser/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "postcss-selector-parser",
      -  "version": "7.1.0",
      +  "version": "7.1.1",
         "devDependencies": {
           "@babel/cli": "^7.11.6",
           "@babel/core": "^7.11.6",
      @@ -11,7 +11,7 @@
           "@babel/register": "^7.11.5",
           "ava": "^5.1.0",
           "babel-plugin-add-module-exports": "^1.0.4",
      -    "coveralls": "^3.1.0",
      +    "coveralls-next": "^4.2.1",
           "del-cli": "^5.0.0",
           "eslint": "^8.28.0",
           "eslint-plugin-import": "^2.26.0",
      @@ -39,6 +39,7 @@
           "lintfix": "eslint --fix src",
           "report": "nyc report --reporter=html",
           "test": "nyc ava src/__tests__/*.mjs",
      +    "test:node22": "nyc ava src/__tests__/*.mjs --node-arguments=--no-experimental-detect-module",
           "testone": "ava"
         },
         "dependencies": {
      diff --git a/deps/npm/node_modules/sigstore/dist/sigstore.js b/deps/npm/node_modules/sigstore/dist/sigstore.js
      index b82b6208d45dfa..7d33707a355fa6 100644
      --- a/deps/npm/node_modules/sigstore/dist/sigstore.js
      +++ b/deps/npm/node_modules/sigstore/dist/sigstore.js
      @@ -78,7 +78,8 @@ async function verify(bundle, dataOrOptions, options) {
           else {
               options = dataOrOptions;
           }
      -    return createVerifier(options).then((verifier) => verifier.verify(bundle, data));
      +    const verifier = await createVerifier(options);
      +    return verifier.verify(bundle, data);
       }
       async function createVerifier(
       /* istanbul ignore next */
      @@ -105,8 +106,7 @@ options = {}) {
               verify: (bundle, payload) => {
                   const deserializedBundle = (0, bundle_1.bundleFromJSON)(bundle);
                   const signedEntity = (0, verify_1.toSignedEntity)(deserializedBundle, payload);
      -            verifier.verify(signedEntity, policy);
      -            return;
      +            return verifier.verify(signedEntity, policy);
               },
           };
       }
      diff --git a/deps/npm/node_modules/sigstore/package.json b/deps/npm/node_modules/sigstore/package.json
      index b036dc787c75c7..5965f0889ca7db 100644
      --- a/deps/npm/node_modules/sigstore/package.json
      +++ b/deps/npm/node_modules/sigstore/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "sigstore",
      -  "version": "4.0.0",
      +  "version": "4.1.0",
         "description": "code-signing for npm packages",
         "main": "dist/index.js",
         "types": "dist/index.d.ts",
      @@ -30,16 +30,16 @@
           "@sigstore/rekor-types": "^4.0.0",
           "@sigstore/jest": "^0.0.0",
           "@sigstore/mock": "^0.11.0",
      -    "@tufjs/repo-mock": "^3.0.1",
      +    "@tufjs/repo-mock": "^4.0.0",
           "@types/make-fetch-happen": "^10.0.4"
         },
         "dependencies": {
           "@sigstore/bundle": "^4.0.0",
      -    "@sigstore/core": "^3.0.0",
      +    "@sigstore/core": "^3.1.0",
           "@sigstore/protobuf-specs": "^0.5.0",
      -    "@sigstore/sign": "^4.0.0",
      -    "@sigstore/tuf": "^4.0.0",
      -    "@sigstore/verify": "^3.0.0"
      +    "@sigstore/sign": "^4.1.0",
      +    "@sigstore/tuf": "^4.0.1",
      +    "@sigstore/verify": "^3.1.0"
         },
         "engines": {
           "node": "^20.17.0 || >=22.9.0"
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/extract.js b/deps/npm/node_modules/tar/dist/commonjs/extract.js
      index f848cbcbf779e8..86deb304d8b018 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/extract.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/extract.js
      @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       var __importDefault = (this && this.__importDefault) || function (mod) {
           return (mod && mod.__esModule) ? mod : { "default": mod };
       };
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/header.js b/deps/npm/node_modules/tar/dist/commonjs/header.js
      index 09d8a3dfa80daf..12558ed9256234 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/header.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/header.js
      @@ -19,13 +19,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       Object.defineProperty(exports, "__esModule", { value: true });
       exports.Header = void 0;
       const node_path_1 = require("node:path");
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/index.js b/deps/npm/node_modules/tar/dist/commonjs/index.js
      index e93ed5ad54aa6e..bd975c77281b71 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/index.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/index.js
      @@ -18,13 +18,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       var __exportStar = (this && this.__exportStar) || function(m, exports) {
           for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
       };
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       Object.defineProperty(exports, "__esModule", { value: true });
       exports.u = exports.types = exports.r = exports.t = exports.x = exports.c = void 0;
       __exportStar(require("./create.js"), exports);
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/list.js b/deps/npm/node_modules/tar/dist/commonjs/list.js
      index 5efad803a4cf5a..5157bc8ba8b2fd 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/list.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/list.js
      @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       var __importDefault = (this && this.__importDefault) || function (mod) {
           return (mod && mod.__esModule) ? mod : { "default": mod };
       };
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/normalize-unicode.js b/deps/npm/node_modules/tar/dist/commonjs/normalize-unicode.js
      index 6ce3342d43bcf5..5b0eaec8ccb498 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/normalize-unicode.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/normalize-unicode.js
      @@ -11,7 +11,11 @@ const MAX = 10000;
       const cache = new Set();
       const normalizeUnicode = (s) => {
           if (!cache.has(s)) {
      -        normalizeCache[s] = s.normalize('NFD');
      +        // shake out identical accents and ligatures
      +        normalizeCache[s] = s
      +            .normalize('NFD')
      +            .toLocaleLowerCase('en')
      +            .toLocaleUpperCase('en');
           }
           else {
               cache.delete(s);
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/pack.js b/deps/npm/node_modules/tar/dist/commonjs/pack.js
      index 237f368e5d2256..450b0011a5f0bf 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/pack.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/pack.js
      @@ -23,13 +23,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       var __importDefault = (this && this.__importDefault) || function (mod) {
           return (mod && mod.__esModule) ? mod : { "default": mod };
       };
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/path-reservations.js b/deps/npm/node_modules/tar/dist/commonjs/path-reservations.js
      index 9ff391c44092c7..525d233b2a45fc 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/path-reservations.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/path-reservations.js
      @@ -44,7 +44,7 @@ class PathReservations {
                       ['win32 parallelization disabled']
                       : paths.map(p => {
                           // don't need normPath, because we skip this entirely for windows
      -                    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase();
      +                    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p)));
                       });
               const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)));
               this.#reservations.set(fn, { dirs, paths });
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/unpack.js b/deps/npm/node_modules/tar/dist/commonjs/unpack.js
      index 23b1f81156dbd5..dea24ed0a25b52 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/unpack.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/unpack.js
      @@ -20,13 +20,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       var __importDefault = (this && this.__importDefault) || function (mod) {
           return (mod && mod.__esModule) ? mod : { "default": mod };
       };
      @@ -56,6 +66,7 @@ const SYMLINK = Symbol('symlink');
       const HARDLINK = Symbol('hardlink');
       const UNSUPPORTED = Symbol('unsupported');
       const CHECKPATH = Symbol('checkPath');
      +const STRIPABSOLUTEPATH = Symbol('stripAbsolutePath');
       const MKDIR = Symbol('mkdir');
       const ONERROR = Symbol('onError');
       const PENDING = Symbol('pending');
      @@ -239,6 +250,35 @@ class Unpack extends parse_js_1.Parser {
                   this.emit('end');
               }
           }
      +    // return false if we need to skip this file
      +    // return true if the field was successfully sanitized
      +    [STRIPABSOLUTEPATH](entry, field) {
      +        const path = entry[field];
      +        if (!path || this.preservePaths)
      +            return true;
      +        const parts = path.split('/');
      +        if (parts.includes('..') ||
      +            /* c8 ignore next */
      +            (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
      +            this.warn('TAR_ENTRY_ERROR', `${field} contains '..'`, {
      +                entry,
      +                [field]: path,
      +            });
      +            // not ok!
      +            return false;
      +        }
      +        // strip off the root
      +        const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(path);
      +        if (root) {
      +            // ok, but triggers warning about stripping root
      +            entry[field] = String(stripped);
      +            this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute ${field}`, {
      +                entry,
      +                [field]: path,
      +            });
      +        }
      +        return true;
      +    }
           [CHECKPATH](entry) {
               const p = (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path);
               const parts = p.split('/');
      @@ -267,25 +307,9 @@ class Unpack extends parse_js_1.Parser {
                   });
                   return false;
               }
      -        if (!this.preservePaths) {
      -            if (parts.includes('..') ||
      -                /* c8 ignore next */
      -                (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
      -                this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
      -                    entry,
      -                    path: p,
      -                });
      -                return false;
      -            }
      -            // strip off the root
      -            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p);
      -            if (root) {
      -                entry.path = String(stripped);
      -                this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, {
      -                    entry,
      -                    path: p,
      -                });
      -            }
      +        if (!this[STRIPABSOLUTEPATH](entry, 'path') ||
      +            !this[STRIPABSOLUTEPATH](entry, 'linkpath')) {
      +            return false;
               }
               if (node_path_1.default.isAbsolute(entry.path)) {
                   entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(entry.path));
      diff --git a/deps/npm/node_modules/tar/dist/commonjs/write-entry.js b/deps/npm/node_modules/tar/dist/commonjs/write-entry.js
      index 45b7efeb795027..20e14a0d6c0b6a 100644
      --- a/deps/npm/node_modules/tar/dist/commonjs/write-entry.js
      +++ b/deps/npm/node_modules/tar/dist/commonjs/write-entry.js
      @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
       }) : function(o, v) {
           o["default"] = v;
       });
      -var __importStar = (this && this.__importStar) || function (mod) {
      -    if (mod && mod.__esModule) return mod;
      -    var result = {};
      -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      -    __setModuleDefault(result, mod);
      -    return result;
      -};
      +var __importStar = (this && this.__importStar) || (function () {
      +    var ownKeys = function(o) {
      +        ownKeys = Object.getOwnPropertyNames || function (o) {
      +            var ar = [];
      +            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
      +            return ar;
      +        };
      +        return ownKeys(o);
      +    };
      +    return function (mod) {
      +        if (mod && mod.__esModule) return mod;
      +        var result = {};
      +        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
      +        __setModuleDefault(result, mod);
      +        return result;
      +    };
      +})();
       var __importDefault = (this && this.__importDefault) || function (mod) {
           return (mod && mod.__esModule) ? mod : { "default": mod };
       };
      diff --git a/deps/npm/node_modules/tar/dist/esm/normalize-unicode.js b/deps/npm/node_modules/tar/dist/esm/normalize-unicode.js
      index e9b8f14b013470..8fa17f5b9ce974 100644
      --- a/deps/npm/node_modules/tar/dist/esm/normalize-unicode.js
      +++ b/deps/npm/node_modules/tar/dist/esm/normalize-unicode.js
      @@ -8,7 +8,11 @@ const MAX = 10000;
       const cache = new Set();
       export const normalizeUnicode = (s) => {
           if (!cache.has(s)) {
      -        normalizeCache[s] = s.normalize('NFD');
      +        // shake out identical accents and ligatures
      +        normalizeCache[s] = s
      +            .normalize('NFD')
      +            .toLocaleLowerCase('en')
      +            .toLocaleUpperCase('en');
           }
           else {
               cache.delete(s);
      diff --git a/deps/npm/node_modules/tar/dist/esm/path-reservations.js b/deps/npm/node_modules/tar/dist/esm/path-reservations.js
      index e63b9c91e9a808..f7535c15ea5320 100644
      --- a/deps/npm/node_modules/tar/dist/esm/path-reservations.js
      +++ b/deps/npm/node_modules/tar/dist/esm/path-reservations.js
      @@ -41,7 +41,7 @@ export class PathReservations {
                       ['win32 parallelization disabled']
                       : paths.map(p => {
                           // don't need normPath, because we skip this entirely for windows
      -                    return stripTrailingSlashes(join(normalizeUnicode(p))).toLowerCase();
      +                    return stripTrailingSlashes(join(normalizeUnicode(p)));
                       });
               const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)));
               this.#reservations.set(fn, { dirs, paths });
      diff --git a/deps/npm/node_modules/tar/dist/esm/unpack.js b/deps/npm/node_modules/tar/dist/esm/unpack.js
      index 4e8fc5c117a056..23274872f382d8 100644
      --- a/deps/npm/node_modules/tar/dist/esm/unpack.js
      +++ b/deps/npm/node_modules/tar/dist/esm/unpack.js
      @@ -27,6 +27,7 @@ const SYMLINK = Symbol('symlink');
       const HARDLINK = Symbol('hardlink');
       const UNSUPPORTED = Symbol('unsupported');
       const CHECKPATH = Symbol('checkPath');
      +const STRIPABSOLUTEPATH = Symbol('stripAbsolutePath');
       const MKDIR = Symbol('mkdir');
       const ONERROR = Symbol('onError');
       const PENDING = Symbol('pending');
      @@ -210,6 +211,35 @@ export class Unpack extends Parser {
                   this.emit('end');
               }
           }
      +    // return false if we need to skip this file
      +    // return true if the field was successfully sanitized
      +    [STRIPABSOLUTEPATH](entry, field) {
      +        const path = entry[field];
      +        if (!path || this.preservePaths)
      +            return true;
      +        const parts = path.split('/');
      +        if (parts.includes('..') ||
      +            /* c8 ignore next */
      +            (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
      +            this.warn('TAR_ENTRY_ERROR', `${field} contains '..'`, {
      +                entry,
      +                [field]: path,
      +            });
      +            // not ok!
      +            return false;
      +        }
      +        // strip off the root
      +        const [root, stripped] = stripAbsolutePath(path);
      +        if (root) {
      +            // ok, but triggers warning about stripping root
      +            entry[field] = String(stripped);
      +            this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute ${field}`, {
      +                entry,
      +                [field]: path,
      +            });
      +        }
      +        return true;
      +    }
           [CHECKPATH](entry) {
               const p = normalizeWindowsPath(entry.path);
               const parts = p.split('/');
      @@ -238,25 +268,9 @@ export class Unpack extends Parser {
                   });
                   return false;
               }
      -        if (!this.preservePaths) {
      -            if (parts.includes('..') ||
      -                /* c8 ignore next */
      -                (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
      -                this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
      -                    entry,
      -                    path: p,
      -                });
      -                return false;
      -            }
      -            // strip off the root
      -            const [root, stripped] = stripAbsolutePath(p);
      -            if (root) {
      -                entry.path = String(stripped);
      -                this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, {
      -                    entry,
      -                    path: p,
      -                });
      -            }
      +        if (!this[STRIPABSOLUTEPATH](entry, 'path') ||
      +            !this[STRIPABSOLUTEPATH](entry, 'linkpath')) {
      +            return false;
               }
               if (path.isAbsolute(entry.path)) {
                   entry.absolute = normalizeWindowsPath(path.resolve(entry.path));
      diff --git a/deps/npm/node_modules/tar/package.json b/deps/npm/node_modules/tar/package.json
      index 27368e26b25531..35c8a5525bcabf 100644
      --- a/deps/npm/node_modules/tar/package.json
      +++ b/deps/npm/node_modules/tar/package.json
      @@ -2,7 +2,7 @@
         "author": "Isaac Z. Schlueter",
         "name": "tar",
         "description": "tar for node",
      -  "version": "7.5.2",
      +  "version": "7.5.4",
         "repository": {
           "type": "git",
           "url": "https://github.com/isaacs/node-tar.git"
      @@ -28,17 +28,17 @@
           "yallist": "^5.0.0"
         },
         "devDependencies": {
      -    "@types/node": "^22.15.29",
      -    "chmodr": "^1.2.0",
      +    "@types/node": "^25.0.9",
      +    "chmodr": "^2.0.2",
           "end-of-stream": "^1.4.3",
           "events-to-array": "^2.0.3",
           "mutate-fs": "^2.1.1",
           "nock": "^13.5.4",
      -    "prettier": "^3.2.5",
      -    "rimraf": "^5.0.5",
      -    "tap": "^18.7.2",
      -    "tshy": "^1.13.1",
      -    "typedoc": "^0.25.13"
      +    "prettier": "^3.8.0",
      +    "rimraf": "^6.1.2",
      +    "tap": "^21.5.0",
      +    "tshy": "^3.1.0",
      +    "typedoc": "^0.28.16"
         },
         "license": "BlueOak-1.0.0",
         "engines": {
      @@ -47,23 +47,6 @@
         "files": [
           "dist"
         ],
      -  "tap": {
      -    "coverage-map": "map.js",
      -    "timeout": 0,
      -    "typecheck": true
      -  },
      -  "prettier": {
      -    "experimentalTernaries": true,
      -    "semi": false,
      -    "printWidth": 70,
      -    "tabWidth": 2,
      -    "useTabs": false,
      -    "singleQuote": true,
      -    "jsxSingleQuote": false,
      -    "bracketSameLine": true,
      -    "arrowParens": "avoid",
      -    "endOfLine": "lf"
      -  },
         "tshy": {
           "exports": {
             "./package.json": "./package.json",
      @@ -92,228 +75,190 @@
           "./package.json": "./package.json",
           ".": {
             "import": {
      -        "source": "./src/index.ts",
               "types": "./dist/esm/index.d.ts",
               "default": "./dist/esm/index.js"
             },
             "require": {
      -        "source": "./src/index.ts",
               "types": "./dist/commonjs/index.d.ts",
               "default": "./dist/commonjs/index.js"
             }
           },
           "./c": {
             "import": {
      -        "source": "./src/create.ts",
               "types": "./dist/esm/create.d.ts",
               "default": "./dist/esm/create.js"
             },
             "require": {
      -        "source": "./src/create.ts",
               "types": "./dist/commonjs/create.d.ts",
               "default": "./dist/commonjs/create.js"
             }
           },
           "./create": {
             "import": {
      -        "source": "./src/create.ts",
               "types": "./dist/esm/create.d.ts",
               "default": "./dist/esm/create.js"
             },
             "require": {
      -        "source": "./src/create.ts",
               "types": "./dist/commonjs/create.d.ts",
               "default": "./dist/commonjs/create.js"
             }
           },
           "./replace": {
             "import": {
      -        "source": "./src/create.ts",
               "types": "./dist/esm/create.d.ts",
               "default": "./dist/esm/create.js"
             },
             "require": {
      -        "source": "./src/create.ts",
               "types": "./dist/commonjs/create.d.ts",
               "default": "./dist/commonjs/create.js"
             }
           },
           "./r": {
             "import": {
      -        "source": "./src/create.ts",
               "types": "./dist/esm/create.d.ts",
               "default": "./dist/esm/create.js"
             },
             "require": {
      -        "source": "./src/create.ts",
               "types": "./dist/commonjs/create.d.ts",
               "default": "./dist/commonjs/create.js"
             }
           },
           "./list": {
             "import": {
      -        "source": "./src/list.ts",
               "types": "./dist/esm/list.d.ts",
               "default": "./dist/esm/list.js"
             },
             "require": {
      -        "source": "./src/list.ts",
               "types": "./dist/commonjs/list.d.ts",
               "default": "./dist/commonjs/list.js"
             }
           },
           "./t": {
             "import": {
      -        "source": "./src/list.ts",
               "types": "./dist/esm/list.d.ts",
               "default": "./dist/esm/list.js"
             },
             "require": {
      -        "source": "./src/list.ts",
               "types": "./dist/commonjs/list.d.ts",
               "default": "./dist/commonjs/list.js"
             }
           },
           "./update": {
             "import": {
      -        "source": "./src/update.ts",
               "types": "./dist/esm/update.d.ts",
               "default": "./dist/esm/update.js"
             },
             "require": {
      -        "source": "./src/update.ts",
               "types": "./dist/commonjs/update.d.ts",
               "default": "./dist/commonjs/update.js"
             }
           },
           "./u": {
             "import": {
      -        "source": "./src/update.ts",
               "types": "./dist/esm/update.d.ts",
               "default": "./dist/esm/update.js"
             },
             "require": {
      -        "source": "./src/update.ts",
               "types": "./dist/commonjs/update.d.ts",
               "default": "./dist/commonjs/update.js"
             }
           },
           "./extract": {
             "import": {
      -        "source": "./src/extract.ts",
               "types": "./dist/esm/extract.d.ts",
               "default": "./dist/esm/extract.js"
             },
             "require": {
      -        "source": "./src/extract.ts",
               "types": "./dist/commonjs/extract.d.ts",
               "default": "./dist/commonjs/extract.js"
             }
           },
           "./x": {
             "import": {
      -        "source": "./src/extract.ts",
               "types": "./dist/esm/extract.d.ts",
               "default": "./dist/esm/extract.js"
             },
             "require": {
      -        "source": "./src/extract.ts",
               "types": "./dist/commonjs/extract.d.ts",
               "default": "./dist/commonjs/extract.js"
             }
           },
           "./pack": {
             "import": {
      -        "source": "./src/pack.ts",
               "types": "./dist/esm/pack.d.ts",
               "default": "./dist/esm/pack.js"
             },
             "require": {
      -        "source": "./src/pack.ts",
               "types": "./dist/commonjs/pack.d.ts",
               "default": "./dist/commonjs/pack.js"
             }
           },
           "./unpack": {
             "import": {
      -        "source": "./src/unpack.ts",
               "types": "./dist/esm/unpack.d.ts",
               "default": "./dist/esm/unpack.js"
             },
             "require": {
      -        "source": "./src/unpack.ts",
               "types": "./dist/commonjs/unpack.d.ts",
               "default": "./dist/commonjs/unpack.js"
             }
           },
           "./parse": {
             "import": {
      -        "source": "./src/parse.ts",
               "types": "./dist/esm/parse.d.ts",
               "default": "./dist/esm/parse.js"
             },
             "require": {
      -        "source": "./src/parse.ts",
               "types": "./dist/commonjs/parse.d.ts",
               "default": "./dist/commonjs/parse.js"
             }
           },
           "./read-entry": {
             "import": {
      -        "source": "./src/read-entry.ts",
               "types": "./dist/esm/read-entry.d.ts",
               "default": "./dist/esm/read-entry.js"
             },
             "require": {
      -        "source": "./src/read-entry.ts",
               "types": "./dist/commonjs/read-entry.d.ts",
               "default": "./dist/commonjs/read-entry.js"
             }
           },
           "./write-entry": {
             "import": {
      -        "source": "./src/write-entry.ts",
               "types": "./dist/esm/write-entry.d.ts",
               "default": "./dist/esm/write-entry.js"
             },
             "require": {
      -        "source": "./src/write-entry.ts",
               "types": "./dist/commonjs/write-entry.d.ts",
               "default": "./dist/commonjs/write-entry.js"
             }
           },
           "./header": {
             "import": {
      -        "source": "./src/header.ts",
               "types": "./dist/esm/header.d.ts",
               "default": "./dist/esm/header.js"
             },
             "require": {
      -        "source": "./src/header.ts",
               "types": "./dist/commonjs/header.d.ts",
               "default": "./dist/commonjs/header.js"
             }
           },
           "./pax": {
             "import": {
      -        "source": "./src/pax.ts",
               "types": "./dist/esm/pax.d.ts",
               "default": "./dist/esm/pax.js"
             },
             "require": {
      -        "source": "./src/pax.ts",
               "types": "./dist/commonjs/pax.d.ts",
               "default": "./dist/commonjs/pax.js"
             }
           },
           "./types": {
             "import": {
      -        "source": "./src/types.ts",
               "types": "./dist/esm/types.d.ts",
               "default": "./dist/esm/types.js"
             },
             "require": {
      -        "source": "./src/types.ts",
               "types": "./dist/commonjs/types.d.ts",
               "default": "./dist/commonjs/types.js"
             }
      diff --git a/deps/npm/node_modules/tuf-js/dist/config.js b/deps/npm/node_modules/tuf-js/dist/config.js
      index c66d76af86b98c..a15e161cc61ac7 100644
      --- a/deps/npm/node_modules/tuf-js/dist/config.js
      +++ b/deps/npm/node_modules/tuf-js/dist/config.js
      @@ -12,4 +12,5 @@ exports.defaultConfig = {
           fetchTimeout: 100000, // milliseconds
           fetchRetries: undefined,
           fetchRetry: 2,
      +    userAgent: '',
       };
      diff --git a/deps/npm/node_modules/tuf-js/dist/fetcher.js b/deps/npm/node_modules/tuf-js/dist/fetcher.js
      index b964135c7b008e..03c7260c8d17b7 100644
      --- a/deps/npm/node_modules/tuf-js/dist/fetcher.js
      +++ b/deps/npm/node_modules/tuf-js/dist/fetcher.js
      @@ -11,6 +11,7 @@ const util_1 = __importDefault(require("util"));
       const error_1 = require("./error");
       const tmpfile_1 = require("./utils/tmpfile");
       const log = (0, debug_1.default)('tuf:fetch');
      +const USER_AGENT_HEADER = 'User-Agent';
       class BaseFetcher {
           // Download file from given URL. The file is downloaded to a temporary
           // location and then passed to the given handler. The handler is responsible
      @@ -54,16 +55,21 @@ class BaseFetcher {
       }
       exports.BaseFetcher = BaseFetcher;
       class DefaultFetcher extends BaseFetcher {
      +    userAgent;
           timeout;
           retry;
           constructor(options = {}) {
               super();
      +        this.userAgent = options.userAgent;
               this.timeout = options.timeout;
               this.retry = options.retry;
           }
           async fetch(url) {
               log('GET %s', url);
               const response = await (0, make_fetch_happen_1.default)(url, {
      +            headers: {
      +                [USER_AGENT_HEADER]: this.userAgent || '',
      +            },
                   timeout: this.timeout,
                   retry: this.retry,
               });
      diff --git a/deps/npm/node_modules/tuf-js/dist/updater.js b/deps/npm/node_modules/tuf-js/dist/updater.js
      index 32046e4bec417c..3f8614d7d498ab 100644
      --- a/deps/npm/node_modules/tuf-js/dist/updater.js
      +++ b/deps/npm/node_modules/tuf-js/dist/updater.js
      @@ -41,6 +41,7 @@ const models_1 = require("@tufjs/models");
       const debug_1 = __importDefault(require("debug"));
       const fs = __importStar(require("fs"));
       const path = __importStar(require("path"));
      +const package_json_1 = require("../package.json");
       const config_1 = require("./config");
       const error_1 = require("./error");
       const fetcher_1 = require("./fetcher");
      @@ -66,9 +67,13 @@ class Updater {
               const data = this.loadLocalMetadata(models_1.MetadataKind.Root);
               this.trustedSet = new store_1.TrustedMetadataStore(data);
               this.config = { ...config_1.defaultConfig, ...config };
      +        const userAgent = config?.userAgent
      +            ? `${config.userAgent} tuf-js/${package_json_1.version}`
      +            : `tuf-js/${package_json_1.version}`;
               this.fetcher =
                   fetcher ||
                       new fetcher_1.DefaultFetcher({
      +                    userAgent,
                           timeout: this.config.fetchTimeout,
                           retry: this.config.fetchRetries ?? this.config.fetchRetry,
                       });
      diff --git a/deps/npm/node_modules/tuf-js/package.json b/deps/npm/node_modules/tuf-js/package.json
      index c7f53556ac1526..30d7a95fa5f104 100644
      --- a/deps/npm/node_modules/tuf-js/package.json
      +++ b/deps/npm/node_modules/tuf-js/package.json
      @@ -1,6 +1,6 @@
       {
         "name": "tuf-js",
      -  "version": "4.0.0",
      +  "version": "4.1.0",
         "description": "JavaScript implementation of The Update Framework (TUF)",
         "main": "dist/index.js",
         "types": "dist/index.d.ts",
      @@ -28,14 +28,14 @@
         },
         "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/client#readme",
         "devDependencies": {
      -    "@tufjs/repo-mock": "4.0.0",
      +    "@tufjs/repo-mock": "4.0.1",
           "@types/debug": "^4.1.12",
           "@types/make-fetch-happen": "^10.0.4"
         },
         "dependencies": {
      -    "@tufjs/models": "4.0.0",
      -    "debug": "^4.4.1",
      -    "make-fetch-happen": "^15.0.0"
      +    "@tufjs/models": "4.1.0",
      +    "debug": "^4.4.3",
      +    "make-fetch-happen": "^15.0.1"
         },
         "engines": {
           "node": "^20.17.0 || >=22.9.0"
      diff --git a/deps/npm/node_modules/validate-npm-package-name/lib/builtin-modules.json b/deps/npm/node_modules/validate-npm-package-name/lib/builtin-modules.json
      new file mode 100644
      index 00000000000000..252c24f3ec6710
      --- /dev/null
      +++ b/deps/npm/node_modules/validate-npm-package-name/lib/builtin-modules.json
      @@ -0,0 +1 @@
      +["_http_agent","_http_client","_http_common","_http_incoming","_http_outgoing","_http_server","_stream_duplex","_stream_passthrough","_stream_readable","_stream_transform","_stream_wrap","_stream_writable","_tls_common","_tls_wrap","assert","assert/strict","async_hooks","buffer","child_process","cluster","console","constants","crypto","dgram","diagnostics_channel","dns","dns/promises","domain","events","fs","fs/promises","http","http2","https","inspector","inspector/promises","module","net","os","path","path/posix","path/win32","perf_hooks","process","punycode","querystring","readline","readline/promises","repl","stream","stream/consumers","stream/promises","stream/web","string_decoder","sys","timers","timers/promises","tls","trace_events","tty","url","util","util/types","v8","vm","wasi","worker_threads","zlib","node:sea","node:sqlite","node:test","node:test/reporters"]
      diff --git a/deps/npm/node_modules/validate-npm-package-name/lib/index.js b/deps/npm/node_modules/validate-npm-package-name/lib/index.js
      index db6e86b0dfc60a..93d77b76b3dd29 100644
      --- a/deps/npm/node_modules/validate-npm-package-name/lib/index.js
      +++ b/deps/npm/node_modules/validate-npm-package-name/lib/index.js
      @@ -1,5 +1,5 @@
       'use strict'
      -const { builtinModules: builtins } = require('module')
      +const builtins = require('./builtin-modules.json')
       
       var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$')
       var exclusionList = [
      @@ -34,6 +34,10 @@ function validate (name) {
           errors.push('name cannot start with a period')
         }
       
      +  if (name.startsWith('-')) {
      +    errors.push('name cannot start with a hyphen')
      +  }
      +
         if (name.match(/^_/)) {
           errors.push('name cannot start with an underscore')
         }
      diff --git a/deps/npm/node_modules/validate-npm-package-name/package.json b/deps/npm/node_modules/validate-npm-package-name/package.json
      index 87204aaf663982..754742cbf6f1c2 100644
      --- a/deps/npm/node_modules/validate-npm-package-name/package.json
      +++ b/deps/npm/node_modules/validate-npm-package-name/package.json
      @@ -1,28 +1,30 @@
       {
         "name": "validate-npm-package-name",
      -  "version": "7.0.0",
      +  "version": "7.0.2",
         "description": "Give me a string and I'll tell you if it's a valid npm package name",
         "main": "lib/",
         "directories": {
           "test": "test"
         },
         "devDependencies": {
      -    "@npmcli/eslint-config": "^5.0.0",
      -    "@npmcli/template-oss": "4.27.1",
      -    "tap": "^16.0.1"
      +    "@npmcli/eslint-config": "^6.0.0",
      +    "@npmcli/template-oss": "4.28.1"
         },
         "scripts": {
      +    "builtin-fixture": "node -e \"console.log(JSON.stringify(require('node:module').builtinModules))\" > ./lib/builtin-modules.json",
           "cov:test": "TAP_FLAGS='--cov' npm run test:code",
           "test:code": "tap ${TAP_FLAGS:-'--'} test/*.js",
           "test:style": "standard",
      -    "test": "tap",
      +    "test": "node --test './test/**/*.js'",
           "lint": "npm run eslint",
           "postlint": "template-oss-check",
           "template-oss-apply": "template-oss-apply --force",
           "lintfix": "npm run eslint -- --fix",
      -    "snap": "tap",
      +    "snap": "node --test --test-update-snapshots './test/**/*.js'",
           "posttest": "npm run lint",
      -    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
      +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
      +    "test:node20": "node --test test",
      +    "test:cover": "node --test --experimental-test-coverage --test-timeout=3000 --test-coverage-lines=100 --test-coverage-functions=100 --test-coverage-branches=100 './test/**/*.js'"
         },
         "repository": {
           "type": "git",
      @@ -49,13 +51,9 @@
         },
         "templateOSS": {
           "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
      -    "version": "4.27.1",
      -    "publish": true
      -  },
      -  "tap": {
      -    "nyc-arg": [
      -      "--exclude",
      -      "tap-snapshots/**"
      -    ]
      +    "version": "4.28.1",
      +    "publish": true,
      +    "testRunner": "node:test",
      +    "latestCiVersion": 24
         }
       }
      diff --git a/deps/npm/package.json b/deps/npm/package.json
      index 674d5823f36aba..7286f9f0a7fdcf 100644
      --- a/deps/npm/package.json
      +++ b/deps/npm/package.json
      @@ -1,5 +1,5 @@
       {
      -  "version": "11.7.0",
      +  "version": "11.8.0",
         "name": "npm",
         "description": "a package manager for JavaScript",
         "workspaces": [
      @@ -52,8 +52,8 @@
         },
         "dependencies": {
           "@isaacs/string-locale-compare": "^1.1.0",
      -    "@npmcli/arborist": "^9.1.9",
      -    "@npmcli/config": "^10.4.5",
      +    "@npmcli/arborist": "^9.1.10",
      +    "@npmcli/config": "^10.5.0",
           "@npmcli/fs": "^5.0.0",
           "@npmcli/map-workspaces": "^5.0.3",
           "@npmcli/metavuln-calculator": "^9.0.3",
      @@ -61,7 +61,7 @@
           "@npmcli/promise-spawn": "^9.0.1",
           "@npmcli/redact": "^4.0.0",
           "@npmcli/run-script": "^10.0.3",
      -    "@sigstore/tuf": "^4.0.0",
      +    "@sigstore/tuf": "^4.0.1",
           "abbrev": "^4.0.0",
           "archy": "~1.0.0",
           "cacache": "^20.0.3",
      @@ -78,11 +78,11 @@
           "is-cidr": "^6.0.1",
           "json-parse-even-better-errors": "^5.0.0",
           "libnpmaccess": "^10.0.3",
      -    "libnpmdiff": "^8.0.12",
      -    "libnpmexec": "^10.1.11",
      -    "libnpmfund": "^7.0.12",
      +    "libnpmdiff": "^8.0.13",
      +    "libnpmexec": "^10.1.12",
      +    "libnpmfund": "^7.0.13",
           "libnpmorg": "^8.0.1",
      -    "libnpmpack": "^9.0.12",
      +    "libnpmpack": "^9.0.13",
           "libnpmpublish": "^11.1.3",
           "libnpmsearch": "^9.0.1",
           "libnpmteam": "^8.0.2",
      @@ -111,11 +111,11 @@
           "spdx-expression-parse": "^4.0.0",
           "ssri": "^13.0.0",
           "supports-color": "^10.2.2",
      -    "tar": "^7.5.2",
      +    "tar": "^7.5.4",
           "text-table": "~0.2.0",
           "tiny-relative-date": "^2.0.2",
           "treeverse": "^3.0.0",
      -    "validate-npm-package-name": "^7.0.0",
      +    "validate-npm-package-name": "^7.0.2",
           "which": "^6.0.0"
         },
         "bundleDependencies": [
      @@ -198,7 +198,7 @@
           "ajv-formats": "^3.0.1",
           "ajv-formats-draft2019": "^1.6.1",
           "cli-table3": "^0.6.4",
      -    "diff": "^8.0.2",
      +    "diff": "^8.0.3",
           "nock": "^13.4.0",
           "npm-packlist": "^10.0.3",
           "remark": "^15.0.1",
      diff --git a/deps/npm/tap-snapshots/test/lib/commands/sbom.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/sbom.js.test.cjs
      index 1eb269e5671b28..3f1600d9beb3c7 100644
      --- a/deps/npm/tap-snapshots/test/lib/commands/sbom.js.test.cjs
      +++ b/deps/npm/tap-snapshots/test/lib/commands/sbom.js.test.cjs
      @@ -11,7 +11,7 @@ exports[`test/lib/commands/sbom.js TAP sbom --omit dev > must match snapshot 1`]
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-sbom@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -101,7 +101,7 @@ exports[`test/lib/commands/sbom.js TAP sbom --omit optional > must match snapsho
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-sbom@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -169,7 +169,7 @@ exports[`test/lib/commands/sbom.js TAP sbom --omit peer > must match snapshot 1`
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-sbom@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -236,7 +236,7 @@ exports[`test/lib/commands/sbom.js TAP sbom basic sbom - cyclonedx > must match
         "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
         "bomFormat": "CycloneDX",
         "specVersion": "1.5",
      -  "serialNumber": "urn:uuid:00000000-0000-0000-0000-000000000000",
      +  "serialNumber": "urn:uuid:12345678-90ab-cdef-1234-567890abcdef",
         "version": 1,
         "metadata": {
           "timestamp": "2020-01-01T00:00:00.000Z",
      @@ -327,7 +327,7 @@ exports[`test/lib/commands/sbom.js TAP sbom basic sbom - spdx > must match snaps
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-sbom@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -438,7 +438,7 @@ exports[`test/lib/commands/sbom.js TAP sbom duplicate deps - cyclonedx > must ma
         "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
         "bomFormat": "CycloneDX",
         "specVersion": "1.5",
      -  "serialNumber": "urn:uuid:00000000-0000-0000-0000-000000000000",
      +  "serialNumber": "urn:uuid:12345678-90ab-cdef-1234-567890abcdef",
         "version": 1,
         "metadata": {
           "timestamp": "2020-01-01T00:00:00.000Z",
      @@ -546,7 +546,7 @@ exports[`test/lib/commands/sbom.js TAP sbom duplicate deps - spdx > must match s
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-sbom@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -685,7 +685,7 @@ exports[`test/lib/commands/sbom.js TAP sbom extraneous dep > must match snapshot
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-ls@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -797,7 +797,7 @@ exports[`test/lib/commands/sbom.js TAP sbom loading a tree containing workspaces
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "workspaces-tree@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -980,7 +980,7 @@ exports[`test/lib/commands/sbom.js TAP sbom loading a tree containing workspaces
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "workspaces-tree@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -1070,7 +1070,7 @@ exports[`test/lib/commands/sbom.js TAP sbom loading a tree containing workspaces
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "workspaces-tree@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -1341,7 +1341,7 @@ exports[`test/lib/commands/sbom.js TAP sbom loading a tree containing workspaces
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "workspaces-tree@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -1413,7 +1413,7 @@ exports[`test/lib/commands/sbom.js TAP sbom lock file only > must match snapshot
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-ls@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      @@ -1525,7 +1525,7 @@ exports[`test/lib/commands/sbom.js TAP sbom missing (optional) dep > must match
         "dataLicense": "CC0-1.0",
         "SPDXID": "SPDXRef-DOCUMENT",
         "name": "test-npm-ls@1.0.0",
      -  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-00000000-0000-0000-0000-000000000000",
      +  "documentNamespace": "http://spdx.org/spdxdocs/test-npm-sbom-1.0.0-12345678-90ab-cdef-1234-567890abcdef",
         "creationInfo": {
           "created": "2020-01-01T00:00:00.000Z",
           "creators": [
      diff --git a/deps/npm/test/lib/commands/config.js b/deps/npm/test/lib/commands/config.js
      index 64977c6f6c2f0e..9a65e883cfebc1 100644
      --- a/deps/npm/test/lib/commands/config.js
      +++ b/deps/npm/test/lib/commands/config.js
      @@ -101,6 +101,49 @@ t.test('config list', async t => {
         t.matchSnapshot(output, 'output matches snapshot')
       })
       
      +t.test('config list with proxy environment variables', async t => {
      +  const originalHTTP = process.env.HTTP_PROXY
      +  const originalHTTPS = process.env.HTTPS_PROXY
      +  const originalNO = process.env.NO_PROXY
      +
      +  t.teardown(() => {
      +    if (originalHTTP !== undefined) {
      +      process.env.HTTP_PROXY = originalHTTP
      +    } else {
      +      delete process.env.HTTP_PROXY
      +    }
      +    if (originalHTTPS !== undefined) {
      +      process.env.HTTPS_PROXY = originalHTTPS
      +    } else {
      +      delete process.env.HTTPS_PROXY
      +    }
      +    if (originalNO !== undefined) {
      +      process.env.NO_PROXY = originalNO
      +    } else {
      +      delete process.env.NO_PROXY
      +    }
      +  })
      +
      +  process.env.HTTP_PROXY = 'http://proxy.example.com:8080'
      +  process.env.HTTPS_PROXY = 'https://secure-proxy.example.com:8443'
      +  process.env.NO_PROXY = 'localhost,127.0.0.1'
      +
      +  const { npm, joinedOutput } = await loadMockNpm(t, {
      +    prefixDir: {
      +      '.npmrc': 'test=value',
      +    },
      +  })
      +
      +  await npm.exec('config', ['list'])
      +
      +  const output = joinedOutput()
      +
      +  t.match(output, 'HTTP_PROXY = "http://proxy.example.com:8080"')
      +  t.match(output, 'HTTPS_PROXY = "https://secure-proxy.example.com:8443"')
      +  t.match(output, 'NO_PROXY = "localhost,127.0.0.1"')
      +  t.match(output, 'environment-related config')
      +})
      +
       t.test('config list --long', async t => {
         const { npm, joinedOutput } = await loadMockNpm(t, {
           prefixDir: {
      diff --git a/deps/npm/test/lib/commands/sbom.js b/deps/npm/test/lib/commands/sbom.js
      index 2603c26469eab5..b93011b5e28bce 100644
      --- a/deps/npm/test/lib/commands/sbom.js
      +++ b/deps/npm/test/lib/commands/sbom.js
      @@ -2,7 +2,7 @@ const t = require('tap')
       const mockNpm = require('../../fixtures/mock-npm.js')
       
       const FAKE_TIMESTAMP = '2020-01-01T00:00:00.000Z'
      -const FAKE_UUID = '00000000-0000-0000-0000-000000000000'
      +const FAKE_UUID = '12345678-90ab-cdef-1234-567890abcdef'
       
       t.cleanSnapshot = s => {
         let sbom
      diff --git a/deps/npm/test/lib/utils/tar.js b/deps/npm/test/lib/utils/tar.js
      index 78668a78ea7ee6..85a95e57766855 100644
      --- a/deps/npm/test/lib/utils/tar.js
      +++ b/deps/npm/test/lib/utils/tar.js
      @@ -225,3 +225,37 @@ t.test('should getContents of a tarball with a node_modules directory included',
         }, 'contents are correct')
         t.end()
       })
      +
      +t.test('should log byte sizes correctly', async (t) => {
      +  const cases = [
      +    [0, '0 B', '0B'],
      +    [1, '1 B', '1B'],
      +    [10, '10 B', '10B'],
      +    [999, '999 B', '999B'],
      +    [1000, '1.0 kB', '1.0kB'],
      +    [1001, '1.0 kB', '1.0kB'],
      +    [1500, '1.5 kB', '1.5kB'],
      +    [999999, '1.0 MB', '1.0MB'],
      +    [1000000, '1.0 MB', '1.0MB'],
      +    [999999999, '1.0 GB', '1.0GB'],
      +    [1000000000, '1.0 GB', '1.0GB'],
      +  ]
      +
      +  for (const [size, expected, expectedNoSpace] of cases) {
      +    const logs = printLogs({
      +      name: 'pkg',
      +      version: '1.0.0',
      +      files: [
      +        { path: 'file.txt', size: size },
      +      ],
      +      bundled: [],
      +      size: size,
      +      unpackedSize: size,
      +      integrity: 'sha512-xxx',
      +    })
      +
      +    t.match(logs, `package size: ${expected}`, `package size: ${expected}`)
      +    t.match(logs, `unpacked size: ${expected}`, `unpacked size: ${expected}`)
      +    t.match(logs, `${expectedNoSpace} file.txt`, `file size: ${expectedNoSpace}`)
      +  }
      +})