diff --git a/.eslintignore b/.eslintignore index 021cf38..88b5b0a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,2 @@ test/fixtures -i18n +workspaces/scanner/src/i18n diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index d824a27..5fbb6f2 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -31,7 +31,7 @@ jobs: - name: build dependencies run: npm run build - name: Run tests - run: npm run test:ci + run: npm run test nsci: runs-on: ubuntu-latest strategy: diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 43c97e7..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/README.md b/README.md index 31fb9b1..08c31e7 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,17 @@ interface Options { } ``` +## Workspaces + +Click on one of the links to access the documentation of the workspace: + +| name | package and link | +| --- | --- | +| scanner | [@nodesecure/estree-ast-utils](./workspaces/scanner) | +| tarball | [@nodesecure/sec-literal ](./workspaces/tarball) | +| tree-walker | [@nodesecure/ts-source-parser ](./workspaces/tree-walker) | +``` + ## Contributors ✨ diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 2c7dd89..0000000 --- a/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Scanner from "./types/scanner.js"; -import { cwd, from, verify, comparePayloads, ScannerLoggerEvents } from "./types/api.js"; -import { depWalker } from "./types/walker.js"; -import { Logger, LoggerEventData } from "./types/logger.js"; - -export { - cwd, from, verify, comparePayloads, ScannerLoggerEvents, - Scanner, - Logger, - LoggerEventData, - depWalker -}; diff --git a/index.js b/index.js deleted file mode 100644 index 05d86ac..0000000 --- a/index.js +++ /dev/null @@ -1,75 +0,0 @@ -// Import Node.js Dependencies -import path from "path"; -import fs from "fs/promises"; -import timers from "timers/promises"; -import os from "os"; - -// Import Third-party Dependencies -import pacote from "pacote"; -import { getLocalRegistryURL } from "@nodesecure/npm-registry-sdk"; -import * as tarball from "@nodesecure/tarball"; - -// Import Internal Dependencies -import { depWalker } from "./src/depWalker.js"; -import { NPM_TOKEN } from "./src/utils/index.js"; -import { ScannerLoggerEvents } from "./src/constants.js"; -import Logger from "./src/class/logger.class.js"; -import { comparePayloads } from "./src/comparePayloads.js"; - -// CONSTANTS -const kDefaultCwdOptions = { forceRootAnalysis: true, usePackageLock: true, includeDevDeps: false }; - -export async function cwd(location = process.cwd(), options = {}, logger = new Logger()) { - const registry = options.registry ? new URL(options.registry).toString() : getLocalRegistryURL(); - - const finalizedOptions = Object.assign( - { location }, - kDefaultCwdOptions, - { - ...options, - registry - } - ); - - logger.start(ScannerLoggerEvents.manifest.read); - const packagePath = path.join(location, "package.json"); - const str = await fs.readFile(packagePath, "utf-8"); - logger.end(ScannerLoggerEvents.manifest.read); - - return depWalker(JSON.parse(str), finalizedOptions, logger); -} - -export async function from(packageName, options = {}, logger = new Logger()) { - const registry = options.registry ? new URL(options.registry).toString() : getLocalRegistryURL(); - - logger.start(ScannerLoggerEvents.manifest.fetch); - const manifest = await pacote.manifest(packageName, { - ...NPM_TOKEN, registry, cache: `${os.homedir()}/.npm` - }); - logger.end(ScannerLoggerEvents.manifest.fetch); - - return depWalker(manifest, Object.assign(options, { registry }), logger); -} - -export async function verify(packageName = null) { - if (typeof packageName === "undefined" || packageName === null) { - return await tarball.scanPackage(process.cwd()); - } - - const tmpLocation = await fs.mkdtemp(path.join(os.tmpdir(), "/")); - const dest = path.join(tmpLocation, packageName); - - try { - await pacote.extract(packageName, dest, { - ...NPM_TOKEN, registry: getLocalRegistryURL(), cache: `${os.homedir()}/.npm` - }); - - return await tarball.scanPackage(dest, packageName); - } - finally { - await timers.setImmediate(); - await fs.rm(tmpLocation, { recursive: true, force: true }); - } -} - -export { depWalker, comparePayloads, tarball, Logger, ScannerLoggerEvents }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1723403 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8223 @@ +{ + "name": "@nodesecure/scanner", + "version": "5.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@nodesecure/scanner", + "version": "5.3.0", + "license": "MIT", + "workspaces": [ + "workspaces/scanner", + "workspaces/tarball", + "workspaces/tree-walker" + ], + "devDependencies": { + "@nodesecure/eslint-config": "^1.9.0", + "@slimio/is": "^2.0.0", + "@types/node": "^20.10.0", + "@types/pacote": "^11.1.8", + "@types/sinon": "^17.0.3", + "c8": "^9.1.0", + "eslint": "8.57.0", + "glob": "^10.3.10", + "pkg-ok": "^3.0.0", + "sinon": "^17.0.1", + "tsup": "^8.1.0", + "tsx": "^4.7.1", + "typescript": "^5.5.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@myunisoft/httpie": { + "version": "1.11.0", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "lru-cache": "^8.0.4", + "statuses": "^2.0.1", + "undici": "^5.21.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@myunisoft/httpie/node_modules/lru-cache": { + "version": "8.0.5", + "license": "ISC", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodesecure/authors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "@myunisoft/httpie": "^1.10.0", + "@nodesecure/domain-check": "^1.0.1" + } + }, + "node_modules/@nodesecure/domain-check": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/@nodesecure/eslint-config": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/eslint-parser": "^7.23.3", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", + "eslint": "^8.55.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nodesecure/estree-ast-utils": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@nodesecure/sec-literal": "^1.1.0" + } + }, + "node_modules/@nodesecure/flags": { + "version": "2.4.0", + "license": "MIT" + }, + "node_modules/@nodesecure/fs-walk": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nodesecure/i18n": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "cacache": "^18.0.0", + "deepmerge": "^4.3.1", + "lodash.get": "^4.4.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodesecure/js-x-ray": { + "version": "6.3.0", + "license": "MIT", + "workspaces": [ + "workspaces/estree-ast-utils", + "workspaces/sec-literal" + ], + "dependencies": { + "@nodesecure/estree-ast-utils": "^1.3.1", + "@nodesecure/sec-literal": "^1.2.0", + "estree-walker": "^3.0.1", + "is-minified-code": "^2.0.0", + "meriyah": "^4.3.3", + "safe-regex": "^2.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nodesecure/licenses-conformance": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.16", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodesecure/licenses-conformance/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/@nodesecure/npm-registry-sdk": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "@myunisoft/httpie": "^3.0.0", + "@npm/types": "^1.0.2" + } + }, + "node_modules/@nodesecure/npm-registry-sdk/node_modules/@myunisoft/httpie": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodesecure/npm-registry-sdk/node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@nodesecure/npm-registry-sdk/node_modules/undici": { + "version": "6.9.0", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@nodesecure/ntlp": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@nodesecure/licenses-conformance": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nodesecure/scanner": { + "resolved": "workspaces/scanner", + "link": true + }, + "node_modules/@nodesecure/sec-literal": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "frequency-set": "^1.0.2", + "is-base64": "^1.1.0", + "is-svg": "^4.3.2", + "string-width": "^5.1.2" + } + }, + "node_modules/@nodesecure/tarball": { + "resolved": "workspaces/tarball", + "link": true + }, + "node_modules/@nodesecure/tree-walker": { + "resolved": "workspaces/tree-walker", + "link": true + }, + "node_modules/@nodesecure/utils": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nodesecure/vuln": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "@myunisoft/httpie": "^1.6.0", + "@nodesecure/npm-registry-sdk": "^1.3.0", + "@npmcli/arborist": "^5.1.1", + "@slimio/github": "^1.0.0", + "semver": "^7.3.7" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@nodesecure/npm-registry-sdk": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "@myunisoft/httpie": "^1.11.0", + "@npm/types": "^1.0.2" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/fs": { + "version": "2.1.2", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/git": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/query": { + "version": "1.2.0", + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/@nodesecure/vuln/node_modules/are-we-there-yet": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/bin-links": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/cacache": { + "version": "16.1.3", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/cmd-shim": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/@nodesecure/vuln/node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodesecure/vuln/node_modules/gauge": { + "version": "4.0.4", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nodesecure/vuln/node_modules/hosted-git-info": { + "version": "5.2.1", + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/ignore-walk": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/@nodesecure/vuln/node_modules/lru-cache": { + "version": "7.14.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@nodesecure/vuln/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nodesecure/vuln/node_modules/nopt": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/normalize-package-data": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-bundled": { + "version": "1.1.2", + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-install-checks": { + "version": "5.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/@nodesecure/vuln/node_modules/npm-package-arg": { + "version": "9.1.2", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-packlist": { + "version": "5.1.3", + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-packlist/node_modules/npm-bundled": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/npmlog": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/pacote": { + "version": "13.6.2", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/parse-conflict-json": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/proc-log": { + "version": "2.0.1", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/read-cmd-shim": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/read-package-json": { + "version": "5.0.2", + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/read-package-json-fast": { + "version": "2.0.3", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nodesecure/vuln/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodesecure/vuln/node_modules/ssri": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nodesecure/vuln/node_modules/treeverse": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/unique-filename": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/unique-slug": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodesecure/vuln/node_modules/write-file-atomic": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@nodesecure/vuln/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/@npm/types": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/@npmcli/agent": { + "version": "2.2.0", + "license": "ISC", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.2", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.1.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/arborist": { + "version": "7.5.1", + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.4", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "pacote": "^18.0.1", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "version": "9.0.4", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/arborist/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/arborist/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@npmcli/arborist/node_modules/node-gyp": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/npm-registry-fetch": { + "version": "17.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.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": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/pacote": { + "version": "18.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/promise-call-limit": { + "version": "3.0.1", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/arborist/node_modules/walk-up-path": { + "version": "3.0.1", + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.3", + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.1.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/node-gyp": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/npm-registry-fetch": { + "version": "17.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.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": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { + "version": "18.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.1.0", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { + "version": "6.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.0", + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.2", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/make-fetch-happen": { + "version": "13.0.0", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/run-script/node_modules/minipass-fetch": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@npmcli/run-script/node_modules/node-gyp": { + "version": "10.0.1", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@openally/result": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=16.9.x" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.1", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.2", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@slimio/github": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@myunisoft/httpie": "^1.0.0", + "@slimio/is": "^1.5.0", + "tar-fs": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@slimio/github/node_modules/@slimio/is": { + "version": "1.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@slimio/is": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@slimio/lock": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.4", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/cacache": { + "version": "17.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash.difference": { + "version": "4.5.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/npm-package-arg": { + "version": "6.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/npm-registry-fetch": { + "version": "8.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/node-fetch": "*", + "@types/npm-package-arg": "*", + "@types/npmlog": "*", + "@types/ssri": "*" + } + }, + "node_modules/@types/npmcli__arborist": { + "version": "5.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@npm/types": "*", + "@types/cacache": "*", + "@types/node": "*", + "@types/npmcli__package-json": "*", + "@types/pacote": "*" + } + }, + "node_modules/@types/npmcli__package-json": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/npmlog": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pacote": { + "version": "11.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/npm-registry-fetch": "*", + "@types/npmlog": "*", + "@types/ssri": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sinon": { + "version": "17.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ssri": { + "version": "7.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bin-links": { + "version": "4.0.3", + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/builtins": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bundle-require": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" + } + }, + "node_modules/c8": { + "version": "9.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "18.0.0", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.1.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001638", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.2", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combine-async-iterators": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/decamelize": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.812", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "4.3.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/frequency-set": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/gar": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-folder-size": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "gar": "^1.0.4" + }, + "bin": { + "get-folder-size": "bin/get-folder-size.js" + }, + "engines": { + "node": ">=14.13.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "7.0.3", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.1.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ip": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-base64": { + "version": "1.1.0", + "license": "MIT", + "bin": { + "is_base64": "bin/is-base64", + "is-base64": "bin/is-base64" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/is-minified-code": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-svg": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "fast-xml-parser": "^4.1.3" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/itertools": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/just-diff": { + "version": "5.2.0", + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "license": "MIT" + }, + "node_modules/just-extend": { + "version": "4.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.14.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meriyah": { + "version": "4.3.9", + "license": "ISC", + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nise": { + "version": "5.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/node-gyp": { + "version": "9.3.1", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-newline": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "replace-buffer": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.2", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.0", + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "license": "ISC", + "dependencies": { + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "13.0.0", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "17.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/pacote/node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parse-conflict-json/node_modules/just-diff": { + "version": "6.0.2", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.3", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-ok": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "meow": "^10.0.0", + "normalize-newline": "^4.0.0" + }, + "bin": { + "pkg-ok": "dist/bin.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-ok/node_modules/chalk": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/proggy": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "1.0.2", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "6.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/replace-buffer": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "4.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "7.6.0", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sigstore": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/sign": "^2.3.0", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/sinon": { + "version": "17.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.5", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "10.0.5", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeverse": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/trim-newlines": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsup": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.21.4", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.0.2", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsup/node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tuf-js": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/tuf-js/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "5.28.0", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/walk-up-path": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.4.5", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "workspaces/scanner": { + "name": "@nodesecure/scanner", + "version": "5.3.0", + "license": "MIT", + "dependencies": { + "@nodesecure/authors": "^1.0.2", + "@nodesecure/flags": "^2.4.0", + "@nodesecure/i18n": "^4.0.1", + "@nodesecure/js-x-ray": "^6.3.0", + "@nodesecure/npm-registry-sdk": "^2.1.1", + "@nodesecure/ntlp": "^3.0.0", + "@nodesecure/utils": "^2.2.0", + "@nodesecure/vuln": "^1.7.0", + "@npm/types": "^1.0.2", + "@slimio/lock": "^1.0.0", + "pacote": "^17.0.4", + "semver": "^7.5.4" + }, + "devDependencies": { + "@types/pacote": "^11.1.8" + }, + "engines": { + "node": ">=18" + } + }, + "workspaces/tarball": { + "name": "@nodesecure/tarball", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodesecure/fs-walk": "^2.0.0", + "@nodesecure/js-x-ray": "^6.3.0", + "@nodesecure/ntlp": "^3.0.0", + "@nodesecure/utils": "^2.1.0", + "@npm/types": "^1.0.2", + "@slimio/lock": "^1.0.0", + "builtins": "^5.1.0", + "lodash.difference": "^4.5.0", + "pacote": "^18.0.6" + }, + "devDependencies": { + "@types/lodash.difference": "^4.5.9", + "get-folder-size": "^4.0.0" + } + }, + "workspaces/tarball/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "workspaces/tarball/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "workspaces/tarball/node_modules/node-gyp": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/npm-registry-fetch": { + "version": "17.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.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": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/pacote": { + "version": "18.0.6", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tarball/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "workspaces/tree-walker": { + "name": "@nodesecure/tree-walker", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodesecure/npm-registry-sdk": "^2.1.1", + "@npmcli/arborist": "^7.5.1", + "combine-async-iterators": "^3.0.0", + "itertools": "^2.3.1", + "pacote": "^18.0.4", + "semver": "^7.6.0" + }, + "devDependencies": { + "@types/npmcli__arborist": "^5.6.9" + } + }, + "workspaces/tree-walker/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/minipass": { + "version": "7.1.0", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "workspaces/tree-walker/node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "workspaces/tree-walker/node_modules/node-gyp": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/npm-registry-fetch": { + "version": "17.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.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": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/pacote": { + "version": "18.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "workspaces/tree-walker/node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + } + } +} diff --git a/package.json b/package.json index 8b3508a..0edda7f 100644 --- a/package.json +++ b/package.json @@ -2,91 +2,31 @@ "name": "@nodesecure/scanner", "version": "5.3.0", "description": "A package API to run a static analysis of your module's dependencies.", - "exports": "./index.js", - "engines": { - "node": ">=18" - }, "type": "module", "workspaces": [ + "workspaces/scanner", "workspaces/tarball", "workspaces/tree-walker" ], "scripts": { "build": "tsc -b", - "lint": "eslint src test", - "prepublishOnly": "pkg-ok", - "test": "npm run lint && npm run test-only", - "test:ci": "node --test test/**.spec.js test/**/*.spec.js", - "test-only": "glob -c \"node --test-reporter=spec --test\" \"./test/**/*.spec.js\"", - "coverage": "c8 -r html npm run test-only" - }, - "files": [ - "src", - "i18n", - "types", - "index.js", - "index.d.ts" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/NodeSecure/scanner.git" + "test": "npm run test --ws --if-present" }, - "keywords": [ - "node", - "nodejs", - "security", - "cli", - "sast", - "scanner", - "static", - "code", - "analysis", - "node_modules", - "tree", - "npm", - "registry", - "graph", - "visualization", - "dependencies" - ], "author": "NodeSecure", "license": "MIT", - "bugs": { - "url": "https://github.com/NodeSecure/scanner/issues" - }, - "homepage": "https://github.com/NodeSecure/scanner#readme", "devDependencies": { - "@nodesecure/eslint-config": "^1.8.0", + "@nodesecure/eslint-config": "^1.9.0", "@slimio/is": "^2.0.0", "@types/node": "^20.10.0", "@types/pacote": "^11.1.8", "@types/sinon": "^17.0.3", "c8": "^9.1.0", - "dotenv": "^16.3.1", "eslint": "8.57.0", - "get-folder-size": "^4.0.0", "glob": "^10.3.10", "pkg-ok": "^3.0.0", "sinon": "^17.0.1", - "snap-shot-core": "^10.2.4", + "tsup": "^8.1.0", "tsx": "^4.7.1", - "typescript": "^5.4.2" - }, - "dependencies": { - "@nodesecure/authors": "^1.0.2", - "@nodesecure/flags": "^2.4.0", - "@nodesecure/fs-walk": "^2.0.0", - "@nodesecure/i18n": "^4.0.0", - "@nodesecure/js-x-ray": "^6.3.0", - "@nodesecure/npm-registry-sdk": "^2.1.1", - "@nodesecure/ntlp": "^3.0.0", - "@nodesecure/utils": "^2.0.1", - "@nodesecure/vuln": "^1.7.0", - "@npm/types": "^1.0.2", - "@slimio/lock": "^1.0.0", - "builtins": "^5.0.1", - "lodash.difference": "^4.5.0", - "pacote": "^17.0.4", - "semver": "^7.5.4" + "typescript": "^5.5.2" } } diff --git a/src/constants.js b/src/constants.js deleted file mode 100644 index 0f47e90..0000000 --- a/src/constants.js +++ /dev/null @@ -1,13 +0,0 @@ - -export const ScannerLoggerEvents = { - done: "depWalkerFinished", - analysis: { - tree: "walkTree", - tarball: "tarball", - registry: "registry" - }, - manifest: { - read: "readManifest", - fetch: "fetchManifest" - } -}; diff --git a/tsconfig.json b/tsconfig.json index 48ab542..01f5773 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,9 @@ }, { "path": "./workspaces/tree-walker" - } + }, + { + "path": "./workspaces/scanner" + }, ] } diff --git a/types/api.d.ts b/types/api.d.ts deleted file mode 100644 index 7d18400..0000000 --- a/types/api.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Scanner, { Payload, PayloadComparison } from "./scanner.js"; -import { Logger, LoggerEvents } from "./logger.js"; - -export { - cwd, - from, - verify, - comparePayloads, - ScannerLoggerEvents, -} -declare const ScannerLoggerEvents: LoggerEvents; - -declare function cwd(location: string, options?: Scanner.Options, logger?: Logger): Promise; -declare function from(packageName: string, options?: Omit, logger?: Logger): Promise; -declare function verify(packageName?: string | null): Promise; -declare function comparePayloads(original: Payload, toCompare: Payload): PayloadComparison diff --git a/types/logger.d.ts b/types/logger.d.ts deleted file mode 100644 index 7858036..0000000 --- a/types/logger.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { EventEmitter } from "events"; - -export { - Logger, - LoggerEventData, - LoggerEvents -} - -interface LoggerEvents { - readonly done: "depWalkerFinished"; - readonly analysis: { - readonly tree: "walkTree"; - readonly tarball: "tarball"; - readonly registry: "registry"; - }; - readonly manifest: { - readonly read: "readManifest"; - readonly fetch: "fetchManifest"; - }; -} - -interface LoggerEventData { - /** UNIX Timestamp */ - startedAt: number; - /** Count of triggered event */ - count: number; -} - -declare class Logger extends EventEmitter { - public events: Map; - - constructor(); - - start(eventName: string): Logger; - end(eventName: string): Logger; - tick(eventName: string): Logger; - count(eventName: string): number; -} diff --git a/types/scanner.d.ts b/types/scanner.d.ts deleted file mode 100644 index 8b812e1..0000000 --- a/types/scanner.d.ts +++ /dev/null @@ -1,325 +0,0 @@ -// Import NodeSecure Dependencies -import * as JSXRay from "@nodesecure/js-x-ray"; -import type { SpdxLicenseConformance } from "@nodesecure/ntlp"; -import * as Vuln from "@nodesecure/vuln"; - -// Import Third-party Dependencies -import { extractedAuthor } from "@nodesecure/authors"; - -export = Scanner; - -declare namespace Scanner { - export interface Author { - name: string; - email?: string; - url?: string; - npmAvatar?: string; - } - - export interface Maintainer { - name: string; - email: string; - npmAvatar?: string; - } - - export interface Publisher { - /** - * Publisher npm user name. - */ - name: string; - /** - * Publisher npm user email. - */ - email: string; - /** - * First version published. - */ - version: string; - /** - * Date of the first publication - * @example 2021-08-10T20:45:08.342Z - */ - at: string; - /** - * Path to publisher's avatar on "https://www.npmjs.com" - * @example /npm-avatar/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.LwimMJA3puF3ioGeS-tfczR3370GXBZMIL-bdpu4hOU - */ - npmAvatar?: string; - } - - export interface DependencyLinks { - /** NPM Registry page */ - npm: string; - /** Homepage URL */ - homepage?: string; - /** VCS repository URL */ - repository?: string; - } - - export interface Engines { - node?: string; - npm?: string; - } - - export interface Repository { - type: string; - url: string; - } - - export interface DependencyVersion { - /** Id of the package (useful for usedBy relation) */ - id: number; - isDevDependency: boolean; - /** - * Tell if the given package exist on the configured remote registry (npm by default) - * @default true - */ - existOnRemoteRegistry: boolean; - /** By whom (id) is used the package */ - usedBy: Record; - /** Size on disk of the extracted tarball (in bytes) */ - size: number; - /** Package description */ - description: string; - /** Author of the package. This information is not trustable and can be empty. */ - author: Author | null; - engines: Engines; - repository: Repository; - scripts: Record; - /** - * JS-X-Ray warnings - * - * @see https://github.com/NodeSecure/js-x-ray/blob/master/WARNINGS.md - */ - warnings: JSXRay.Warning[]; - /** Tarball composition (files and dependencies) */ - composition: { - /** Files extensions (.js, .md, .exe etc..) */ - extensions: string[]; - files: string[]; - /** Minified files (foo.min.js etc..) */ - minified: string[]; - alias: Record; - required_files: string[]; - required_thirdparty: string[]; - required_nodejs: string[]; - required_subpath: string[]; - unused: string[]; - missing: string[]; - }; - /** - * Package licenses with SPDX expression. - * - * @see https://github.com/NodeSecure/licenses-conformance - * @see https://github.com/NodeSecure/npm-tarball-license-parser - */ - license: SpdxLicenseConformance[]; - /** - * Flags (Array of string) - * - * @see https://github.com/NodeSecure/flags/blob/main/FLAGS.md - */ - flags: string[]; - /** - * If the dependency is a GIT repository - */ - gitUrl: null | string; - /** - * Version MD5 integrity hash - * Generated by the scanner to verify manifest/tarball confusion - * - * (Not supported on GIT dependency) - */ - integrity?: string; - links: DependencyLinks; - } - - export interface Dependency { - /** NPM Registry metadata */ - metadata: { - /** Count of dependencies */ - dependencyCount: number; - /** Number of releases published on npm */ - publishedCount: number; - lastUpdateAt: number; - /** Last version SemVer */ - lastVersion: number; - hasChangedAuthor: boolean; - hasManyPublishers: boolean; - hasReceivedUpdateInOneYear: boolean; - /** Author of the package. This information is not trustable and can be empty. */ - author: Author | null; - /** Package home page */ - homepage: string | null; - /** - * List of maintainers (list of people in the organization related to the package) - */ - maintainers: Maintainer[]; - /** - * List of people who published this package - */ - publishers: Publisher[]; - /** - * Version MD5 integrity hash - * Generated by the scanner to verify manifest/tarball confusion - */ - integrity: Record; - } - /** List of versions of this package available in the dependency tree (In the payload) */ - versions: Record; - /** - * Vulnerabilities fetched dependending on the selected vulnerabilityStrategy - * - * @see https://github.com/NodeSecure/vuln - */ - vulnerabilities: Vuln.Strategy.StandardVulnerability[]; - } - - export type GlobalWarning = string[]; - export type FlaggedAuthors = extractedAuthor[]; - export type Dependencies = Record; - - export interface Payload { - /** Payload unique id */ - id: string; - /** Name of the analyzed package */ - rootDependencyName: string; - /** Global warnings list */ - warnings: GlobalWarning[]; - /** List of flagged authors */ - flaggedAuthors: FlaggedAuthors[]; - /** All the dependencies of the package (flattened) */ - dependencies: Dependencies; - /** Version of the scanner used to generate the result */ - scannerVersion: string; - /** Vulnerability strategy name (npm, snyk, node) */ - vulnerabilityStrategy: Vuln.Strategy.Kind; - } - - export interface VerifyPayload { - files: { - list: string[]; - extensions: string[]; - minified: string[]; - }; - directorySize: number; - uniqueLicenseIds: string[]; - licenses: SpdxLicenseConformance[]; - ast: { - dependencies: Record; - warnings: JSXRay.Warning[]; - }; - } - - export interface Options { - /** - * Maximum tree depth - * - * @default 4 - */ - readonly maxDepth?: number; - readonly registry?: string | URL; - /** - * Use root package-lock.json. This will have the effect of triggering the Arborist package. - * - * @default false for from() API - * @default true for cwd() API - */ - readonly usePackageLock?: boolean; - /** - * Include project devDependencies (only available for cwd command) - * - * @default false - */ - readonly includeDevDeps?: boolean; - /** - * Vulnerability strategy name (npm, snyk, node) - * - * @default NONE - */ - readonly vulnerabilityStrategy: Vuln.Strategy.Kind; - /** - * Analyze root package. - * - * @default false for from() API - * @default true for cwd() API - */ - readonly forceRootAnalysis?: boolean; - /** - * Deeper dependencies analysis with cwd() API. - * - * @default false - */ - readonly fullLockMode?: boolean; - } - - export interface PayloadComparison { - title: string; - flaggedAuthors: ArrayDiff; - warnings: ArrayDiff; - scannerVersionComparison: ValueComparison; - vulnerabilityStrategyComparison: ValueComparison; - dependencies: DependenciesComparison; - } - - export interface DependenciesComparison { - compared: Map; - added: Map; - removed: Map; - } - - export interface DependencyComparison { - publishers: ArrayDiff; - maintainers: ArrayDiff; - versions: VersionsComparisonResult; - vulnerabilities: ArrayDiff; - } - - export interface VersionsComparisonResult { - compared: Map; - added: Map; - remove?: Map; - } - - export interface DependencyVersionComparison { - id: ValueComparison; - size: ValueComparison; - usedBy: DictionaryComparison>; - devDependency: ValueComparison; - existOnRemoteRegistry: ValueComparison; - description: ValueComparison; - author: ValueComparison; - engines: DictionaryComparison; - repository: ValueComparison; - scripts: DictionaryComparison>; - warnings: ArrayDiff; - composition: CompositionComparison; - licenseIds: ArrayDiff; - flags: ArrayDiff; - links: ValueComparison; - } - - export interface DictionaryComparison { - compared: Map; - added: Map; - removed: Map; - } - - export interface CompositionComparison { - minified: ArrayDiff; - required_thirdparty: ArrayDiff; - required_nodejs: ArrayDiff; - unused: ArrayDiff; - missing: ArrayDiff; - } - - type ValueComparison = { - prev: T; - now: T; - } | undefined - - export interface ArrayDiff { - added: T[]; - removed: T[]; - } -} diff --git a/types/walker.d.ts b/types/walker.d.ts deleted file mode 100644 index 2d503d9..0000000 --- a/types/walker.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Manifest } from "@npm/types"; -import Scanner from "./scanner.js"; - -export { - depWalker -} - -declare function depWalker(manifest: Manifest, options?: Scanner.Options): Promise; diff --git a/workspaces/scanner/README.md b/workspaces/scanner/README.md new file mode 100644 index 0000000..402ec4d --- /dev/null +++ b/workspaces/scanner/README.md @@ -0,0 +1 @@ +TBC diff --git a/workspaces/scanner/package.json b/workspaces/scanner/package.json new file mode 100644 index 0000000..e7f50fe --- /dev/null +++ b/workspaces/scanner/package.json @@ -0,0 +1,68 @@ +{ + "name": "@nodesecure/scanner", + "version": "5.3.0", + "description": "A package API to run a static analysis of your module's dependencies.", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": "./dist/index.js", + "engines": { + "node": ">=18" + }, + "type": "module", + "scripts": { + "build": "tsc -b", + "lint": "eslint src test", + "prepublishOnly": "npm run build && pkg-ok", + "test": "npm run test-only", + "test-only": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", + "coverage": "c8 -r html npm run test-only" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/NodeSecure/scanner.git" + }, + "keywords": [ + "node", + "nodejs", + "security", + "cli", + "sast", + "scanner", + "static", + "code", + "analysis", + "node_modules", + "tree", + "npm", + "registry", + "graph", + "visualization", + "dependencies" + ], + "author": "NodeSecure", + "license": "MIT", + "bugs": { + "url": "https://github.com/NodeSecure/scanner/issues" + }, + "homepage": "https://github.com/NodeSecure/scanner#readme", + "devDependencies": { + "@types/pacote": "^11.1.8" + }, + "dependencies": { + "@nodesecure/authors": "^1.0.2", + "@nodesecure/flags": "^2.4.0", + "@nodesecure/i18n": "^4.0.1", + "@nodesecure/js-x-ray": "^6.3.0", + "@nodesecure/npm-registry-sdk": "^2.1.1", + "@nodesecure/ntlp": "^3.0.0", + "@nodesecure/utils": "^2.2.0", + "@nodesecure/vuln": "^1.7.0", + "@npm/types": "^1.0.2", + "@slimio/lock": "^1.0.0", + "pacote": "^17.0.4", + "semver": "^7.5.4" + } +} diff --git a/src/class/logger.class.js b/workspaces/scanner/src/class/logger.class.ts similarity index 50% rename from src/class/logger.class.js rename to workspaces/scanner/src/class/logger.class.ts index f0f9f28..6af8959 100644 --- a/src/class/logger.class.js +++ b/workspaces/scanner/src/class/logger.class.ts @@ -2,14 +2,30 @@ import { EventEmitter } from "node:events"; import { performance } from "node:perf_hooks"; -export default class Logger extends EventEmitter { - constructor() { - super(); - - this.events = new Map(); +export const ScannerLoggerEvents = { + done: "depWalkerFinished", + analysis: { + tree: "walkTree", + tarball: "tarball", + registry: "registry" + }, + manifest: { + read: "readManifest", + fetch: "fetchManifest" } +} as const; + +export interface LoggerEventData { + /** UNIX Timestamp */ + startedAt: number; + /** Count of triggered event */ + count: number; +} + +export class Logger extends EventEmitter { + public events: Map = new Map(); - start(eventName) { + start(eventName: string): this { if (this.events.has(eventName)) { return this; } @@ -23,27 +39,27 @@ export default class Logger extends EventEmitter { return this; } - tick(eventName) { + tick(eventName: string): this { if (!this.events.has(eventName)) { return this; } - this.events.get(eventName).count++; + this.events.get(eventName)!.count++; this.emit("tick", eventName); return this; } - count(eventName) { + count(eventName: string): number { return this.events.get(eventName)?.count ?? 0; } - end(eventName) { + end(eventName: string): this { if (!this.events.has(eventName)) { return this; } - const data = this.events.get(eventName); + const data = this.events.get(eventName)!; this.emit("end", eventName, { ...data, executionTime: performance.now() - data.startedAt diff --git a/src/comparePayloads.js b/workspaces/scanner/src/comparePayloads.ts similarity index 53% rename from src/comparePayloads.js rename to workspaces/scanner/src/comparePayloads.ts index 9c56361..786cac5 100644 --- a/src/comparePayloads.js +++ b/workspaces/scanner/src/comparePayloads.ts @@ -1,4 +1,97 @@ -export function comparePayloads(payload, comparedPayload) { +// Import Third-party Dependencies +import * as JSXRay from "@nodesecure/js-x-ray"; +import type { SpdxLicenseConformance } from "@nodesecure/ntlp"; +import * as Vuln from "@nodesecure/vuln"; +import type { extractedAuthor } from "@nodesecure/authors"; + +// Import Internal Dependencies +import type { + Payload, + Dependencies, + Dependency, + DependencyVersion, + Author, + Publisher, + Maintainer, + Engines, + Repository, + DependencyLinks +} from "./types.js"; + +export interface PayloadComparison { + title: string; + flaggedAuthors: ArrayDiff; + warnings: ArrayDiff; + scannerVersion: ValueComparison; + vulnerabilityStrategy: ValueComparison; + dependencies: DependenciesComparison; +} + +export interface DependenciesComparison { + compared: Map; + added: Map; + removed: Map; +} + +export interface DependencyComparison { + publishers: ArrayDiff; + maintainers: ArrayDiff; + versions: VersionsComparisonResult; + vulnerabilities: ArrayDiff; +} + +export interface VersionsComparisonResult { + compared: Map; + added: Map; + removed: Map; +} + +export interface DependencyVersionComparison { + id: ValueComparison; + size: ValueComparison; + usedBy: DictionaryComparison>; + devDependency: ValueComparison; + existOnRemoteRegistry: ValueComparison; + description: ValueComparison; + author: ValueComparison; + engines: DictionaryComparison>; + repository: ValueComparison; + scripts: DictionaryComparison>; + warnings: ArrayDiff; + composition: CompositionComparison; + licenseIds: ArrayDiff; + flags: ArrayDiff; + links: ValueComparison; +} + +export interface DictionaryComparison { + compared: Map; + added: Map; + removed: Map; +} + +export interface CompositionComparison { + minified: ArrayDiff; + required_thirdparty: ArrayDiff; + required_nodejs: ArrayDiff; + unused: ArrayDiff; + missing: ArrayDiff; +} + +export type ValueComparison = { + prev: T; + now: T; +} | undefined; + +export interface ArrayDiff { + added: T[]; + removed: T[]; +} + +export function comparePayloads( + payload: Payload, + comparedPayload: Payload +): PayloadComparison { if (payload.id === comparedPayload.id) { throw new Error( `You try to compare two payloads with the same id '${payload.id}'` @@ -13,15 +106,34 @@ export function comparePayloads(payload, comparedPayload) { return { title: `'${payload.rootDependencyName}' -> '${comparedPayload.rootDependencyName}'`, - flaggedAuthors: arrayOfObjectsDiffByKey("name", payload.flaggedAuthors, comparedPayload.flaggedAuthors), - warnings: arrayDiff(payload.warnings, comparedPayload.warnings), - scannerVersion: compareValues(payload.scannerVersion, comparedPayload.scannerVersion), - vulnerabilityStrategy: compareValues(payload.vulnerabilityStrategy, comparedPayload.vulnerabilityStrategy), - dependencies: compareDependencies(payload.dependencies, comparedPayload.dependencies) + flaggedAuthors: arrayOfObjectsDiffByKey( + "name", + payload.flaggedAuthors, + comparedPayload.flaggedAuthors + ), + warnings: arrayDiff( + payload.warnings, + comparedPayload.warnings + ), + scannerVersion: compareValues( + payload.scannerVersion, + comparedPayload.scannerVersion + ), + vulnerabilityStrategy: compareValues( + payload.vulnerabilityStrategy, + comparedPayload.vulnerabilityStrategy + ), + dependencies: compareDependencies( + payload.dependencies, + comparedPayload.dependencies + ) }; } -function compareDependencies(original, toCompare) { +function compareDependencies( + original: Dependencies, + toCompare: Dependencies +) { const { comparable, ...dependencies @@ -42,7 +154,10 @@ function compareDependencies(original, toCompare) { return { compared: comparedDependencies, ...dependencies }; } -function compareVersions(original, toCompare) { +function compareVersions( + original: Record, + toCompare: Record +): VersionsComparisonResult { const { comparable, ...versions } = dictionariesDiff(original, toCompare); const comparedVersions = new Map(); @@ -75,7 +190,14 @@ function compareVersions(original, toCompare) { }; } -function compareComposition(original = {}, toCompare = {}) { +function compareComposition( + original: DependencyVersion["composition"], + toCompare: DependencyVersion["composition"] +): CompositionComparison | undefined { + if (!original || !toCompare) { + return undefined; + } + return { minified: arrayDiff(original.minified, toCompare.minified), required_thirdparty: arrayDiff(original.required_thirdparty, toCompare.required_thirdparty), @@ -85,7 +207,10 @@ function compareComposition(original = {}, toCompare = {}) { }; } -function compareDictionnaries(original, toCompare) { +function compareDictionnaries( + original: Record, + toCompare: Record +): DictionaryComparison { const { comparable, ...diff } = dictionariesDiff(original, toCompare); const compared = new Map(); @@ -99,7 +224,11 @@ function compareDictionnaries(original, toCompare) { }; } -function compareObjects(key, original = {}, toCompare = {}) { +function compareObjects( + key: string, + original: Record = {}, + toCompare: Record = {} +): ValueComparison> { if (original[key] === toCompare[key]) { return undefined; } @@ -110,7 +239,10 @@ function compareObjects(key, original = {}, toCompare = {}) { }; } -function compareValues(original, toCompare) { +function compareValues( + original: T, + toCompare: T +): ValueComparison { if (typeof original === "object") { if (JSON.stringify(original) === JSON.stringify(toCompare)) { return undefined; @@ -126,13 +258,16 @@ function compareValues(original, toCompare) { }; } -function dictionariesDiff(original = {}, toCompare = {}) { +function dictionariesDiff( + original: Record = {}, + toCompare: Record = {} +) { const added = new Map(); const removed = new Map(); const comparable = new Map(); Object.keys(original).forEach((key) => { - if (Object.hasOwn(toCompare, key)) { + if (key in toCompare) { comparable.set(key, [original[key], toCompare[key]]); } else { @@ -141,7 +276,7 @@ function dictionariesDiff(original = {}, toCompare = {}) { }); Object.keys(toCompare).forEach((key) => { - if (!Object.hasOwn(original, key)) { + if (!(key in original)) { added.set(key, toCompare[key]); } }); @@ -149,7 +284,10 @@ function dictionariesDiff(original = {}, toCompare = {}) { return { added, removed, comparable }; } -function arrayDiff(original = [], toCompare = []) { +function arrayDiff( + original: T[] = [], + toCompare: T[] = [] +): ArrayDiff { const added = toCompare.filter((v, i) => { if (typeof v !== "object") { return v !== original[i]; @@ -169,7 +307,11 @@ function arrayDiff(original = [], toCompare = []) { return { added, removed }; } -export function arrayOfObjectsDiffByKey(key, original = [], toCompare = []) { +export function arrayOfObjectsDiffByKey>( + key: string, + original: T[] = [], + toCompare: T[] = [] +): ArrayDiff { const toCompareMap = new Map(toCompare.map((item) => [item[key], item])); const originalMap = new Map(original.map((item) => [item[key], item])); diff --git a/src/depWalker.js b/workspaces/scanner/src/depWalker.ts similarity index 74% rename from src/depWalker.js rename to workspaces/scanner/src/depWalker.ts index 5117480..a1499d8 100644 --- a/src/depWalker.js +++ b/workspaces/scanner/src/depWalker.ts @@ -5,33 +5,38 @@ import timers from "node:timers/promises"; import os from "node:os"; // Import Third-party Dependencies -import Lock from "@slimio/lock"; -import * as vuln from "@nodesecure/vuln"; -import { ScannerLoggerEvents } from "./constants.js"; - -// Import Workspaces Dependencies +import Locker from "@slimio/lock"; import { scanDirOrArchive } from "@nodesecure/tarball"; +import * as vuln from "@nodesecure/vuln"; import * as treeWalker from "@nodesecure/tree-walker"; +import type { PackageJson } from "@npm/types"; +import pacote from "pacote"; // Import Internal Dependencies import { getDependenciesWarnings, addMissingVersionFlags } from "./utils/index.js"; import { packageMetadata, manifestMetadata } from "./npmRegistry.js"; -import Logger from "./class/logger.class.js"; +import { Logger, ScannerLoggerEvents } from "./class/logger.class.js"; +import type { DependencyVersion, Options, Payload } from "./types.js"; const { version: packageVersion } = JSON.parse( readFileSync( - new URL(path.join("..", "package.json"), import.meta.url) + new URL(path.join("..", "package.json"), import.meta.url), + "utf-8" ) ); -/** - * @param {*} manifest - * @param {*} options - * @param {Logger} logger - */ -export async function depWalker(manifest, options = {}, logger = new Logger()) { +type WalkerOptions = Omit & { + registry: string; + location?: string; +} + +export async function depWalker( + manifest: PackageJson | pacote.AbbreviatedManifest & pacote.ManifestResult, + options: WalkerOptions, + logger = new Logger() +): Promise { const { forceRootAnalysis = false, usePackageLock = false, @@ -46,7 +51,7 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { // Create TMP directory const tmpLocation = await fs.mkdtemp(path.join(os.tmpdir(), "/")); - const payload = { + const payload: Partial = { id: tmpLocation.slice(-6), rootDependencyName: manifest.name, scannerVersion: packageVersion, @@ -55,21 +60,23 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { }; // We are dealing with an exclude Map to avoid checking a package more than one time in searchDeepDependencies - const exclude = new Map(); - const dependencies = new Map(); + const exclude: Map> = new Map(); + const dependencies: Map = new Map(); { logger .start(ScannerLoggerEvents.analysis.tree) .start(ScannerLoggerEvents.analysis.tarball) .start(ScannerLoggerEvents.analysis.registry); - const fetchedMetadataPackages = new Set(); - const promisesToWait = []; + const fetchedMetadataPackages = new Set(); + const promisesToWait: Promise[] = []; - const tarballLocker = new Lock({ maxConcurrent: 5 }); + const tarballLocker = new Locker({ maxConcurrent: 5 }); tarballLocker.on("freeOne", () => logger.tick(ScannerLoggerEvents.analysis.tarball)); - const rootDepsOptions = { maxDepth, exclude, usePackageLock, fullLockMode, includeDevDeps, location, registry }; + const rootDepsOptions = { + maxDepth, exclude, usePackageLock, fullLockMode, includeDevDeps, location, registry + }; for await (const currentDep of treeWalker.npm.walk(manifest, rootDepsOptions)) { const { name, version, dev } = currentDep; @@ -77,10 +84,10 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { let proceedDependencyAnalysis = true; if (dependencies.has(name)) { - const dep = dependencies.get(name); + const dep = dependencies.get(name)!; promisesToWait.push(manifestMetadata(name, version, dep)); - const currVersion = Object.keys(current.versions)[0]; + const currVersion = Object.keys(current.versions)[0]!; if (currVersion in dep.versions) { // The dependency has already entered the analysis // This happens if the package is used by multiple packages in the tree @@ -103,23 +110,23 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { logger.tick(ScannerLoggerEvents.analysis.tree); // There is no need to fetch 'N' times the npm metadata for the same package. - if (fetchedMetadataPackages.has(name) || !current.versions[version].existOnRemoteRegistry) { + if (fetchedMetadataPackages.has(name) || !current.versions[version]!.existOnRemoteRegistry) { logger.tick(ScannerLoggerEvents.analysis.registry); } else { fetchedMetadataPackages.add(name); promisesToWait.push(packageMetadata(name, version, { - ref: current, + ref: current as any, logger })); } + // TODO: re-abstract and fix ref type promisesToWait.push(scanDirOrArchive(name, version, { - ref: current.versions[version], + ref: current.versions[version] as any, location, tmpLocation: forceRootAnalysis && name === manifest.name ? null : tmpLocation, locker: tarballLocker, - logger, registry })); } @@ -144,15 +151,15 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { // We do this because it "seem" impossible to link all dependencies in the first walk. // Because we are dealing with package only one time it may happen sometimes. - const globalWarnings = []; + const globalWarnings: string[] = []; for (const [packageName, dependency] of dependencies) { const metadataIntegrities = dependency.metadata?.integrity ?? {}; for (const [version, integrity] of Object.entries(metadataIntegrities)) { - const dependencyVer = dependency.versions[version]; + const dependencyVer = dependency.versions[version] as DependencyVersion; - const isEmptyPackage = dependencyVer.warnings - .some((warning) => warning.kind === "empty-package"); + // @ts-ignore + const isEmptyPackage = dependencyVer.warnings.some((warning) => warning.kind === "empty-package"); if (isEmptyPackage) { globalWarnings.push(`${packageName}@${version} only contain a package.json file!`); } @@ -165,7 +172,8 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { globalWarnings.push(`${packageName}@${version} manifest & tarball integrity doesn't match!`); } } - for (const [verStr, verDescriptor] of Object.entries(dependency.versions)) { + for (const version of Object.entries(dependency.versions)) { + const [verStr, verDescriptor] = version as [string, DependencyVersion]; verDescriptor.flags.push(...addMissingVersionFlags(new Set(verDescriptor.flags), dependency)); const usedDeps = exclude.get(`${packageName}@${verStr}`) || new Set(); @@ -174,7 +182,7 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { } const usedBy = Object.create(null); - for (const [name, version] of [...usedDeps].map((name) => name.split(" "))) { + for (const [name, version] of [...usedDeps].map((name) => name.split(" ") as [string, string])) { usedBy[name] = version; } Object.assign(verDescriptor.usedBy, usedBy); @@ -187,7 +195,7 @@ export async function depWalker(manifest, options = {}, logger = new Logger()) { payload.flaggedAuthors = flaggedAuthors; payload.dependencies = Object.fromEntries(dependencies); - return payload; + return payload as Payload; } finally { await timers.setImmediate(); diff --git a/i18n/english.js b/workspaces/scanner/src/i18n/english.js similarity index 100% rename from i18n/english.js rename to workspaces/scanner/src/i18n/english.js diff --git a/i18n/french.js b/workspaces/scanner/src/i18n/french.js similarity index 100% rename from i18n/french.js rename to workspaces/scanner/src/i18n/french.js diff --git a/workspaces/scanner/src/index.ts b/workspaces/scanner/src/index.ts new file mode 100644 index 0000000..01fd73d --- /dev/null +++ b/workspaces/scanner/src/index.ts @@ -0,0 +1,114 @@ +// Import Node.js Dependencies +import path from "node:path"; +import fs from "node:fs/promises"; +import timers from "node:timers/promises"; +import os from "node:os"; + +// Import Third-party Dependencies +import pacote from "pacote"; +import { getLocalRegistryURL } from "@nodesecure/npm-registry-sdk"; +import * as tarball from "@nodesecure/tarball"; +import type { PackageJson } from "@npm/types"; + +// Import Internal Dependencies +import { depWalker } from "./depWalker.js"; +import { NPM_TOKEN, urlToString } from "./utils/index.js"; +import { Logger, ScannerLoggerEvents } from "./class/logger.class.js"; +import { comparePayloads } from "./comparePayloads.js"; +import type { Options } from "./types.js"; + +// CONSTANTS +const kDefaultCwdOptions = { + forceRootAnalysis: true, + usePackageLock: true, + includeDevDeps: false +}; + +export * from "./types.js"; + +export async function cwd( + location = process.cwd(), + options: Options = {}, + logger = new Logger() +) { + const registry = options.registry ? + urlToString(options.registry) : + getLocalRegistryURL(); + + const finalizedOptions = Object.assign( + { location }, + kDefaultCwdOptions, + { + ...options, + registry + } + ); + + logger.start(ScannerLoggerEvents.manifest.read); + const packagePath = path.join(location, "package.json"); + const str = await fs.readFile(packagePath, "utf-8"); + logger.end(ScannerLoggerEvents.manifest.read); + + return depWalker( + JSON.parse(str) as PackageJson, + finalizedOptions, + logger + ); +} + +export async function from( + packageName: string, + options: Omit = {}, + logger = new Logger() +) { + const registry = options.registry ? + urlToString(options.registry) : + getLocalRegistryURL(); + + logger.start(ScannerLoggerEvents.manifest.fetch); + const manifest = await pacote.manifest(packageName, { + ...NPM_TOKEN, registry, cache: `${os.homedir()}/.npm` + }); + logger.end(ScannerLoggerEvents.manifest.fetch); + + return depWalker( + manifest, + Object.assign(options, { registry }), + logger + ); +} + +export async function verify( + packageName?: string +): Promise { + if (typeof packageName === "undefined") { + return tarball.scanPackage(process.cwd()); + } + + const tmpLocation = await fs.mkdtemp( + path.join(os.tmpdir(), "nsecure-") + ); + const dest = path.join(tmpLocation, packageName); + + try { + await pacote.extract(packageName, dest, { + ...NPM_TOKEN, registry: getLocalRegistryURL(), cache: `${os.homedir()}/.npm` + }); + + const scanResult = await tarball.scanPackage(dest, packageName); + + return scanResult; + } + finally { + await timers.setImmediate(); + await fs.rm(tmpLocation, { recursive: true, force: true }); + } +} + +export { + depWalker, + tarball, + comparePayloads, + Logger, + ScannerLoggerEvents +}; diff --git a/src/npmRegistry.js b/workspaces/scanner/src/npmRegistry.ts similarity index 59% rename from src/npmRegistry.js rename to workspaces/scanner/src/npmRegistry.ts index 3626b90..dc2e261 100644 --- a/src/npmRegistry.js +++ b/workspaces/scanner/src/npmRegistry.ts @@ -7,16 +7,19 @@ import { parseAuthor } from "@nodesecure/utils"; import { packument, packumentVersion, - user as npmUserProfile + user as npmUserProfile, + type PackumentVersion } from "@nodesecure/npm-registry-sdk"; // Import Internal Dependencies import { getLinks } from "./utils/index.js"; +import { Logger } from "./class/logger.class.js"; +import type { Author, Maintainer, Dependency, Publisher } from "./types.js"; export async function manifestMetadata( - name, - version, - dependency + name: string, + version: string, + dependency: any ) { try { const pkgVersion = await packumentVersion(name, version); @@ -36,7 +39,18 @@ export async function manifestMetadata( } } -export async function packageMetadata(name, version, options) { +export interface PackageMetadataOptions { + logger: Logger; + ref: Exclude & { + metadata: Partial + }; +} + +export async function packageMetadata( + name: string, + version: string, + options: PackageMetadataOptions +): Promise { const { ref, logger } = options; const packageSpec = `${name}:${version}`; @@ -46,22 +60,26 @@ export async function packageMetadata(name, version, options) { const oneYearFromToday = new Date(); oneYearFromToday.setFullYear(oneYearFromToday.getFullYear() - 1); - const lastVersion = pkg["dist-tags"].latest; - const lastUpdateAt = new Date(pkg.time[lastVersion]); - const metadata = { + const lastVersion = pkg["dist-tags"].latest!; + const lastUpdateAt = new Date(pkg.time[lastVersion]!); + const metadata: Dependency["metadata"] = { author: parseAuthor(pkg.author), homepage: pkg.homepage || null, publishedCount: Object.values(pkg.versions).length, lastVersion, lastUpdateAt, hasReceivedUpdateInOneYear: !(oneYearFromToday > lastUpdateAt), - maintainers: pkg.maintainers ?? [], + hasManyPublishers: false, + hasChangedAuthor: false, + maintainers: pkg.maintainers + .map((maintainer) => parseAuthor(maintainer)!) ?? [], publishers: [], - integrity: {} + integrity: {}, + dependencyCount: 0 }; const isOutdated = semver.neq(version, lastVersion); - const flags = ref.versions[version].flags; + const flags = ref.versions[version]!.flags; if (isOutdated) { flags.push("isOutdated"); } @@ -82,33 +100,39 @@ export async function packageMetadata(name, version, options) { const { _npmUser: npmUser, version, maintainers = [] } = ver; - const isNullOrUndefined = typeof npmUser === "undefined" || npmUser === null; - if (isNullOrUndefined || !("name" in npmUser) || typeof npmUser.name !== "string") { + const parsedNpmUser = parseAuthor(npmUser); + if (parsedNpmUser === null) { continue; } const authorName = metadata.author?.name ?? null; if (authorName === null) { - metadata.author = npmUser; + metadata.author = parsedNpmUser; } - else if (npmUser.name !== metadata.author.name) { + else if (parsedNpmUser.name !== metadata.author?.name) { metadata.hasManyPublishers = true; } // TODO: add npmUser.email - if (!publishers.has(npmUser.name)) { - publishers.add(npmUser.name); - metadata.publishers.push({ ...npmUser, version, at: new Date(pkg.time[version]) }); + if (!publishers.has(parsedNpmUser.name)) { + publishers.add(parsedNpmUser.name); + metadata.publishers.push({ + ...parsedNpmUser, + version, + at: new Date(pkg.time[version]!).toISOString() + }); } if (searchForMaintainersInVersions) { - metadata.maintainers.push(...maintainers); + metadata.maintainers.push( + ...maintainers.map((maintainer) => parseAuthor(maintainer)!) + ); searchForMaintainersInVersions = false; } } await addNpmAvatar(metadata); - Object.assign(ref.versions[version], { links: getLinks(pkg.versions[version]) }); + Object.assign(ref.versions[version]!, { links: getLinks(pkg.versions[version]!) }); Object.assign(ref.metadata, metadata); } catch { @@ -119,7 +143,9 @@ export async function packageMetadata(name, version, options) { } } -function getPackumentVersionIntegrity(packumentVersion) { +function getPackumentVersionIntegrity( + packumentVersion: PackumentVersion +): string { const { name, version, dependencies = {}, license = "", scripts = {} } = packumentVersion; // See https://github.com/npm/cli/issues/5234 @@ -141,9 +167,17 @@ function getPackumentVersionIntegrity(packumentVersion) { .digest("hex"); } -async function addNpmAvatar(metadata) { - const contributors = [metadata.author, ...metadata.maintainers, ...metadata.publishers]; - const emailToAvatar = {}; +async function addNpmAvatar( + metadata: Dependency["metadata"] +): Promise { + const contributors: (Maintainer | Publisher | Author)[] = [ + ...metadata.maintainers, + ...metadata.publishers + ]; + if (metadata.author !== null) { + contributors.push(metadata.author); + } + const emailToAvatar: Record = {}; const promises = contributors.map((contributor) => { if (contributor.email && emailToAvatar[contributor.email]) { @@ -152,14 +186,15 @@ async function addNpmAvatar(metadata) { return Promise.resolve(); } - return npmUserProfile(contributor.name, { perPage: 1 }).then((profile) => { - contributor.npmAvatar = profile.avatars.small; - if (contributor.email && contributor.npmAvatar) { - emailToAvatar[contributor.email] = contributor.npmAvatar; - } - }).catch(() => { - contributor.npmAvatar = null; - }); + return npmUserProfile(contributor.name, { perPage: 1 }) + .then((profile) => { + contributor.npmAvatar = profile.avatars.small; + if (contributor.email && contributor.npmAvatar) { + emailToAvatar[contributor.email] = contributor.npmAvatar; + } + }).catch(() => { + contributor.npmAvatar = undefined; + }); }); await Promise.all(promises); diff --git a/workspaces/scanner/src/types.ts b/workspaces/scanner/src/types.ts new file mode 100644 index 0000000..75b3166 --- /dev/null +++ b/workspaces/scanner/src/types.ts @@ -0,0 +1,234 @@ +// Import NodeSecure Dependencies +import * as JSXRay from "@nodesecure/js-x-ray"; +import type { SpdxLicenseConformance } from "@nodesecure/ntlp"; +import * as Vuln from "@nodesecure/vuln"; + +// Import Third-party Dependencies +import type { extractedAuthor } from "@nodesecure/authors"; + +export interface Author { + name: string; + email?: string; + url?: string; + npmAvatar?: string; +} + +export interface Maintainer { + name: string; + email?: string; + npmAvatar?: string; +} + +export interface Publisher { + /** + * Publisher npm user name. + */ + name: string; + /** + * Publisher npm user email. + */ + email?: string; + /** + * First version published. + */ + version: string; + /** + * Date of the first publication + * @example 2021-08-10T20:45:08.342Z + */ + at: string; + /** + * Path to publisher's avatar on "https://www.npmjs.com" + * @example /npm-avatar/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.LwimMJA3puF3ioGeS-tfczR3370GXBZMIL-bdpu4hOU + */ + npmAvatar?: string; +} + +export interface DependencyLinks { + /** NPM Registry page */ + npm: string; + /** Homepage URL */ + homepage?: string; + /** VCS repository URL */ + repository?: string; +} + +export interface Engines { + node?: string; + npm?: string; +} + +export interface Repository { + type: string; + url: string; +} + +export interface DependencyVersion { + /** Id of the package (useful for usedBy relation) */ + id: number; + isDevDependency: boolean; + /** + * Tell if the given package exist on the configured remote registry (npm by default) + * @default true + */ + existOnRemoteRegistry: boolean; + /** By whom (id) is used the package */ + usedBy: Record; + /** Size on disk of the extracted tarball (in bytes) */ + size: number; + /** Package description */ + description: string; + /** Author of the package. This information is not trustable and can be empty. */ + author: Author | null; + engines: Engines; + repository: Repository; + scripts: Record; + /** + * JS-X-Ray warnings + * + * @see https://github.com/NodeSecure/js-x-ray/blob/master/WARNINGS.md + */ + warnings: JSXRay.Warning[]; + /** Tarball composition (files and dependencies) */ + composition: { + /** Files extensions (.js, .md, .exe etc..) */ + extensions: string[]; + files: string[]; + /** Minified files (foo.min.js etc..) */ + minified: string[]; + alias: Record; + required_files: string[]; + required_thirdparty: string[]; + required_nodejs: string[]; + required_subpath: string[]; + unused: string[]; + missing: string[]; + }; + /** + * Package licenses with SPDX expression. + * + * @see https://github.com/NodeSecure/licenses-conformance + * @see https://github.com/NodeSecure/npm-tarball-license-parser + */ + license: SpdxLicenseConformance[]; + /** + * Flags (Array of string) + * + * @see https://github.com/NodeSecure/flags/blob/main/FLAGS.md + */ + flags: string[]; + /** + * If the dependency is a GIT repository + */ + gitUrl: null | string; + /** + * Version MD5 integrity hash + * Generated by the scanner to verify manifest/tarball confusion + * + * (Not supported on GIT dependency) + */ + integrity?: string; + links?: DependencyLinks; +} + +export interface Dependency { + /** NPM Registry metadata */ + metadata: { + /** Count of dependencies */ + dependencyCount: number; + /** Number of releases published on npm */ + publishedCount: number; + lastUpdateAt: Date; + /** Last version SemVer */ + lastVersion: string; + hasChangedAuthor: boolean; + hasManyPublishers: boolean; + hasReceivedUpdateInOneYear: boolean; + /** Author of the package. This information is not trustable and can be empty. */ + author: Author | null; + /** Package home page */ + homepage: string | null; + /** + * List of maintainers (list of people in the organization related to the package) + */ + maintainers: Maintainer[]; + /** + * List of people who published this package + */ + publishers: Publisher[]; + /** + * Version MD5 integrity hash + * Generated by the scanner to verify manifest/tarball confusion + */ + integrity: Record; + } + /** List of versions of this package available in the dependency tree (In the payload) */ + versions: Record; + /** + * Vulnerabilities fetched dependending on the selected vulnerabilityStrategy + * + * @see https://github.com/NodeSecure/vuln + */ + vulnerabilities: Vuln.Strategy.StandardVulnerability[]; +} + +export type Dependencies = Record; + +export interface Payload { + /** Payload unique id */ + id: string; + /** Name of the analyzed package */ + rootDependencyName: string; + /** Global warnings list */ + warnings: string[]; + /** List of flagged authors */ + flaggedAuthors: extractedAuthor[]; + /** All the dependencies of the package (flattened) */ + dependencies: Dependencies; + /** Version of the scanner used to generate the result */ + scannerVersion: string; + /** Vulnerability strategy name (npm, snyk, node) */ + vulnerabilityStrategy: Vuln.Strategy.Kind; +} + +export interface Options { + /** + * Maximum tree depth + * + * @default 4 + */ + readonly maxDepth?: number; + readonly registry?: string | URL; + /** + * Use root package-lock.json. This will have the effect of triggering the Arborist package. + * + * @default false for from() API + * @default true for cwd() API + */ + readonly usePackageLock?: boolean; + /** + * Include project devDependencies (only available for cwd command) + * + * @default false + */ + readonly includeDevDeps?: boolean; + /** + * Vulnerability strategy name (npm, snyk, node) + * + * @default NONE + */ + readonly vulnerabilityStrategy?: Vuln.Strategy.Kind; + /** + * Analyze root package. + * + * @default false for from() API + * @default true for cwd() API + */ + readonly forceRootAnalysis?: boolean; + /** + * Deeper dependencies analysis with cwd() API. + * + * @default false + */ + readonly fullLockMode?: boolean; +} diff --git a/src/utils/addMissingVersionFlags.js b/workspaces/scanner/src/utils/addMissingVersionFlags.ts similarity index 67% rename from src/utils/addMissingVersionFlags.js rename to workspaces/scanner/src/utils/addMissingVersionFlags.ts index 26743a2..ecf59ab 100644 --- a/src/utils/addMissingVersionFlags.js +++ b/workspaces/scanner/src/utils/addMissingVersionFlags.ts @@ -1,9 +1,12 @@ -/** - * @param {Set} flags - * @param {import("../../types/scanner").Dependency} descriptor - */ -export function* addMissingVersionFlags(flags, descriptor) { - const { metadata, vulnerabilities = [], versions } = descriptor; +// Import Internal Dependencies +import type { Dependency } from "../types.js"; + +// TODO: add strict flags type +export function* addMissingVersionFlags( + flags: Set, + dep: Dependency +): IterableIterator { + const { metadata, vulnerabilities = [], versions } = dep; const semverVersions = Object.keys(versions); if (!metadata.hasReceivedUpdateInOneYear && flags.has("hasOutdatedDependency") && !flags.has("isDead")) { diff --git a/src/utils/dirname.js b/workspaces/scanner/src/utils/dirname.ts similarity index 74% rename from src/utils/dirname.js rename to workspaces/scanner/src/utils/dirname.ts index bed1eaa..6f112dc 100644 --- a/src/utils/dirname.js +++ b/workspaces/scanner/src/utils/dirname.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; -export function getDirNameFromUrl(url) { +export function getDirNameFromUrl(url: string | URL): string { const __filename = fileURLToPath(url); return dirname(__filename); diff --git a/src/utils/getLinks.js b/workspaces/scanner/src/utils/getLinks.ts similarity index 55% rename from src/utils/getLinks.js rename to workspaces/scanner/src/utils/getLinks.ts index b2ddb8d..578f7e2 100644 --- a/src/utils/getLinks.js +++ b/workspaces/scanner/src/utils/getLinks.ts @@ -1,7 +1,16 @@ +// Import Third-party Dependencies +import type { PackumentVersion } from "@nodesecure/npm-registry-sdk"; + // CONSTANTS const kVCSHosts = new Set(["github.com", "gitlab.com"]); -function getVCSRepositoryURL(link) { +function getVCSRepositoryURL( + link: string | null +): string | null { + if (!link) { + return null; + } + try { const url = new URL(link); const { hostname, pathname } = url; @@ -19,18 +28,19 @@ function getVCSRepositoryURL(link) { } } -/** - * @param {import("@nodesecure/npm-registry-sdk").PackumentVersion} packumentVersion - */ export function getLinks( - packumentVersion + packumentVersion: PackumentVersion ) { const homepage = packumentVersion.homepage || null; - const repositoryUrl = packumentVersion.repository?.url || null; + const repositoryUrl = typeof packumentVersion.repository === "string" ? + packumentVersion.repository : + packumentVersion.repository?.url ?? null; return { npm: `https://www.npmjs.com/package/${packumentVersion.name}/v/${packumentVersion.version}`, homepage, - repository: getVCSRepositoryURL(homepage) ?? getVCSRepositoryURL(repositoryUrl) + repository: + getVCSRepositoryURL(homepage) ?? + getVCSRepositoryURL(repositoryUrl) }; } diff --git a/src/utils/index.js b/workspaces/scanner/src/utils/index.ts similarity index 88% rename from src/utils/index.js rename to workspaces/scanner/src/utils/index.ts index 18ff72f..995a353 100644 --- a/src/utils/index.js +++ b/workspaces/scanner/src/utils/index.ts @@ -2,6 +2,7 @@ export * from "./dirname.js"; export * from "./warnings.js"; export * from "./addMissingVersionFlags.js"; export * from "./getLinks.js"; +export * from "./urlToString.js"; export const NPM_TOKEN = typeof process.env.NODE_SECURE_TOKEN === "string" ? { token: process.env.NODE_SECURE_TOKEN } : diff --git a/workspaces/scanner/src/utils/urlToString.ts b/workspaces/scanner/src/utils/urlToString.ts new file mode 100644 index 0000000..19ac725 --- /dev/null +++ b/workspaces/scanner/src/utils/urlToString.ts @@ -0,0 +1,7 @@ +export function urlToString( + uri: string | URL +): string { + return typeof uri === "string" ? + new URL(uri).toString() : + uri.toString(); +} diff --git a/src/utils/warnings.js b/workspaces/scanner/src/utils/warnings.ts similarity index 74% rename from src/utils/warnings.js rename to workspaces/scanner/src/utils/warnings.ts index 9ec4e3f..c7322ca 100644 --- a/src/utils/warnings.js +++ b/workspaces/scanner/src/utils/warnings.ts @@ -3,13 +3,13 @@ import path from "node:path"; // Import Third-party Dependencies import * as i18n from "@nodesecure/i18n"; -import { extractAllAuthors } from "@nodesecure/authors"; +import { extractAllAuthors, type extractedAuthor } from "@nodesecure/authors"; // Import Internal Dependencies import { getDirNameFromUrl } from "./dirname.js"; await i18n.extendFromSystemPath( - path.join(getDirNameFromUrl(import.meta.url), "..", "..", "i18n") + path.join(getDirNameFromUrl(import.meta.url), "..", "i18n") ); // CONSTANTS @@ -23,12 +23,17 @@ const kDependencyWarnMessage = Object.freeze({ iohook: await i18n.getToken("scanner.keylogging") }); -/** - * @param {Map} dependenciesMap - */ -export async function getDependenciesWarnings(dependenciesMap) { +export interface GetWarningsResult { + warnings: string[]; + flaggedAuthors: extractedAuthor[]; +} + +export async function getDependenciesWarnings( + dependenciesMap: Map +): Promise { const warnings = [...Object.keys(kDependencyWarnMessage)] .filter((depName) => dependenciesMap.has(depName)) + // @ts-ignore .map((depName) => `${kDetectedDep(depName)} ${kDependencyWarnMessage[depName]}`); // TODO: add support for RC configuration diff --git a/test/comparePayloads.spec.js b/workspaces/scanner/test/comparePayloads.spec.ts similarity index 77% rename from test/comparePayloads.spec.js rename to workspaces/scanner/test/comparePayloads.spec.ts index 55e240a..596ca84 100644 --- a/test/comparePayloads.spec.js +++ b/workspaces/scanner/test/comparePayloads.spec.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url"; import { readFileSync } from "node:fs"; // Require Internal Dependencies -import { comparePayloads } from "../index.js"; +import { comparePayloads } from "../src/index.js"; // CONSTANTS const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -36,7 +36,7 @@ it("should detect warnings diff", () => { assert.strictEqual(removed.length, 1); assert.deepStrictEqual(removed[0], "unsafe-regex"); - const deepWarnings = compared.get("foo").versions.compared.get("2.0.0").warnings; + const deepWarnings = compared.get("foo")!.versions.compared.get("2.0.0")!.warnings; assert.strictEqual(deepWarnings.added.length, 1); assert.deepStrictEqual(deepWarnings.added[0], { kind: "unsafe-import", @@ -75,17 +75,17 @@ it("should detect flagged authors diff", () => { }); it("should detect scanner version diff", () => { - const { scannerVersion: { prev, now } } = compareTo("scannerVersionChanged"); + const { scannerVersion } = compareTo("scannerVersionChanged"); - assert.strictEqual(prev, "1.0.0"); - assert.strictEqual(now, "1.0.1"); + assert.strictEqual(scannerVersion?.prev, "1.0.0"); + assert.strictEqual(scannerVersion.now, "1.0.1"); }); it("should detect vulnerability strategy version diff", () => { - const { vulnerabilityStrategy: { prev, now } } = compareTo("vulnerabilityStrategyChanged"); + const { vulnerabilityStrategy } = compareTo("vulnerabilityStrategyChanged"); - assert.strictEqual(prev, "npm"); - assert.strictEqual(now, "snyk"); + assert.strictEqual(vulnerabilityStrategy?.prev, "npm"); + assert.strictEqual(vulnerabilityStrategy?.now, "snyk"); }); @@ -103,7 +103,7 @@ it("should detect dependencies diff", () => { assert.ok(compared.has("foo")); // Updated dependency deep comparison - const foo = compared.get("foo"); + const foo = compared.get("foo")!; assert.ok(foo.vulnerabilities.added.some((v) => v.id === "baz")); assert.ok(foo.vulnerabilities.removed.some((v) => v.id === "bar")); @@ -127,11 +127,11 @@ it("should detect dependencies diff", () => { it("should detect version diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const comparedVersion2 = compared.get("foo").versions.compared.get("2.0.0"); - assert.ok(comparedVersion2.id.prev === "abc"); + const comparedVersion2 = compared.get("foo")!.versions.compared.get("2.0.0")!; + assert.ok(comparedVersion2.id?.prev === "abc"); assert.ok(comparedVersion2.id.now === "bcd"); - assert.strictEqual(comparedVersion2.size.prev, "1"); + assert.strictEqual(comparedVersion2.size?.prev, "1"); assert.strictEqual(comparedVersion2.size.now, "2"); const usedBy = comparedVersion2.usedBy; @@ -141,27 +141,27 @@ it("should detect version diff", () => { assert.ok(usedBy.removed.has("bar")); assert.strictEqual(usedBy.removed.size, 1); - assert.strictEqual(usedBy.compared.get("foo").prev, "1.0.0"); - assert.strictEqual(usedBy.compared.get("foo").now, "1.0.1"); + assert.strictEqual(usedBy.compared.get("foo")!.prev, "1.0.0"); + assert.strictEqual(usedBy.compared.get("foo")!.now, "1.0.1"); - assert.ok(comparedVersion2.devDependency.prev === false); - assert.ok(comparedVersion2.devDependency.now === true); + assert.ok(comparedVersion2.devDependency?.prev === false); + assert.ok(comparedVersion2.devDependency?.now); - assert.ok(comparedVersion2.existOnRemoteRegistry.prev === false); - assert.ok(comparedVersion2.existOnRemoteRegistry.now === true); + assert.ok(comparedVersion2.existOnRemoteRegistry?.prev === false); + assert.ok(comparedVersion2.existOnRemoteRegistry?.now === true); - assert.ok(comparedVersion2.description.prev === "foo"); - assert.ok(comparedVersion2.description.now === "bar"); + assert.ok(comparedVersion2.description?.prev === "foo"); + assert.ok(comparedVersion2.description?.now === "bar"); - assert.equal(comparedVersion2.author.prev.name, "Sindre Sorhus"); - assert.deepStrictEqual(comparedVersion2.author.now, { + assert.equal(comparedVersion2.author?.prev.name, "Sindre Sorhus"); + assert.deepStrictEqual(comparedVersion2.author?.now, { name: "Franck Sorhus", email: "franck@gmail.com", url: "https://franck.com" }); // repository: diff on type only - assert.deepStrictEqual(comparedVersion2.repository.prev, { + assert.deepStrictEqual(comparedVersion2.repository?.prev, { type: "svn", url: "https://github.com/NodeSecure/js-x-ray" }); @@ -171,7 +171,7 @@ it("should detect version diff", () => { url: "https://github.com/NodeSecure/js-x-ray" }); - assert.deepStrictEqual(comparedVersion2.links.prev, { + assert.deepStrictEqual(comparedVersion2.links?.prev, { npm: "https://www.npmjs.com/package/example-package", homepage: "https://example-package.com", repository: "https://github.com/example-package/example-repo" @@ -183,12 +183,12 @@ it("should detect version diff", () => { repository: "https://github.com/example-package/example-repo2" }); - const comparedVersion3 = compared.get("foo").versions.compared.get("3.0.0"); + const comparedVersion3 = compared.get("foo")!.versions.compared.get("3.0.0")!; assert.strictEqual(comparedVersion3.devDependency, undefined); assert.strictEqual(comparedVersion3.author, undefined); // repository: diff on url only - assert.deepStrictEqual(comparedVersion3.repository.prev, { + assert.deepStrictEqual(comparedVersion3.repository?.prev, { type: "git", url: "https://github.com/NodeSecure/js-x-ray" }); @@ -202,7 +202,7 @@ it("should detect version diff", () => { it("should detect compared version composition diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const comparedVersion2 = compared.get("foo").versions.compared.get("2.0.0"); + const comparedVersion2 = compared.get("foo")!.versions.compared.get("2.0.0")!; const composition = comparedVersion2.composition; assert.strictEqual(composition.minified.added.length, 1); @@ -238,7 +238,7 @@ it("should detect compared version composition diff", () => { it("should detect license IDs diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const { licenseIds } = compared.get("foo").versions.compared.get("2.0.0"); + const { licenseIds } = compared.get("foo")!.versions.compared.get("2.0.0")!; assert.strictEqual(licenseIds.added.length, 1); assert.strictEqual(licenseIds.added[0], "BSD-3-Clause"); @@ -249,7 +249,7 @@ it("should detect license IDs diff", () => { it("should detect flags diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const { flags } = compared.get("foo").versions.compared.get("2.0.0"); + const { flags } = compared.get("foo")!.versions.compared.get("2.0.0")!; assert.strictEqual(flags.added.length, 1); assert.strictEqual(flags.added[0], "🌲"); @@ -260,7 +260,7 @@ it("should detect flags diff", () => { it("should detect engines diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const { engines } = compared.get("foo").versions.compared.get("2.0.0"); + const { engines } = compared.get("foo")!.versions.compared.get("2.0.0")!; assert.strictEqual(engines.added.size, 1); assert.ok(engines.added.has("node4")); @@ -271,13 +271,13 @@ it("should detect engines diff", () => { assert.strictEqual(engines.compared.size, 2); assert.ok(engines.compared.has("node2")); assert.ok(engines.compared.has("node3")); - assert.strictEqual(engines.compared.get("node2").prev, "^12.20.0 || ^14.13.1 || >=16.0.0"); - assert.strictEqual(engines.compared.get("node2").now, "^14.20.0 || ^16.13.1 || >=18.0.0"); + assert.strictEqual(engines.compared.get("node2")!.prev, "^12.20.0 || ^14.13.1 || >=16.0.0"); + assert.strictEqual(engines.compared.get("node2")!.now, "^14.20.0 || ^16.13.1 || >=18.0.0"); }); it("should detect scripts diff", () => { const { dependencies: { compared } } = compareTo("deeplyUpdatedPayload"); - const { scripts } = compared.get("foo").versions.compared.get("2.0.0"); + const { scripts } = compared.get("foo")!.versions.compared.get("2.0.0")!; assert.strictEqual(scripts.added.size, 1); assert.ok(scripts.added.has("lint")); @@ -289,12 +289,12 @@ it("should detect scripts diff", () => { assert.ok(scripts.compared.has("test")); assert.strictEqual(scripts.compared.get("test"), undefined); assert.ok(scripts.compared.has("standard")); - assert.strictEqual(scripts.compared.get("standard").prev, "npx standard"); - assert.strictEqual(scripts.compared.get("standard").now, "npx standard --fix"); + assert.strictEqual(scripts.compared.get("standard")?.prev, "npx standard"); + assert.strictEqual(scripts.compared.get("standard")?.now, "npx standard --fix"); }); -const payloads = {}; -function compareTo(name) { +const payloads = {} as Record; +function compareTo(name: string) { if (!payloads[name]) { payloads[name] = JSON.parse(readFileSync(join(kFixturePath, `/${name}.json`), "utf8")); } diff --git a/test/depWalker.spec.js b/workspaces/scanner/test/depWalker.spec.ts similarity index 77% rename from test/depWalker.spec.js rename to workspaces/scanner/test/depWalker.spec.ts index 8cbadda..5e44c6a 100644 --- a/test/depWalker.spec.js +++ b/workspaces/scanner/test/depWalker.spec.ts @@ -1,40 +1,45 @@ -// Require Node.js Dependencies -import { join, dirname } from "node:path"; +// Import Node.js Dependencies +import { join } from "node:path"; import { readFileSync } from "node:fs"; -import { fileURLToPath } from "node:url"; import { test } from "node:test"; import assert from "node:assert"; -// Third party Dependencies +// Import Third-party Dependencies import { setStrategy, strategies } from "@nodesecure/vuln"; +import { getLocalRegistryURL } from "@nodesecure/npm-registry-sdk"; -// Require Internal Dependencies +// Import Internal Dependencies import { depWalker } from "../src/depWalker.js"; -import { from, cwd } from "../index.js"; +import { from, type Payload, type DependencyVersion } from "../src/index.js"; // CONSTANTS -const __dirname = dirname(fileURLToPath(import.meta.url)); const FIXTURE_PATH = join("fixtures", "depWalker"); // JSON PAYLOADS const is = JSON.parse(readFileSync( - new URL(join(FIXTURE_PATH, "slimio.is.json"), import.meta.url) + new URL(join(FIXTURE_PATH, "slimio.is.json"), import.meta.url), + "utf8" )); const config = JSON.parse(readFileSync( - new URL(join(FIXTURE_PATH, "slimio.config.json"), import.meta.url) + new URL(join(FIXTURE_PATH, "slimio.config.json"), import.meta.url), + "utf8" )); const pkgGitdeps = JSON.parse(readFileSync( - new URL(join(FIXTURE_PATH, "pkg.gitdeps.json"), import.meta.url) + new URL(join(FIXTURE_PATH, "pkg.gitdeps.json"), import.meta.url), + "utf8" )); -function cleanupPayload(payload) { +function cleanupPayload(payload: Payload) { for (const pkg of Object.values(payload)) { - for (const verDescriptor of Object.values(pkg.versions)) { + for (const verDescriptor of Object.values(pkg.versions) as DependencyVersion[]) { verDescriptor.composition.extensions.sort(); + // @ts-ignore delete verDescriptor.size; + // @ts-ignore delete verDescriptor.composition.files; + // @ts-ignore delete verDescriptor.composition.required_files; } for (const contributor of [pkg.metadata.author, ...pkg.metadata.publishers, ...pkg.metadata.maintainers]) { @@ -47,7 +52,9 @@ function cleanupPayload(payload) { test("execute depWalker on @slimio/is", async() => { await setStrategy(strategies.NPM_AUDIT); - const result = await depWalker(is, { verbose: false }); + const result = await depWalker(is, { + registry: getLocalRegistryURL() + }); const resultAsJSON = JSON.parse(JSON.stringify(result.dependencies, null, 2)); cleanupPayload(resultAsJSON); @@ -58,7 +65,9 @@ test("execute depWalker on @slimio/is", async() => { test("execute depWalker on @slimio/config", async() => { await setStrategy(strategies.NPM_AUDIT); - const result = await depWalker(config, { verbose: false }); + const result = await depWalker(config, { + registry: getLocalRegistryURL() + }); const resultAsJSON = JSON.parse(JSON.stringify(result.dependencies, null, 2)); const packages = Object.keys(resultAsJSON).sort(); @@ -83,7 +92,9 @@ test("execute depWalker on @slimio/config", async() => { test("execute depWalker on pkg.gitdeps", async() => { await setStrategy(strategies.NPM_AUDIT); - const result = await depWalker(pkgGitdeps, { verbose: false }); + const result = await depWalker(pkgGitdeps, { + registry: getLocalRegistryURL() + }); const resultAsJSON = JSON.parse(JSON.stringify(result.dependencies, null, 2)); const packages = Object.keys(resultAsJSON).sort(); @@ -116,7 +127,6 @@ test("execute depWalker on pkg.gitdeps", async() => { test("fetch payload of pacote on the npm registry", async() => { const result = await from("pacote", { - verbose: false, maxDepth: 10, vulnerabilityStrategy: strategies.NPM_AUDIT }); @@ -135,7 +145,6 @@ test("fetch payload of pacote on the npm registry", async() => { test("fetch payload of pacote on the gitlab registry", async() => { const result = await from("pacote", { registry: "https://gitlab.com/api/v4/packages/npm/", - verbose: false, maxDepth: 10, vulnerabilityStrategy: strategies.NPM_AUDIT }); @@ -150,20 +159,3 @@ test("fetch payload of pacote on the gitlab registry", async() => { "dependencies" ]); }); - -test("execute cwd on scanner project", async() => { - await cwd(join(__dirname, ".."), { - verbose: false, - maxDepth: 2, - vulnerabilityStrategy: strategies.NPM_AUDIT - }); -}); - -test("execute cwd on scanner project with a different registry", async() => { - await cwd(join(__dirname, ".."), { - registry: "https://gitlab.com/api/v4/packages/npm/", - verbose: false, - maxDepth: 2, - vulnerabilityStrategy: strategies.NPM_AUDIT - }); -}); diff --git a/test/fixtures/depWalker/pkg.gitdeps.json b/workspaces/scanner/test/fixtures/depWalker/pkg.gitdeps.json similarity index 100% rename from test/fixtures/depWalker/pkg.gitdeps.json rename to workspaces/scanner/test/fixtures/depWalker/pkg.gitdeps.json diff --git a/test/fixtures/depWalker/slimio.config.json b/workspaces/scanner/test/fixtures/depWalker/slimio.config.json similarity index 100% rename from test/fixtures/depWalker/slimio.config.json rename to workspaces/scanner/test/fixtures/depWalker/slimio.config.json diff --git a/test/fixtures/depWalker/slimio.is-result.json b/workspaces/scanner/test/fixtures/depWalker/slimio.is-result.json similarity index 99% rename from test/fixtures/depWalker/slimio.is-result.json rename to workspaces/scanner/test/fixtures/depWalker/slimio.is-result.json index ecc0f81..7d090fe 100644 --- a/test/fixtures/depWalker/slimio.is-result.json +++ b/workspaces/scanner/test/fixtures/depWalker/slimio.is-result.json @@ -126,6 +126,7 @@ "email": "alexandre.malaj@gmail.com" } ], + "hasChangedAuthor": false, "integrity": { "1.5.1": "c9781c55ab750e58bed9ce2560581ff4087b8c3129462543fa6fee4e717ba2a9" } diff --git a/test/fixtures/depWalker/slimio.is.json b/workspaces/scanner/test/fixtures/depWalker/slimio.is.json similarity index 100% rename from test/fixtures/depWalker/slimio.is.json rename to workspaces/scanner/test/fixtures/depWalker/slimio.is.json diff --git a/test/fixtures/scannerPayloads/deeplyUpdatedPayload.json b/workspaces/scanner/test/fixtures/scannerPayloads/deeplyUpdatedPayload.json similarity index 100% rename from test/fixtures/scannerPayloads/deeplyUpdatedPayload.json rename to workspaces/scanner/test/fixtures/scannerPayloads/deeplyUpdatedPayload.json diff --git a/test/fixtures/scannerPayloads/flaggedAuthorsChanged.json b/workspaces/scanner/test/fixtures/scannerPayloads/flaggedAuthorsChanged.json similarity index 100% rename from test/fixtures/scannerPayloads/flaggedAuthorsChanged.json rename to workspaces/scanner/test/fixtures/scannerPayloads/flaggedAuthorsChanged.json diff --git a/test/fixtures/scannerPayloads/otherRootDependency.json b/workspaces/scanner/test/fixtures/scannerPayloads/otherRootDependency.json similarity index 100% rename from test/fixtures/scannerPayloads/otherRootDependency.json rename to workspaces/scanner/test/fixtures/scannerPayloads/otherRootDependency.json diff --git a/test/fixtures/scannerPayloads/payload.json b/workspaces/scanner/test/fixtures/scannerPayloads/payload.json similarity index 100% rename from test/fixtures/scannerPayloads/payload.json rename to workspaces/scanner/test/fixtures/scannerPayloads/payload.json diff --git a/test/fixtures/scannerPayloads/sameIdPayload.json b/workspaces/scanner/test/fixtures/scannerPayloads/sameIdPayload.json similarity index 100% rename from test/fixtures/scannerPayloads/sameIdPayload.json rename to workspaces/scanner/test/fixtures/scannerPayloads/sameIdPayload.json diff --git a/test/fixtures/scannerPayloads/scannerVersionChanged.json b/workspaces/scanner/test/fixtures/scannerPayloads/scannerVersionChanged.json similarity index 100% rename from test/fixtures/scannerPayloads/scannerVersionChanged.json rename to workspaces/scanner/test/fixtures/scannerPayloads/scannerVersionChanged.json diff --git a/test/fixtures/scannerPayloads/vulnerabilityStrategyChanged.json b/workspaces/scanner/test/fixtures/scannerPayloads/vulnerabilityStrategyChanged.json similarity index 100% rename from test/fixtures/scannerPayloads/vulnerabilityStrategyChanged.json rename to workspaces/scanner/test/fixtures/scannerPayloads/vulnerabilityStrategyChanged.json diff --git a/test/fixtures/scannerPayloads/warningChangedPayload.json b/workspaces/scanner/test/fixtures/scannerPayloads/warningChangedPayload.json similarity index 100% rename from test/fixtures/scannerPayloads/warningChangedPayload.json rename to workspaces/scanner/test/fixtures/scannerPayloads/warningChangedPayload.json diff --git a/test/fixtures/verify/express-result.json b/workspaces/scanner/test/fixtures/verify/express-result.json similarity index 100% rename from test/fixtures/verify/express-result.json rename to workspaces/scanner/test/fixtures/verify/express-result.json diff --git a/test/fixtures/verifySemVer/package.json b/workspaces/scanner/test/fixtures/verifySemVer/package.json similarity index 100% rename from test/fixtures/verifySemVer/package.json rename to workspaces/scanner/test/fixtures/verifySemVer/package.json diff --git a/test/integrityWarning.spec.js b/workspaces/scanner/test/integrityWarning.spec.ts similarity index 88% rename from test/integrityWarning.spec.js rename to workspaces/scanner/test/integrityWarning.spec.ts index 51db6bc..eb9d43b 100644 --- a/test/integrityWarning.spec.js +++ b/workspaces/scanner/test/integrityWarning.spec.ts @@ -3,11 +3,10 @@ import { test } from "node:test"; import assert from "node:assert"; // Require Internal Dependencies -import { from } from "../index.js"; +import { from } from "../src/index.js"; test("expect one warning from 'darcyclarke-manifest-pkg' with an integrity issue", async() => { const result = await from("darcyclarke-manifest-pkg", { - verbose: false, maxDepth: 2 }); diff --git a/test/logger.spec.js b/workspaces/scanner/test/logger.spec.ts similarity index 96% rename from test/logger.spec.js rename to workspaces/scanner/test/logger.spec.ts index 4c7cd84..1a2f503 100644 --- a/test/logger.spec.js +++ b/workspaces/scanner/test/logger.spec.ts @@ -7,7 +7,7 @@ import assert from "node:assert"; import is from "@slimio/is"; // Import Internal Dependencies -import Logger from "../src/class/logger.class.js"; +import { Logger } from "../src/index.js"; test("Logger: Creating a new class instance and assert all properties", () => { assert.ok(is.classObject(Logger)); @@ -19,7 +19,7 @@ test("Logger: Creating a new class instance and assert all properties", () => { test("Logger: Initialized event should have the right properties", () => { const logger = new Logger().start("foobar"); - const data = logger.events.get("foobar"); + const data = logger.events.get("foobar")!; assert.deepEqual(Object.keys(data), ["startedAt", "count"]); }); diff --git a/test/npmRegistry.spec.js b/workspaces/scanner/test/npmRegistry.spec.ts similarity index 87% rename from test/npmRegistry.spec.js rename to workspaces/scanner/test/npmRegistry.spec.ts index fe3d602..44c2d78 100644 --- a/test/npmRegistry.spec.js +++ b/workspaces/scanner/test/npmRegistry.spec.ts @@ -7,13 +7,16 @@ import semver from "semver"; import is from "@slimio/is"; // Import Internal Dependencies -import Logger from "../src/class/logger.class.js"; +import { Logger, type Dependency } from "../src/index.js"; import * as registry from "../src/npmRegistry.js"; test("registry.packageMetadata should not throw error for unknown/invalid package", async() => { const logger = new Logger().start("registry"); - await registry.packageMetadata("foobarrxldkedeoxcjek", "1.5.0", { logger }); + await registry.packageMetadata("foobarrxldkedeoxcjek", "1.5.0", { + logger, + ref: {} as any + }); }); test("registry.manifestMetadata should not throw error for unknown/invalid package", async() => { @@ -54,7 +57,7 @@ test("registry.packageMetadata", async() => { flags: [] } } - }; + } as unknown as Dependency; const logger = new Logger().start("registry"); await registry.packageMetadata("@slimio/is", "1.5.0", { @@ -62,10 +65,10 @@ test("registry.packageMetadata", async() => { logger }); - assert.deepEqual(ref.versions["1.5.0"].flags, ["isOutdated"]); + assert.deepEqual(ref.versions["1.5.0"]!.flags, ["isOutdated"]); assert.strictEqual(logger.count("registry"), 1); - assert.strictEqual(ref.metadata.author.name, "SlimIO"); + assert.strictEqual(ref.metadata.author!.name, "SlimIO"); assert.strictEqual(ref.metadata.homepage, "https://github.com/SlimIO/is#readme"); assert.ok(semver.gt(ref.metadata.lastVersion, "1.5.0")); @@ -78,7 +81,7 @@ test("registry.packageMetadata", async() => { assert.ok(typeof ref.metadata.publishedCount === "number"); assert.ok(is.date(new Date(ref.metadata.lastUpdateAt))); - assert.deepEqual(ref.versions["1.5.0"].links, { + assert.deepEqual(ref.versions["1.5.0"]!.links, { npm: "https://www.npmjs.com/package/@slimio/is/v/1.5.0", homepage: "https://github.com/SlimIO/is#readme", repository: "https://github.com/SlimIO/is" @@ -93,7 +96,7 @@ test("registry.packageMetadata should find GitLab links", async() => { flags: [] } } - }; + } as unknown as Dependency; const logger = new Logger().start("registry"); await registry.packageMetadata("@gitlab/ui", "71.2.0", { @@ -101,7 +104,7 @@ test("registry.packageMetadata should find GitLab links", async() => { logger }); - assert.deepEqual(ref.versions["71.2.0"].links, { + assert.deepEqual(ref.versions["71.2.0"]!.links, { npm: "https://www.npmjs.com/package/@gitlab/ui/v/71.2.0", homepage: "https://gitlab.com/gitlab-org/gitlab-ui#readme", repository: "https://gitlab.com/gitlab-org/gitlab-ui" @@ -116,7 +119,7 @@ test("registry.packageMetadata should detect a deprecated package", async() => { flags: [] } } - }; + } as unknown as Dependency; const logger = new Logger().start("registry"); await registry.packageMetadata("express", "2.5.9", { @@ -124,7 +127,7 @@ test("registry.packageMetadata should detect a deprecated package", async() => { logger }); - assert.deepEqual(ref.versions["2.5.9"].flags, [ + assert.deepEqual(ref.versions["2.5.9"]!.flags, [ "isOutdated", "isDeprecated" ]); diff --git a/test/utils/addMissingVersionFlags.spec.js b/workspaces/scanner/test/utils/addMissingVersionFlags.spec.ts similarity index 95% rename from test/utils/addMissingVersionFlags.spec.js rename to workspaces/scanner/test/utils/addMissingVersionFlags.spec.ts index e95910b..b4d0dac 100644 --- a/test/utils/addMissingVersionFlags.spec.js +++ b/workspaces/scanner/test/utils/addMissingVersionFlags.spec.ts @@ -1,4 +1,4 @@ -// Require Node.js Dependencies +// Import Node.js Dependencies import { test } from "node:test"; import assert from "node:assert"; @@ -17,7 +17,7 @@ test("addMissingVersionFlags should return all missing flags", () => { }, vulnerabilities: [{}], versions: ["1.1.1", "1.5.0"] - }); + } as any); const resultFlags = [...gen]; assert.deepEqual(resultFlags, [ "isDead", "hasManyPublishers", "hasChangedAuthor", "hasVulnerabilities", "hasDuplicate" @@ -36,7 +36,7 @@ test("addMissingVersionFlags should return an empty array", () => { }, vulnerabilities: [{}], versions: ["1.1.1", "1.5.0"] - }); + } as any); const resultFlags = [...gen]; assert.deepEqual(resultFlags, []); }); diff --git a/test/utils/warnings.spec.js b/workspaces/scanner/test/utils/warnings.spec.ts similarity index 96% rename from test/utils/warnings.spec.js rename to workspaces/scanner/test/utils/warnings.spec.ts index d004450..e5589c7 100644 --- a/test/utils/warnings.spec.js +++ b/workspaces/scanner/test/utils/warnings.spec.ts @@ -1,4 +1,4 @@ -// Require Node.js Dependencies +// Import Node.js Dependencies import { test } from "node:test"; import assert from "node:assert"; diff --git a/test/verify.spec.js b/workspaces/scanner/test/verify.spec.ts similarity index 94% rename from test/verify.spec.js rename to workspaces/scanner/test/verify.spec.ts index 857adef..11a6d29 100644 --- a/test/verify.spec.js +++ b/workspaces/scanner/test/verify.spec.ts @@ -1,12 +1,12 @@ // Import Node.js Dependencies -import { fileURLToPath } from "node:url"; import path from "node:path"; import fs from "node:fs"; -import { test } from "node:test"; import assert from "node:assert"; +import { fileURLToPath } from "node:url"; +import { test } from "node:test"; // Import Internal Dependencies -import { verify } from "../index.js"; +import { verify } from "../src/index.js"; // CONSTANTS const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -72,7 +72,9 @@ test("verify 'express' package", async() => { assert.deepEqual(warningName, ["unsafe-import"]); const expectedResult = JSON.parse( - fs.readFileSync(path.join(kFixturePath, "express-result.json"), "utf-8").replaceAll("\\", path.sep).replaceAll("//", "/") + fs.readFileSync(path.join(kFixturePath, "express-result.json"), "utf-8") + .replaceAll("\\", path.sep) + .replaceAll("//", "/") ); assert.deepEqual(data.ast.dependencies, expectedResult); }); diff --git a/workspaces/scanner/tsconfig.json b/workspaces/scanner/tsconfig.json new file mode 100644 index 0000000..ca5b655 --- /dev/null +++ b/workspaces/scanner/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + /* Base Options: */ + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": false, + "noImplicitOverride": true, + + /* Others */ + "module": "NodeNext", + "rootDir": "src", + "outDir": "dist", + "sourceMap": true, + "declaration": true, + "composite": false, + "declarationMap": true, + "lib": ["es2022"] + }, + "include": ["src"], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/workspaces/tarball/package.json b/workspaces/tarball/package.json index 1b6caf1..682d410 100644 --- a/workspaces/tarball/package.json +++ b/workspaces/tarball/package.json @@ -6,7 +6,7 @@ "exports": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc", + "build": "tsc -b", "test-only": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "test": "c8 -r html npm run test-only" }, @@ -21,10 +21,18 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { + "@nodesecure/fs-walk": "^2.0.0", "@nodesecure/js-x-ray": "^6.3.0", - "@npm/types": "^1.0.2" + "@nodesecure/ntlp": "^3.0.0", + "@nodesecure/utils": "^2.1.0", + "@npm/types": "^1.0.2", + "@slimio/lock": "^1.0.0", + "builtins": "^5.1.0", + "lodash.difference": "^4.5.0", + "pacote": "^18.0.6" }, "devDependencies": { + "@types/lodash.difference": "^4.5.9", "get-folder-size": "^4.0.0" } } diff --git a/workspaces/tarball/src/manifest.ts b/workspaces/tarball/src/manifest.ts index 4facc57..5168a86 100644 --- a/workspaces/tarball/src/manifest.ts +++ b/workspaces/tarball/src/manifest.ts @@ -4,7 +4,7 @@ import path from "node:path"; import crypto from "node:crypto"; // Import Third-party Dependencies -import * as npm from "@npm/types"; +import type { PackageJson } from "@npm/types"; import { parseAuthor } from "@nodesecure/utils"; // Import Internal Dependencies @@ -17,7 +17,7 @@ const kNativeNpmPackages = new Set([ ]); const kNodemodulesBinPrefix = "node_modules/.bin/"; -export type PackageJSON = npm.PackageJson & { +export type PackageJSON = PackageJson & { type?: "script" | "module"; gypfile?: boolean; imports?: Record; diff --git a/workspaces/tarball/src/sast/file.ts b/workspaces/tarball/src/sast/file.ts index c763467..f6b07cf 100644 --- a/workspaces/tarball/src/sast/file.ts +++ b/workspaces/tarball/src/sast/file.ts @@ -4,8 +4,8 @@ import path from "node:path"; // Import Third-party Dependencies import { runASTAnalysisOnFile, - WarningName, - WarningDefault + type WarningName, + type WarningDefault } from "@nodesecure/js-x-ray"; // Import Internal Dependencies diff --git a/workspaces/tarball/src/tarball.ts b/workspaces/tarball/src/tarball.ts index 7ebc6c3..50a0227 100644 --- a/workspaces/tarball/src/tarball.ts +++ b/workspaces/tarball/src/tarball.ts @@ -4,7 +4,11 @@ import os from "node:os"; import timers from "node:timers/promises"; // Import Third-party Dependencies -import { runASTAnalysisOnFile, Warning, Dependency } from "@nodesecure/js-x-ray"; +import { + runASTAnalysisOnFile, + type Warning, + type Dependency +} from "@nodesecure/js-x-ray"; import Locker from "@slimio/lock"; import pacote from "pacote"; import * as ntlp from "@nodesecure/ntlp"; @@ -18,10 +22,11 @@ import { getSemVerWarning } from "./utils/index.js"; import { NPM_TOKEN } from "./constants.js"; -import { DependencyRef } from "./types.js"; import * as manifest from "./manifest.js"; import * as sast from "./sast/index.js"; +import type { DependencyRef } from "./types.js"; + // CONSTANTS const kNativeCodeExtensions = new Set([".gyp", ".c", ".cpp", ".node", ".so", ".h"]); const kJsExtname = new Set([".js", ".mjs", ".cjs"]); @@ -224,3 +229,5 @@ export async function scanPackage( ast: { dependencies, warnings } }; } + +export type { DependencyRef }; diff --git a/workspaces/tarball/src/types.ts b/workspaces/tarball/src/types.ts index 2002a5c..b33f20e 100644 --- a/workspaces/tarball/src/types.ts +++ b/workspaces/tarball/src/types.ts @@ -7,7 +7,7 @@ export interface DependencyRef { flags: string[]; description: string; size: number; - authors: Record; + author: Record; engines: Record; repository: any; scripts: Record; diff --git a/workspaces/tarball/src/utils/analyzeDependencies.ts b/workspaces/tarball/src/utils/analyzeDependencies.ts index cc5e755..7f2b619 100644 --- a/workspaces/tarball/src/utils/analyzeDependencies.ts +++ b/workspaces/tarball/src/utils/analyzeDependencies.ts @@ -1,5 +1,6 @@ // Import Third-party Dependencies import difference from "lodash.difference"; +// @ts-ignore import builtins from "builtins"; // Import Internal Dependencies @@ -90,7 +91,8 @@ function buildSubpathDependency( alias: string, nodeImports: Record ): [string, string] { - const importedDependency = nodeImports[alias].node ?? nodeImports[alias].default; + const importEntry = nodeImports[alias]!; + const importedDependency = importEntry.node ?? importEntry.default; return [alias, importedDependency]; } diff --git a/workspaces/tarball/src/utils/getPackageName.ts b/workspaces/tarball/src/utils/getPackageName.ts index 12e2fa7..e702603 100644 --- a/workspaces/tarball/src/utils/getPackageName.ts +++ b/workspaces/tarball/src/utils/getPackageName.ts @@ -15,5 +15,5 @@ export function getPackageName( const parts = name.split(kPackageSeparator); // Note: only scoped package are allowed to start with @ - return name.startsWith(kPackageOrgSymbol) ? `${parts[0]}/${parts[1]}` : parts[0]; + return name.startsWith(kPackageOrgSymbol) ? `${parts[0]}/${parts[1]}` : parts[0]!; } diff --git a/workspaces/tarball/src/utils/getSemverWarning.ts b/workspaces/tarball/src/utils/getSemverWarning.ts index 0cf3ed7..1012e54 100644 --- a/workspaces/tarball/src/utils/getSemverWarning.ts +++ b/workspaces/tarball/src/utils/getSemverWarning.ts @@ -1,5 +1,5 @@ // // Import Third-party Dependencies -import { WarningDefault } from "@nodesecure/js-x-ray"; +import type { WarningDefault } from "@nodesecure/js-x-ray"; export function getSemVerWarning( value: string diff --git a/workspaces/tarball/tsconfig.json b/workspaces/tarball/tsconfig.json index de4ebfc..46c5082 100644 --- a/workspaces/tarball/tsconfig.json +++ b/workspaces/tarball/tsconfig.json @@ -1,19 +1,29 @@ { "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", + /* Base Options: */ "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + /* Others */ + "module": "NodeNext", + "rootDir": "src", + "outDir": "dist", "sourceMap": true, - "rootDir": "./src", - "types": ["node"] + "declaration": true, + "composite": false, + "declarationMap": true, + "lib": ["es2022"] }, "include": ["src"], "exclude": ["node_modules", "dist"] diff --git a/workspaces/tree-walker/package.json b/workspaces/tree-walker/package.json index 2868b41..e9bc7b8 100644 --- a/workspaces/tree-walker/package.json +++ b/workspaces/tree-walker/package.json @@ -6,7 +6,7 @@ "exports": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc", + "build": "tsc -b", "prepublishOnly": "npm run build", "test-only": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "test": "c8 -r html npm run test-only" @@ -28,5 +28,8 @@ "itertools": "^2.3.1", "pacote": "^18.0.4", "semver": "^7.6.0" + }, + "devDependencies": { + "@types/npmcli__arborist": "^5.6.9" } } diff --git a/workspaces/tree-walker/src/Dependency.class.ts b/workspaces/tree-walker/src/Dependency.class.ts index 191eee0..a3c7b99 100644 --- a/workspaces/tree-walker/src/Dependency.class.ts +++ b/workspaces/tree-walker/src/Dependency.class.ts @@ -84,7 +84,7 @@ export class Dependency { flags: this.flags, description: "", size: 0, - author: {}, + author: null, engines: {}, repository: {}, scripts: {}, @@ -109,14 +109,16 @@ export class Dependency { metadata: { dependencyCount: this.dependencyCount, publishedCount: 0, - lastUpdateAt: null, - lastVersion: null, + lastUpdateAt: new Date(), + lastVersion: "N/A", + hasChangedAuthor: false, hasManyPublishers: false, hasReceivedUpdateInOneYear: true, homepage: null, - author: {}, + author: null, publishers: [], - maintainers: [] + maintainers: [], + integrity: {} } }; } diff --git a/workspaces/tree-walker/src/npm/walker.ts b/workspaces/tree-walker/src/npm/walker.ts index 32636c8..dc28ccf 100644 --- a/workspaces/tree-walker/src/npm/walker.ts +++ b/workspaces/tree-walker/src/npm/walker.ts @@ -8,6 +8,7 @@ import combineAsyncIterators from "combine-async-iterators"; import * as iter from "itertools"; import pacote from "pacote"; import Arborist from "@npmcli/arborist"; +import type { PackageJson } from "@npm/types"; // Import Internal Dependencies import * as utils from "../utils/index.js"; @@ -98,7 +99,7 @@ export async function* searchDependencies( export interface SearchLockOptions extends DefaultSearchOptions { parent: Dependency; - to: any; + to: Arborist.Node; includeDevDeps?: boolean; fullLockMode?: boolean; } @@ -127,7 +128,7 @@ export async function* searchLockDependencies( current.addFlag("isDeprecated"); current.addFlag("hasCustomResolver", customResolvers.size > 0); - if (utils.isGitDependency(to.resolved)) { + if (to.resolved && utils.isGitDependency(to.resolved)) { current.isGit(to.resolved); } } @@ -159,11 +160,11 @@ export interface WalkOptions extends DefaultSearchOptions { fullLockMode: boolean; usePackageLock: boolean; includeDevDeps: boolean; - location: string; + location: string | undefined; } export async function* walk( - manifest: pacote.AbbreviatedManifest & pacote.ManifestResult, + manifest: PackageJson | pacote.AbbreviatedManifest & pacote.ManifestResult, options: WalkOptions ): AsyncIterableIterator { const { @@ -200,9 +201,9 @@ export async function* walk( path: location, registry }); - let tree: any; + let tree: Arborist.Node; try { - await fs.access(path.join(location, "node_modules")); + await fs.access(path.join(location!, "node_modules")); tree = await arb.loadActual(); } catch { @@ -212,7 +213,7 @@ export async function* walk( iterators = [ ...iter .filter(tree.edgesOut.entries(), ([, { to }]) => to !== null && (includeDevDeps ? true : (!to.dev || to.isWorkspace))) - .map(([packageName, { to }]) => [packageName, to.isWorkspace ? to.target : to]) + .map(([packageName, { to }]) => [packageName, to.isWorkspace ? to.target : to] as const) .map(([packageName, to]) => searchLockDependencies(packageName, { to, parent, diff --git a/workspaces/tree-walker/src/utils/mergeDependencies.ts b/workspaces/tree-walker/src/utils/mergeDependencies.ts index e4efbaa..bad0e3b 100644 --- a/workspaces/tree-walker/src/utils/mergeDependencies.ts +++ b/workspaces/tree-walker/src/utils/mergeDependencies.ts @@ -1,5 +1,6 @@ // Import Third-party Dependencies import pacote from "pacote"; +import type { PackageJson } from "@npm/types"; export type NpmDependency = "dependencies" | @@ -10,17 +11,22 @@ export type NpmDependency = "bundledDependencies"; export function mergeDependencies( - manifest: Partial, + manifest: + Partial | + Partial, types: NpmDependency[] = ["dependencies"] as const ) { - const dependencies = new Map(); - const customResolvers = new Map(); - const alias = new Map(); + const dependencies = new Map(); + const customResolvers = new Map(); + const alias = new Map(); for (const fieldName of types) { if (!(fieldName in manifest)) { continue; } + + // FIX: replace @npm/types with up to date interface + // @ts-ignore const dep = manifest[fieldName] as Record; for (const [name, version] of Object.entries(dep)) { diff --git a/workspaces/tree-walker/tsconfig.json b/workspaces/tree-walker/tsconfig.json index de4ebfc..46c5082 100644 --- a/workspaces/tree-walker/tsconfig.json +++ b/workspaces/tree-walker/tsconfig.json @@ -1,19 +1,29 @@ { "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", + /* Base Options: */ "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + /* Others */ + "module": "NodeNext", + "rootDir": "src", + "outDir": "dist", "sourceMap": true, - "rootDir": "./src", - "types": ["node"] + "declaration": true, + "composite": false, + "declarationMap": true, + "lib": ["es2022"] }, "include": ["src"], "exclude": ["node_modules", "dist"]