From ed0d061c5bc6a9f4f05e94e3ba902a4f8649ebdf Mon Sep 17 00:00:00 2001 From: isaacs Date: Thu, 23 May 2024 18:02:37 -0700 Subject: [PATCH] Add `includeChildMatches: false` option This does a (best effort) attempt to ignore all *subsequent* matches that are a descendant of a previous match. Note the caveat in the docs, though. It will only ignore what it knows about. There's no post-hoc evaluation to only return the shortest results in cases where a deeper match is encountered before its shallower parent. --- .tshy/build.json | 1 - README.md | 42 ++ package-lock.json | 948 ++++++++++++++-------------------- package.json | 16 +- src/glob.ts | 56 +- src/ignore.ts | 61 ++- src/walker.ts | 62 ++- test/include-child-matches.ts | 45 ++ 8 files changed, 608 insertions(+), 623 deletions(-) create mode 100644 test/include-child-matches.ts diff --git a/.tshy/build.json b/.tshy/build.json index c51b7f53..aea1a9e9 100644 --- a/.tshy/build.json +++ b/.tshy/build.json @@ -2,7 +2,6 @@ "extends": "../tsconfig.json", "compilerOptions": { "rootDir": "../src", - "target": "es2022", "module": "nodenext", "moduleResolution": "nodenext" } diff --git a/README.md b/README.md index 92c202af..5bf89e1a 100644 --- a/README.md +++ b/README.md @@ -593,6 +593,48 @@ share the previously loaded cache. explicitly, then any provided `scurry` object must match this setting. +- `includeChildMatches` boolean, default `true`. Do not match any + children of any matches. For example, the pattern `**\/foo` + would match `a/foo`, but not `a/foo/b/foo` in this mode. + + This is especially useful for cases like "find all + `node_modules` folders, but not the ones in `node_modules`". + + In order to support this, the `Ignore` implementation must + support an `add(pattern: string)` method. If using the default + `Ignore` class, then this is fine, but if this is set to + `false`, and a custom `Ignore` is provided that does not have + an `add()` method, then it will throw an error. + + **Caveat** It *only* ignores matches that would be a descendant + of a previous match, and only if that descendant is matched + *after* the ancestor is encountered. Since the file system walk + happens in indeterminate order, it's possible that a match will + already be added before its ancestor, if multiple or braced + patterns are used. + + For example: + + ```js + const results = await glob([ + // likely to match first, since it's just a stat + 'a/b/c/d/e/f', + + // this pattern is more complicated! It must to various readdir() + // calls and test the results against a regular expression, and that + // is certainly going to take a little bit longer. + // + // So, later on, it encounters a match at 'a/b/c/d/e', but it's too + // late to ignore a/b/c/d/e/f, because it's already been emitted. + 'a/[bdf]/?/[a-z]/*', + ], { includeChildMatches: false }) + ``` + + It's best to only set this to `false` if you can be reasonably + sure that no components of the pattern will potentially match + one another's file system descendants, or if the occasional + included child entry will not cause problems. + ## Glob Primer Much more information about glob pattern expansion can be found diff --git a/package-lock.json b/package-lock.json index 141c7350..0f9df173 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -23,13 +23,11 @@ "memfs": "^3.4.13", "mkdirp": "^3.0.1", "prettier": "^2.8.3", - "rimraf": "^5.0.1", + "rimraf": "^5.0.7", "sync-content": "^1.0.2", - "tap": "^18.7.2", - "ts-node": "^10.9.2", - "tshy": "^1.12.0", - "typedoc": "^0.25.12", - "typescript": "^5.2.2" + "tap": "^19.0.0", + "tshy": "^1.14.0", + "typedoc": "^0.25.12" }, "engines": { "node": ">=16 || 14 >=14.18" @@ -104,9 +102,9 @@ } }, "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009": { - "version": "10.9.5", - "resolved": "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.5.tgz", - "integrity": "sha512-hEDlwpHhIabtB+Urku8muNMEkGui0LVGlYLS3KoB9QBDf0Pw3r7q0RrfoQmFuk8CvRpGzErO3/vLQd9Ys+/g4g==", + "version": "10.9.6", + "resolved": "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.6.tgz", + "integrity": "sha512-N3Ee/DEPnVyXL33+Nlpa6aXlYfw4hg6y+TvyWiuVKZPUkfndmr/eOp6E+NofEyT6s8iHkvpMw0sNYwRvIFeViA==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -187,25 +185,25 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.1.tgz", - "integrity": "sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dev": true, "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -215,15 +213,15 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", - "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", + "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", @@ -258,16 +256,16 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -283,9 +281,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", - "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.1.0.tgz", + "integrity": "sha512-1aL4TuVrLS9sf8quCLerU3H9J4vtCtgu8VauYozrmEyU57i/EdKleCnsQ7vpnABIH6c9mnTxcH5sFkO3BlV8wQ==", "dev": true, "dependencies": { "@npmcli/git": "^5.0.0", @@ -293,7 +291,7 @@ "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "semver": "^7.5.3" }, "engines": { @@ -301,9 +299,9 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", - "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, "dependencies": { "which": "^4.0.0" @@ -336,6 +334,15 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/redact": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-1.1.0.tgz", + "integrity": "sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/run-script": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", @@ -386,12 +393,12 @@ } }, "node_modules/@sigstore/bundle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", - "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -407,60 +414,62 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz", - "integrity": "sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", - "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.2.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.0", - "make-fetch-happen": "^13.0.0" + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", - "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/verify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", - "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.2.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.0" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tapjs/after": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-1.1.20.tgz", - "integrity": "sha512-EGosPLlKe8MaZMkoyA2lJhF2h/zNNzKA93yA4fkg+tOvKaVvtI8BtSmErN2sMIYRFPHxaLzQgr0268h7m2Ysow==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-1.1.23.tgz", + "integrity": "sha512-H/78/46SJBS257cu8xHGdC1+aBgz8hp/XrKQb3jvgVd1Wr8VOslHs61cP0OYjctU2bQlaPUMfHB5+8JrmYw48w==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.1" @@ -469,13 +478,13 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/after-each": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-1.1.20.tgz", - "integrity": "sha512-j5+VLjyssCfC4+fEP31tJpKdXO4pBuouovauHHc5xR2qo/hMonB/MlDHhFOL9PbC4sLBHvY4EkotwET36aLECg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-2.0.0.tgz", + "integrity": "sha512-G66l0fx/st1qoap6OEfiofbhkeet8eEr6rNFy0lDZd1UPdnOpVOXu4Oqk1WoWIhnWepezxZLiMYgm2ERh9lL8Q==", "dev": true, "dependencies": { "function-loop": "^4.0.0" @@ -484,18 +493,18 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/asserts": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-1.1.20.tgz", - "integrity": "sha512-0w+c3+1TVzpObrQTRfDnE/Z3TTCWUVA4sZwzjfmhbwbF8VA83HR0Bh6fj7dIsrrsufWwp4QMyXPwN62HPwSCgg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-2.0.0.tgz", + "integrity": "sha512-69XfDpbuBMnYCoxNXH6bcLEN3+TM23l1+YfYBpCy3h7OtKbNUQ142Rczaez1xmHoUNjCpIwS0I1cLkKxkYOpvA==", "dev": true, "dependencies": { - "@tapjs/stack": "1.2.8", + "@tapjs/stack": "2.0.0", "is-actual-promise": "^1.0.1", - "tcompare": "6.4.6", + "tcompare": "7.0.0", "trivial-deferred": "^2.0.0" }, "engines": { @@ -505,13 +514,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/before": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-1.1.20.tgz", - "integrity": "sha512-UuYor/jk+BRw9i3KuI6vrf7QF7g4V+z5ku/6qwUg7dkAE3qrCsRGNQ7Es1161ncXQUSoUy91vw/mRvFoTTRQ7Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-2.0.0.tgz", + "integrity": "sha512-aZDIcQc4E8bDOoIR2jRSZrPiWVXQk+ilFKstSvndaqApg2WeNDLYA4rN9v5v8aJJV6X7X9QxDDnVnLOwAFDbRw==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.1" @@ -520,13 +529,13 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/before-each": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-1.1.20.tgz", - "integrity": "sha512-ln27bSetJoDo1AIFCdpwPupGhJN6dA1Sc55qHJ2Ni9O9IYc/9s5JvzzQ4eEV1hFaiROvpsS945MtQY4mRS09Lg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-2.0.0.tgz", + "integrity": "sha512-++7EdcVAjyxFnAeMPg0y3OXEpPZRN6jl72/uWUth6h4oPoliPA1pKtJu8gYOjnWS170C7gbyTOc999ZfLjxe+A==", "dev": true, "dependencies": { "function-loop": "^4.0.0" @@ -535,19 +544,19 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/config": { - "version": "2.4.17", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-2.4.17.tgz", - "integrity": "sha512-zMuOR2/i3IvKSEjKizGaR3LQ2x7VPbH3DOHGe0nW/BRnzTss9ZnKx579guHwYRBMJIqKLOsKYrBBAgM+7k6qvA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-3.0.0.tgz", + "integrity": "sha512-MOj68l0Li1Xb/F1reXWEqYfEETkI1TPhCEq/7OIxcHkGMkiEciEnOM7AF/nsnYIOioc5qg6wSy9TTMzDzAiiYQ==", "dev": true, "dependencies": { - "@tapjs/core": "1.5.2", - "@tapjs/test": "1.4.2", + "@tapjs/core": "2.0.0", + "@tapjs/test": "2.0.0", "chalk": "^5.2.0", - "jackspeak": "^2.3.6", + "jackspeak": "^3.1.2", "polite-json": "^4.0.1", "tap-yaml": "2.2.2", "walk-up-path": "^3.0.1" @@ -559,45 +568,27 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2", - "@tapjs/test": "1.4.2" - } - }, - "node_modules/@tapjs/config/node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "@tapjs/core": "2.0.0", + "@tapjs/test": "2.0.0" } }, "node_modules/@tapjs/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-1.5.2.tgz", - "integrity": "sha512-Z/xkjJBOzS3mjUxFTOvtQX34GmOLx+C27w6bFRHrPCO1YTtu08SXJ9Mdkv+7vbSlAnBLWFgZddWvpgpAYud/uQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-2.0.0.tgz", + "integrity": "sha512-a8jffmbrh8Cjgpn4hhmcCO71eJ/94bW12U+JDzoc91ij6q+J2AiTHKH7AHgyN1FNJ/AdSXHKT+nyboBkezWHzg==", "dev": true, "dependencies": { "@tapjs/processinfo": "^3.1.7", - "@tapjs/stack": "1.2.8", - "@tapjs/test": "1.4.2", + "@tapjs/stack": "2.0.0", + "@tapjs/test": "2.0.0", "async-hook-domain": "^4.0.1", "diff": "^5.2.0", "is-actual-promise": "^1.0.1", "minipass": "^7.0.4", "signal-exit": "4.1", - "tap-parser": "15.3.2", + "tap-parser": "16.0.0", "tap-yaml": "2.2.2", - "tcompare": "6.4.6", + "tcompare": "7.0.0", "trivial-deferred": "^2.0.0" }, "engines": { @@ -605,9 +596,9 @@ } }, "node_modules/@tapjs/error-serdes": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-1.2.2.tgz", - "integrity": "sha512-RW2aU50JR7SSAlvoTyuwouXETLM9lP+7oZ5Z+dyKhNp8mkbbz4mXKcgd9SDHY5qTh6zvVN7OFK7ev7dYWXbrWw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-2.0.0.tgz", + "integrity": "sha512-ZfFW73nLcohtoSGp8tJSG/L8dvYbd3W8Z3mwbwfwt+DBPKr03RgbEn5OMkvoCwPw8xp1Rb+qC6tb2LrssZmMUA==", "dev": true, "dependencies": { "minipass": "^7.0.4" @@ -620,9 +611,9 @@ } }, "node_modules/@tapjs/filter": { - "version": "1.2.20", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-1.2.20.tgz", - "integrity": "sha512-8zyTBjY8lYVz2W0S8nw8vq0kkwCM6Ike76n71mVzMOFcW/qXIn2ImW/PJtHREMFwLEN0aL51Ey/60Cs85EevxA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-2.0.0.tgz", + "integrity": "sha512-0lZJl16N1k4sR1SKNXzFJMXBTxOcC8VIK6dtFb8QI4QABVivtw9+zsj9NWH1gN9yrahT9excXL1i53WHujKsEg==", "dev": true, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" @@ -631,13 +622,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/fixture": { - "version": "1.2.20", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-1.2.20.tgz", - "integrity": "sha512-QJwANuumhNv59ONrpGOMy0hY+P2rHPakOlAR8ZkkAKbdQS5E0YExZLDna/Ug47Qin6MbaqXPk6zP/eiiBxZxig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-2.0.0.tgz", + "integrity": "sha512-Cf9fV5WnkAv7Ii4YZ1bX06Jcqsv1347EzhQrHB2zHioc3nxKDx6zJmh+RIx09+lGFD9jSAXQ90LRSgQJHqrUSQ==", "dev": true, "dependencies": { "mkdirp": "^3.0.0", @@ -650,33 +641,33 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/intercept": { - "version": "1.2.20", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-1.2.20.tgz", - "integrity": "sha512-LEjE2rKfELh8CM6NPAGKIi1HDFjb66G//qbTs8lnLCiulUvUWGlx4RzeBdky0532+vyR9Q3JdHsidCNOsq33ow==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-2.0.0.tgz", + "integrity": "sha512-Brh1lU8Q49HR+B4lhpGX6MqZ4d5VRWugTx6CmTc2abJnUmGNI95OR3rk3MNva6yCP4KLvbDxHmgGwqOpo8LsTA==", "dev": true, "dependencies": { - "@tapjs/after": "1.1.20", - "@tapjs/stack": "1.2.8" + "@tapjs/after": "1.1.23", + "@tapjs/stack": "2.0.0" }, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/mock": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-1.3.2.tgz", - "integrity": "sha512-QN3Nft/wxww/oxPpx/bgW4EF7EfxfvcAY/0VPphI3NjG/ZSNeZ7lbO9kYvh+RSRC1PtDR6OvfGA2dwQ7V/81DQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-2.0.0.tgz", + "integrity": "sha512-lq73tB0U4KihKaZBdflRIoTId2uhRoklvAM6BDsByPWkYFLaWtJRB9rEJ7fcOR9wB9ckrQFo32ozwKkdPqqzlw==", "dev": true, "dependencies": { - "@tapjs/after": "1.1.20", - "@tapjs/stack": "1.2.8", + "@tapjs/after": "1.1.23", + "@tapjs/stack": "2.0.0", "resolve-import": "^1.4.5", "walk-up-path": "^3.0.1" }, @@ -687,18 +678,18 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/node-serialize": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-1.3.2.tgz", - "integrity": "sha512-KyYYU1tOTn3udST4lQUl2KsZFPbA7UGqHKT3Os/FmHplmgJeSPc5nKKCI+R2h/ADSULQx7ZiBUYot8o0GTqndw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-2.0.0.tgz", + "integrity": "sha512-QnulP84StsKXX6vr38geYBrUNRYNDGMLXsVRdo5lyl7v4lR4bbUASrXU4vEMc/kKRNi5dbe63EVriFQXOp7A6Q==", "dev": true, "dependencies": { - "@tapjs/error-serdes": "1.2.2", - "@tapjs/stack": "1.2.8", - "tap-parser": "15.3.2" + "@tapjs/error-serdes": "2.0.0", + "@tapjs/stack": "2.0.0", + "tap-parser": "16.0.0" }, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" @@ -707,7 +698,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/processinfo": { @@ -726,13 +717,13 @@ } }, "node_modules/@tapjs/reporter": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-1.3.18.tgz", - "integrity": "sha512-IVJf+zb1chL5uLXxWojmeylKlBlRsAQQA417FhF7V3jcTGzSSM017hI602ljnmgltvAh0vD6OHjVozDVh94b8w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-2.0.0.tgz", + "integrity": "sha512-zFK+fAc7lKdMbKWOB7pj9phT/A/qRnmAfPFnKGxbTW0SaBi37Uno/NGCb3hHX6Rstku4HFp7KMAD7dLQ5MK72w==", "dev": true, "dependencies": { - "@tapjs/config": "2.4.17", - "@tapjs/stack": "1.2.8", + "@tapjs/config": "3.0.0", + "@tapjs/stack": "2.0.0", "chalk": "^5.2.0", "ink": "^4.4.1", "minipass": "^7.0.4", @@ -741,9 +732,9 @@ "prismjs-terminal": "^1.2.3", "react": "^18.2.0", "string-length": "^6.0.0", - "tap-parser": "15.3.2", + "tap-parser": "16.0.0", "tap-yaml": "2.2.2", - "tcompare": "6.4.6" + "tcompare": "7.0.0" }, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" @@ -752,28 +743,28 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/run": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-1.5.2.tgz", - "integrity": "sha512-4JdFP3UKmv2rWVPoRHQAUp/dSMlyzRDwnSJPE9wuXEnlZhoqjpa6n4rNrWbh02PFohogJZn1G8h5u4CBtocQRQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-2.0.0.tgz", + "integrity": "sha512-H+VsiJG3AxZcHCLKMAWS5DD+XlLhceJb59lAqJIW0zCBjDKHntQh/7BJkw0F6OcwteSPagMqiA2muLFEBdGGPA==", "dev": true, "dependencies": { - "@tapjs/after": "1.1.20", - "@tapjs/before": "1.1.20", - "@tapjs/config": "2.4.17", + "@tapjs/after": "1.1.23", + "@tapjs/before": "2.0.0", + "@tapjs/config": "3.0.0", "@tapjs/processinfo": "^3.1.7", - "@tapjs/reporter": "1.3.18", - "@tapjs/spawn": "1.1.20", - "@tapjs/stdin": "1.1.20", - "@tapjs/test": "1.4.2", + "@tapjs/reporter": "2.0.0", + "@tapjs/spawn": "2.0.0", + "@tapjs/stdin": "2.0.0", + "@tapjs/test": "2.0.0", "c8": "^8.0.1", "chalk": "^5.3.0", "chokidar": "^3.6.0", "foreground-child": "^3.1.1", - "glob": "^10.3.10", + "glob": "^10.3.16", "minipass": "^7.0.4", "mkdirp": "^3.0.1", "opener": "^1.5.2", @@ -782,9 +773,9 @@ "rimraf": "^5.0.5", "semver": "^7.6.0", "signal-exit": "^4.1.0", - "tap-parser": "15.3.2", + "tap-parser": "16.0.0", "tap-yaml": "2.2.2", - "tcompare": "6.4.6", + "tcompare": "7.0.0", "trivial-deferred": "^2.0.0", "which": "^4.0.0" }, @@ -798,7 +789,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/run/node_modules/isexe": { @@ -826,13 +817,13 @@ } }, "node_modules/@tapjs/snapshot": { - "version": "1.2.20", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-1.2.20.tgz", - "integrity": "sha512-/7ct6j//nNjiabJGMSxRsJEXSLOc6SwNC3dHuYeXP+yHIOeRK3qoonLqkt8+/9JgkZyaqIvWMdlo9ezoNPCrAw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-2.0.0.tgz", + "integrity": "sha512-MCUsWgdyWo9AOhSCdyOkK4pfG5/2m4P5FrvPblJ4+qSx+nMebZ01RRgtrRcSn+AScuCkkjgAU9Y9lkXsvxjKJw==", "dev": true, "dependencies": { "is-actual-promise": "^1.0.1", - "tcompare": "6.4.6", + "tcompare": "7.0.0", "trivial-deferred": "^2.0.0" }, "engines": { @@ -842,25 +833,25 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/spawn": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-1.1.20.tgz", - "integrity": "sha512-7w396QXOQb8P3Sar9Ldas7tyTMqFBASpRjr/a6Coyj21s/HejlaX8nnGKldbMhokCR2gZAgkmWg45B3tVqxZJA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-2.0.0.tgz", + "integrity": "sha512-+mBE0joes/Zn2TE76K7OpuRLP/C0zpmuH73acLU+zGpSnkndc7nS6tllLeObCaA0wxioS3RbLUxnoXUuvJtkAA==", "dev": true, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/stack": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-1.2.8.tgz", - "integrity": "sha512-VC8h6U62ScerTKN+MYpRPiwH2bCL65S6v1wcj1hukE2hojLcRvVdET7S3ZtRfSj/eNWW/5OVfzTpHiGjEYD6Xg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-2.0.0.tgz", + "integrity": "sha512-8Ebx6CfG0W2s9UusxRXla5x1Gi5dfCm6OCig4ZuD6X+NS7HQD1DltM0KCmKssV2M3mj6k1XOdxRqAKwo9TS0eg==", "dev": true, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" @@ -870,48 +861,49 @@ } }, "node_modules/@tapjs/stdin": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-1.1.20.tgz", - "integrity": "sha512-OX5Q8WtZU48z2SCGEfIarqinDbhX7ajPpIUYHddtK/MbDowHZvgIFZzes7bH9tP2YcQdIRu/tuuyKi/WJMWxdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-2.0.0.tgz", + "integrity": "sha512-ZNJDusDVDOJSN1N46DJHp9jvE1PhzyjWbI5CLV96hhcWOTKKGqddEnS2KpyqNncp3kCf1tg9Nprr2vX2ySgQRA==", "dev": true, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/test": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-1.4.2.tgz", - "integrity": "sha512-xPcnhADRI1dua+1rcdZegLdGmkoyKxFneflQzdSPj4zOBXnzD7Kps269LBndrfA5df4ZjZBaFB0M5xSiu0cUGA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-2.0.0.tgz", + "integrity": "sha512-CRlCq3E1U3Gn2vF1GYpHxOf9wXd3SN+kDR3d74P03sYqG4yT32W8mPDQNtPeMb5i40kvNE0+vkb6Mi73Rof/vA==", "dev": true, "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.5", - "@tapjs/after": "1.1.20", - "@tapjs/after-each": "1.1.20", - "@tapjs/asserts": "1.1.20", - "@tapjs/before": "1.1.20", - "@tapjs/before-each": "1.1.20", - "@tapjs/filter": "1.2.20", - "@tapjs/fixture": "1.2.20", - "@tapjs/intercept": "1.2.20", - "@tapjs/mock": "1.3.2", - "@tapjs/node-serialize": "1.3.2", - "@tapjs/snapshot": "1.2.20", - "@tapjs/spawn": "1.1.20", - "@tapjs/stdin": "1.1.20", - "@tapjs/typescript": "1.4.2", - "@tapjs/worker": "1.1.20", - "glob": "^10.3.10", - "jackspeak": "^2.3.6", + "@tapjs/after": "1.1.23", + "@tapjs/after-each": "2.0.0", + "@tapjs/asserts": "2.0.0", + "@tapjs/before": "2.0.0", + "@tapjs/before-each": "2.0.0", + "@tapjs/filter": "2.0.0", + "@tapjs/fixture": "2.0.0", + "@tapjs/intercept": "2.0.0", + "@tapjs/mock": "2.0.0", + "@tapjs/node-serialize": "2.0.0", + "@tapjs/snapshot": "2.0.0", + "@tapjs/spawn": "2.0.0", + "@tapjs/stdin": "2.0.0", + "@tapjs/typescript": "1.4.5", + "@tapjs/worker": "2.0.0", + "glob": "^10.3.16", + "jackspeak": "^3.1.2", "mkdirp": "^3.0.0", "resolve-import": "^1.4.5", "rimraf": "^5.0.5", "sync-content": "^1.0.1", - "tap-parser": "15.3.2", - "tshy": "^1.12.0", - "typescript": "5.2" + "tap-parser": "16.0.0", + "tshy": "^1.14.0", + "typescript": "5.4", + "walk-up-path": "^3.0.1" }, "bin": { "generate-tap-test-class": "scripts/build.mjs" @@ -920,31 +912,13 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" - } - }, - "node_modules/@tapjs/test/node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/typescript": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-1.4.2.tgz", - "integrity": "sha512-JUSd3c+aly+xP0FLkcw/afYWGeobZ3//f12MUias5f0tLj7AaxpKePGyLeY1f0QvcuzPF/UKjk3BLd1Fh4u86g==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-1.4.5.tgz", + "integrity": "sha512-pZBvBMOCTKeLiD2xHi7woqOlEg5+zww7n4QhzW7qEx8jKojiWAs06aZzcHV+rbaWBPPrPCgJVn4eKqtHV0mH3Q==", "dev": true, "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.5" @@ -953,33 +927,21 @@ "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, "node_modules/@tapjs/worker": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-1.1.20.tgz", - "integrity": "sha512-I7wvUqoe8vD8Ld65VgSWVTdbWyP6eTpSJ8At/TRKznlJj4CVSvZ3lV5RxvLCBTg7ITCKcS+mQbqsmjpsvPGXEg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-2.0.0.tgz", + "integrity": "sha512-XnIcbeuVegYdqeMsb/U2vCzRWI6UFD7tatad4fan60e0md6qpKKKEsJKhgI25ucL85mL+9OCMv0e2iNCgo6X+A==", "dev": true, "engines": { "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" }, "peerDependencies": { - "@tapjs/core": "1.5.2" + "@tapjs/core": "2.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, "node_modules/@tsconfig/node14": { "version": "14.1.2", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", @@ -1014,13 +976,13 @@ } }, "node_modules/@tufjs/models": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", - "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" + "minimatch": "^9.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -1072,9 +1034,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -1211,26 +1173,17 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/c8": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.1.tgz", @@ -1334,9 +1287,9 @@ "dev": true }, "node_modules/cacache": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", - "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", + "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -1632,12 +1585,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1752,9 +1699,9 @@ "dev": true }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -1877,22 +1824,22 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.16", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.16.tgz", + "integrity": "sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^3.1.2", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1910,24 +1857,6 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1956,9 +1885,9 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" @@ -2019,9 +1948,9 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -2055,6 +1984,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -2136,13 +2066,10 @@ } }, "node_modules/is-actual-promise": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.1.tgz", - "integrity": "sha512-PlsL4tNv62lx5yN2HSqaRSTgIpUAPW7U6+crVB8HfWm5161rZpeqWbl0ZSqH2MAfRKXWSZVPRNbE/r8qPcb13g==", - "dev": true, - "dependencies": { - "tshy": "^1.7.0" - } + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz", + "integrity": "sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==", + "dev": true }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -2296,7 +2223,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -2323,9 +2249,9 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2415,9 +2341,9 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dev": true, "dependencies": { "@npmcli/agent": "^2.0.0", @@ -2429,6 +2355,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -2470,9 +2397,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2484,9 +2411,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -2504,9 +2431,9 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -2702,6 +2629,15 @@ "node": ">=16" } }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/node-gyp/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -2718,9 +2654,9 @@ } }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "dependencies": { "abbrev": "^2.0.0" @@ -2733,9 +2669,9 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", + "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", @@ -2757,9 +2693,9 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" @@ -2790,13 +2726,13 @@ } }, "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, @@ -2817,9 +2753,9 @@ } }, "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz", + "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==", "dev": true, "dependencies": { "npm-install-checks": "^6.0.0", @@ -2832,18 +2768,19 @@ } }, "node_modules/npm-registry-fetch": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz", + "integrity": "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==", "dev": true, "dependencies": { + "@npmcli/redact": "^1.1.0", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "proc-log": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -2928,9 +2865,9 @@ } }, "node_modules/pacote": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", - "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.7.tgz", + "integrity": "sha512-sgvnoUMlkv9xHwDUKjKQFXVyUi8dtJGKp3vg6sYy+TxbDic5RjZCHF3ygv0EJgNRZ2GfRONjlKPUfokJ9lDpwQ==", "dev": true, "dependencies": { "@npmcli/git": "^5.0.0", @@ -2944,7 +2881,7 @@ "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", @@ -2995,15 +2932,15 @@ } }, "node_modules/path-scurry": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.0.tgz", - "integrity": "sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3084,9 +3021,9 @@ } }, "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -3124,9 +3061,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "dependencies": { "loose-envify": "^1.1.0" @@ -3136,17 +3073,17 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-element-to-jsx-string": { @@ -3171,25 +3108,26 @@ "dev": true }, "node_modules/react-reconciler": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", - "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", "dev": true, "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/read-package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", - "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", + "integrity": "sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -3283,9 +3221,9 @@ } }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -3294,7 +3232,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3308,22 +3246,19 @@ "optional": true }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -3331,18 +3266,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3386,17 +3309,17 @@ } }, "node_modules/sigstore": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", - "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.2.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.0", - "@sigstore/sign": "^2.2.3", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.1.0" + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -3441,9 +3364,9 @@ } }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -3455,12 +3378,12 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", "socks": "^2.7.1" }, @@ -3495,9 +3418,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/sprintf-js": { @@ -3507,9 +3430,9 @@ "dev": true }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -3667,29 +3590,29 @@ } }, "node_modules/tap": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/tap/-/tap-18.7.2.tgz", - "integrity": "sha512-cGrB6laenHPOj3VaExITM54VjM9bR6fd0DK6Co9cm0/eJBog8XL05MX8TLxVPZSJtCu3nUESGjFhpATE8obxcw==", - "dev": true, - "dependencies": { - "@tapjs/after": "1.1.20", - "@tapjs/after-each": "1.1.20", - "@tapjs/asserts": "1.1.20", - "@tapjs/before": "1.1.20", - "@tapjs/before-each": "1.1.20", - "@tapjs/core": "1.5.2", - "@tapjs/filter": "1.2.20", - "@tapjs/fixture": "1.2.20", - "@tapjs/intercept": "1.2.20", - "@tapjs/mock": "1.3.2", - "@tapjs/node-serialize": "1.3.2", - "@tapjs/run": "1.5.2", - "@tapjs/snapshot": "1.2.20", - "@tapjs/spawn": "1.1.20", - "@tapjs/stdin": "1.1.20", - "@tapjs/test": "1.4.2", - "@tapjs/typescript": "1.4.2", - "@tapjs/worker": "1.1.20", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/tap/-/tap-19.0.0.tgz", + "integrity": "sha512-mtRlLSMBwrRadU215uoz/27aOKRg6PvylUf1c0Ji0o+7JQgPukw7VgYKts7BS0yZms85lYz5NH+6wtfutKOuVQ==", + "dev": true, + "dependencies": { + "@tapjs/after": "1.1.23", + "@tapjs/after-each": "2.0.0", + "@tapjs/asserts": "2.0.0", + "@tapjs/before": "2.0.0", + "@tapjs/before-each": "2.0.0", + "@tapjs/core": "2.0.0", + "@tapjs/filter": "2.0.0", + "@tapjs/fixture": "2.0.0", + "@tapjs/intercept": "2.0.0", + "@tapjs/mock": "2.0.0", + "@tapjs/node-serialize": "2.0.0", + "@tapjs/run": "2.0.0", + "@tapjs/snapshot": "2.0.0", + "@tapjs/spawn": "2.0.0", + "@tapjs/stdin": "2.0.0", + "@tapjs/test": "2.0.0", + "@tapjs/typescript": "1.4.5", + "@tapjs/worker": "2.0.0", "resolve-import": "^1.4.5" }, "bin": { @@ -3703,9 +3626,9 @@ } }, "node_modules/tap-parser": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-15.3.2.tgz", - "integrity": "sha512-uvauHuQqAMwfeFVxNpFXhvnWLVL0sthnHk4TxRM3cUy6+dejO9fatoKR7YejbMu4+2/1nR6UQE9+eUcX3PUmsA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-16.0.0.tgz", + "integrity": "sha512-OVtDFWbjQoQbzdLsRNCHG8mWScyxm0m2WWsHeqV6URDXO8idqvCtSu1+FvjggTN+Qq/TQQnnoLcQ09J+T+Wp5w==", "dev": true, "dependencies": { "events-to-array": "^2.0.3", @@ -3794,9 +3717,9 @@ } }, "node_modules/tcompare": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-6.4.6.tgz", - "integrity": "sha512-sxvgCgO2GAIWHibnK4zLvvi9GHd/ZlR9DOUJ4ufwvNtkdKE2I9MNwJUwzYvOmGrJXMcfhhw0CDBb+6j0ia+I7A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-7.0.0.tgz", + "integrity": "sha512-x2xjQ6TydWImqNaXhS8rjj9JNefYf31NlMlEANxOZOZsQWT31SwOODipW39kehncbf/NnvMPnI7P0Yn6nHmAug==", "dev": true, "dependencies": { "diff": "^5.2.0", @@ -3883,85 +3806,22 @@ "node": ">= 8" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/ts-node/node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tshy": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-1.12.0.tgz", - "integrity": "sha512-WooNSTc+uyjLseTdzUFa4Lx3KYMcwxdrJMsWacl39BlfKZKhr30gLjAJkTQWHFkmAO+dj0L4P2jxiIrOo81V3w==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-1.14.0.tgz", + "integrity": "sha512-YiUujgi4Jb+t2I48LwSRzHkBpniH9WjjktNozn+nlsGmVemKSjDNY7EwBRPvPCr5zAC/3ITAYWH9Z7kUinGSrw==", "dev": true, "dependencies": { "chalk": "^5.3.0", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "foreground-child": "^3.1.1", + "minimatch": "^9.0.4", "mkdirp": "^3.0.1", "polite-json": "^4.0.1", - "resolve-import": "^1.4.4", + "resolve-import": "^1.4.5", "rimraf": "^5.0.1", "sync-content": "^1.0.2", - "typescript": "5.2 || 5.3", + "typescript": "^5.4.5", "walk-up-path": "^3.0.1" }, "bin": { @@ -3978,14 +3838,14 @@ "dev": true }, "node_modules/tuf-js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", - "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, "dependencies": { - "@tufjs/models": "2.0.0", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "make-fetch-happen": "^13.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4025,9 +3885,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4117,13 +3977,10 @@ } }, "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -4266,9 +4123,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -4302,9 +4159,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -4394,15 +4251,6 @@ "node": ">=8" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 3fe73e7d..4d1fbb83 100644 --- a/package.json +++ b/package.json @@ -68,22 +68,20 @@ "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "devDependencies": { "@types/node": "^20.11.30", "memfs": "^3.4.13", "mkdirp": "^3.0.1", "prettier": "^2.8.3", - "rimraf": "^5.0.1", + "rimraf": "^5.0.7", "sync-content": "^1.0.2", - "tap": "^18.7.2", - "ts-node": "^10.9.2", - "tshy": "^1.12.0", - "typedoc": "^0.25.12", - "typescript": "^5.2.2" + "tap": "^19.0.0", + "tshy": "^1.14.0", + "typedoc": "^0.25.12" }, "tap": { "before": "test/00-setup.ts" diff --git a/src/glob.ts b/src/glob.ts index cf200947..2a379f63 100644 --- a/src/glob.ts +++ b/src/glob.ts @@ -1,5 +1,6 @@ import { Minimatch, MinimatchOptions } from 'minimatch' import { Minipass } from 'minipass' +import { fileURLToPath } from 'node:url' import { FSOption, Path, @@ -8,7 +9,6 @@ import { PathScurryPosix, PathScurryWin32, } from 'path-scurry' -import { fileURLToPath } from 'node:url' import { IgnoreLike } from './ignore.js' import { Pattern } from './pattern.js' import { GlobStream, GlobWalker } from './walker.js' @@ -292,6 +292,51 @@ export interface GlobOptions { * `'//?/C:/foo/bar'` */ posix?: boolean + + /** + * Do not match any children of any matches. For example, the pattern + * `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode. + * + * This is especially useful for cases like "find all `node_modules` + * folders, but not the ones in `node_modules`". + * + * In order to support this, the `Ignore` implementation must support an + * `add(pattern: string)` method. If using the default `Ignore` class, then + * this is fine, but if this is set to `false`, and a custom `Ignore` is + * provided that does not have an `add()` method, then it will throw an + * error. + * + * **Caveat** It *only* ignores matches that would be a descendant of a + * previous match, and only if that descendant is matched *after* the + * ancestor is encountered. Since the file system walk happens in + * indeterminate order, it's possible that a match will already be added + * before its ancestor, if multiple or braced patterns are used. + * + * For example: + * + * ```ts + * const results = await glob([ + * // likely to match first, since it's just a stat + * 'a/b/c/d/e/f', + * + * // this pattern is more complicated! It must to various readdir() + * // calls and test the results against a regular expression, and that + * // is certainly going to take a little bit longer. + * // + * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too + * // late to ignore a/b/c/d/e/f, because it's already been emitted. + * 'a/[bdf]/?/[a-z]/*', + * ], { includeChildMatches: false }) + * ``` + * + * It's best to only set this to `false` if you can be reasonably sure that + * no components of the pattern will potentially match one another's file + * system descendants, or if the occasional included child entry will not + * cause problems. + * + * @default true + */ + includeChildMatches?: boolean } export type GlobOptionsWithFileTypesTrue = GlobOptions & { @@ -355,6 +400,7 @@ export class Glob implements GlobOptions { signal?: AbortSignal windowsPathsNoEscape: boolean withFileTypes: FileTypes + includeChildMatches: boolean /** * The options provided to the constructor. @@ -401,6 +447,7 @@ export class Glob implements GlobOptions { this.noext = !!opts.noext this.realpath = !!opts.realpath this.absolute = opts.absolute + this.includeChildMatches = opts.includeChildMatches !== false this.noglobstar = !!opts.noglobstar this.matchBase = !!opts.matchBase @@ -419,7 +466,8 @@ export class Glob implements GlobOptions { this.windowsPathsNoEscape = !!opts.windowsPathsNoEscape || - (opts as GlobOptions).allowWindowsEscape === false + (opts as { allowWindowsEscape?: boolean }).allowWindowsEscape === + false if (this.windowsPathsNoEscape) { pattern = pattern.map(p => p.replace(/\\/g, '/')) @@ -520,6 +568,7 @@ export class Glob implements GlobOptions { : Infinity, platform: this.platform, nocase: this.nocase, + includeChildMatches: this.includeChildMatches, }).walk()), ] } @@ -538,6 +587,7 @@ export class Glob implements GlobOptions { : Infinity, platform: this.platform, nocase: this.nocase, + includeChildMatches: this.includeChildMatches, }).walkSync(), ] } @@ -555,6 +605,7 @@ export class Glob implements GlobOptions { : Infinity, platform: this.platform, nocase: this.nocase, + includeChildMatches: this.includeChildMatches, }).stream() } @@ -571,6 +622,7 @@ export class Glob implements GlobOptions { : Infinity, platform: this.platform, nocase: this.nocase, + includeChildMatches: this.includeChildMatches, }).streamSync() } diff --git a/src/ignore.ts b/src/ignore.ts index d5618194..db83cc24 100644 --- a/src/ignore.ts +++ b/src/ignore.ts @@ -3,7 +3,7 @@ // Ignoring a path ignores its children if the pattern ends in /** // Ignores are always parsed in dot:true mode -import { Minimatch } from 'minimatch' +import { Minimatch, MinimatchOptions } from 'minimatch' import { Path } from 'path-scurry' import { Pattern } from './pattern.js' import { GlobWalkerOpts } from './walker.js' @@ -11,6 +11,7 @@ import { GlobWalkerOpts } from './walker.js' export interface IgnoreLike { ignored?: (p: Path) => boolean childrenIgnored?: (p: Path) => boolean + add?: (ignore: string) => void } const defaultPlatform: NodeJS.Platform = @@ -28,6 +29,8 @@ export class Ignore implements IgnoreLike { relativeChildren: Minimatch[] absolute: Minimatch[] absoluteChildren: Minimatch[] + platform: NodeJS.Platform + mmopts: MinimatchOptions constructor( ignored: string[], @@ -43,7 +46,8 @@ export class Ignore implements IgnoreLike { this.absolute = [] this.relativeChildren = [] this.absoluteChildren = [] - const mmopts = { + this.platform = platform + this.mmopts = { dot: true, nobrace, nocase, @@ -54,7 +58,10 @@ export class Ignore implements IgnoreLike { nocomment: true, nonegate: true, } + for (const ign of ignored) this.add(ign) + } + add(ign: string) { // this is a little weird, but it gives us a clean set of optimized // minimatch matchers, without getting tripped up if one of them // ends in /** inside a brace section, and it's only inefficient at @@ -67,32 +74,30 @@ export class Ignore implements IgnoreLike { // for absolute-ness. // Yet another way, Minimatch could take an array of glob strings, and // a cwd option, and do the right thing. - for (const ign of ignored) { - const mm = new Minimatch(ign, mmopts) - for (let i = 0; i < mm.set.length; i++) { - const parsed = mm.set[i] - const globParts = mm.globParts[i] - /* c8 ignore start */ - if (!parsed || !globParts) { - throw new Error('invalid pattern object') - } - // strip off leading ./ portions - // https://github.com/isaacs/node-glob/issues/570 - while (parsed[0] === '.' && globParts[0] === '.') { - parsed.shift() - globParts.shift() - } - /* c8 ignore stop */ - const p = new Pattern(parsed, globParts, 0, platform) - const m = new Minimatch(p.globString(), mmopts) - const children = globParts[globParts.length - 1] === '**' - const absolute = p.isAbsolute() - if (absolute) this.absolute.push(m) - else this.relative.push(m) - if (children) { - if (absolute) this.absoluteChildren.push(m) - else this.relativeChildren.push(m) - } + const mm = new Minimatch(ign, this.mmopts) + for (let i = 0; i < mm.set.length; i++) { + const parsed = mm.set[i] + const globParts = mm.globParts[i] + /* c8 ignore start */ + if (!parsed || !globParts) { + throw new Error('invalid pattern object') + } + // strip off leading ./ portions + // https://github.com/isaacs/node-glob/issues/570 + while (parsed[0] === '.' && globParts[0] === '.') { + parsed.shift() + globParts.shift() + } + /* c8 ignore stop */ + const p = new Pattern(parsed, globParts, 0, this.platform) + const m = new Minimatch(p.globString(), this.mmopts) + const children = globParts[globParts.length - 1] === '**' + const absolute = p.isAbsolute() + if (absolute) this.absolute.push(m) + else this.relative.push(m) + if (children) { + if (absolute) this.absoluteChildren.push(m) + else this.relativeChildren.push(m) } } } diff --git a/src/walker.ts b/src/walker.ts index ed7e1a7e..d983c6e3 100644 --- a/src/walker.ts +++ b/src/walker.ts @@ -42,6 +42,7 @@ export interface GlobWalkerOpts { signal?: AbortSignal windowsPathsNoEscape?: boolean withFileTypes?: boolean + includeChildMatches?: boolean } export type GWOFileTypesTrue = GlobWalkerOpts & { @@ -70,14 +71,10 @@ export type Matches = O extends GWOFileTypesTrue ? Set : Set -export type MatchStream = - O extends GWOFileTypesTrue - ? Minipass - : O extends GWOFileTypesFalse - ? Minipass - : O extends GWOFileTypesUnset - ? Minipass - : Minipass +export type MatchStream = Minipass< + Result, + Result +> const makeIgnore = ( ignore: string | string[] | IgnoreLike, @@ -104,6 +101,7 @@ export abstract class GlobUtil { #sep: '\\' | '/' signal?: AbortSignal maxDepth: number + includeChildMatches: boolean constructor(patterns: Pattern[], path: Path, opts: O) constructor(patterns: Pattern[], path: Path, opts: O) { @@ -111,8 +109,16 @@ export abstract class GlobUtil { this.path = path this.opts = opts this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/' - if (opts.ignore) { - this.#ignore = makeIgnore(opts.ignore, opts) + this.includeChildMatches = opts.includeChildMatches !== false + if (opts.ignore || !this.includeChildMatches) { + this.#ignore = makeIgnore(opts.ignore ?? [], opts) + if ( + !this.includeChildMatches && + typeof this.#ignore.add !== 'function' + ) { + const m = 'cannot ignore child matches, ignore lacks add() method.' + throw new Error(m) + } } // ignore, always set with maxDepth, but it's optional on the // GlobOptions type @@ -220,6 +226,11 @@ export abstract class GlobUtil { matchFinish(e: Path, absolute: boolean) { if (this.#ignored(e)) return + // we know we have an ignore if this is false, but TS doesn't + if (!this.includeChildMatches && this.#ignore?.add) { + const ign = `${e.relativePosix()}/**` + this.#ignore.add(ign) + } const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute this.seen.add(e) @@ -407,25 +418,17 @@ export abstract class GlobUtil { export class GlobWalker< O extends GlobWalkerOpts = GlobWalkerOpts > extends GlobUtil { - matches: O extends GWOFileTypesTrue - ? Set - : O extends GWOFileTypesFalse - ? Set - : O extends GWOFileTypesUnset - ? Set - : Set + matches = new Set>() constructor(patterns: Pattern[], path: Path, opts: O) { super(patterns, path, opts) - this.matches = new Set() as Matches } - matchEmit(e: Result): void - matchEmit(e: Path | string): void { + matchEmit(e: Result): void { this.matches.add(e) } - async walk(): Promise> { + async walk(): Promise>> { if (this.signal?.aborted) throw this.signal.reason if (this.path.isUnknown()) { await this.path.lstat() @@ -442,7 +445,7 @@ export class GlobWalker< return this.matches } - walkSync(): Matches { + walkSync(): Set> { if (this.signal?.aborted) throw this.signal.reason if (this.path.isUnknown()) { this.path.lstatSync() @@ -458,26 +461,19 @@ export class GlobWalker< export class GlobStream< O extends GlobWalkerOpts = GlobWalkerOpts > extends GlobUtil { - results: O extends GWOFileTypesTrue - ? Minipass - : O extends GWOFileTypesFalse - ? Minipass - : O extends GWOFileTypesUnset - ? Minipass - : Minipass + results: Minipass, Result> constructor(patterns: Pattern[], path: Path, opts: O) { super(patterns, path, opts) - this.results = new Minipass({ + this.results = new Minipass, Result>({ signal: this.signal, objectMode: true, - }) as MatchStream + }) this.results.on('drain', () => this.resume()) this.results.on('resume', () => this.resume()) } - matchEmit(e: Result): void - matchEmit(e: Path | string): void { + matchEmit(e: Result): void { this.results.write(e) if (!this.results.flowing) this.pause() } diff --git a/test/include-child-matches.ts b/test/include-child-matches.ts new file mode 100644 index 00000000..c23a5182 --- /dev/null +++ b/test/include-child-matches.ts @@ -0,0 +1,45 @@ +import t from 'tap' +import { + glob, + GlobOptionsWithFileTypesUnset, + globSync, +} from '../src/index.js' + +t.test('no include child matches', async t => { + const cwd = t.testdir({ a: { b: { c: { d: { e: { f: '' } } } } } }) + const pattern = 'a/**/[cde]/**' + const o: GlobOptionsWithFileTypesUnset = { + cwd, + posix: true, + includeChildMatches: false, + } + const a = await glob(pattern, o) + const s = globSync(pattern, o) + t.strictSame(a, ['a/b/c']) + t.strictSame(s, ['a/b/c']) +}) + +t.test('test the caveat', async t => { + const cwd = t.testdir({ a: { b: { c: { d: { e: { f: '' } } } } } }) + const pattern = ['a/b/c/d/e/f', 'a/[bdf]/?/[a-z]/*'] + const o: GlobOptionsWithFileTypesUnset = { + cwd, + posix: true, + includeChildMatches: false, + } + const a = await glob(pattern, o) + const s = globSync(pattern, o) + t.strictSame(a, [ 'a/b/c/d/e/f', 'a/b/c/d/e' ]) + t.strictSame(s, [ 'a/b/c/d/e/f', 'a/b/c/d/e' ]) +}) + +t.test('ignore impl must have an add() method', t => { + t.throws(() => globSync('', { + ignore: { + ignored: () => true, + childrenIgnored: () => true, + }, + includeChildMatches: false, + })) + t.end() +})