From dde173cb39d1ed0bdf2fe614690a8805669bff89 Mon Sep 17 00:00:00 2001 From: jdalton Date: Wed, 17 Jul 2024 08:30:03 -0400 Subject: [PATCH] Unify code-base as ts and transpile to cjs for publish --- .config/babel.config.js | 39 + .config/rollup.base.config.mjs | 229 + .config/rollup.dist.config.mjs | 102 + .config/rollup.test.config.mjs | 26 + .config/tsconfig.base.json | 32 + .config/tsconfig.rollup.json | 7 + .config/tsconfig.tap.json | 6 + .dep-stats.json | 136 + .eslintignore | 7 +- .eslintrc | 16 - .eslintrc.js | 38 + .gitignore | 14 +- .prettierignore | 5 + .prettierrc | 9 +- .taprc | 15 + README.md | 44 +- bin/npm | 2 + bin/npx | 2 + cli.js | 72 - lib/commands/audit-log/index.js | 162 - lib/commands/dependencies/index.js | 150 - lib/commands/index.js | 14 - lib/commands/info/index.js | 287 - lib/commands/login/index.js | 170 - lib/commands/raw-npm/index.js | 59 - lib/commands/report/create.js | 251 - lib/commands/report/view.js | 176 - lib/commands/repos/create.js | 166 - lib/commands/repos/delete.js | 93 - lib/commands/repos/update.js | 166 - lib/commands/repos/view.js | 128 - lib/commands/scan/delete.js | 112 - lib/commands/scan/metadata.js | 113 - lib/commands/scan/stream.js | 115 - lib/flags/command.js | 14 - lib/flags/index.js | 3 - lib/flags/output.js | 16 - lib/flags/validation.js | 14 - lib/shadow/bin/npm | 2 - lib/shadow/bin/npx | 2 - lib/shadow/link.cjs | 50 - lib/shadow/npm-cli.cjs | 27 - lib/shadow/npm-injection.cjs | 649 - lib/shadow/npx-cli.cjs | 27 - lib/shadow/package.json | 3 - lib/shadow/tty-server.cjs | 222 - lib/shadow/update-notifier.mjs | 3 - lib/utils/api-helpers.js | 42 - lib/utils/errors.js | 14 - lib/utils/flags.js | 27 - lib/utils/format-issues.js | 99 - lib/utils/formatting.js | 47 - lib/utils/issue-rules.cjs | 180 - lib/utils/meow-with-subcommands.js | 87 - lib/utils/misc.js | 61 - lib/utils/path-resolve.js | 204 - lib/utils/sdk.js | 99 - lib/utils/settings.js | 69 - lib/utils/type-helpers.cjs | 13 - lib/utils/update-notifier.js | 18 - package-lock.json | 12143 +++++++++++----- package.json | 131 +- scripts/files.js | 11 + scripts/objects.js | 18 + scripts/packages.js | 115 + scripts/paths.js | 73 + scripts/rollup/socket-modify-plugin.js | 38 + scripts/sorts.js | 15 + scripts/strings.js | 34 + src/cli.ts | 80 + src/commands/audit-log.ts | 181 + .../cdxgen/index.js => src/commands/cdxgen.ts | 49 +- src/commands/dependencies.ts | 158 + src/commands/index.ts | 14 + src/commands/info.ts | 301 + src/commands/login.ts | 153 + .../logout/index.js => src/commands/logout.ts | 24 +- .../npm/index.js => src/commands/npm.ts | 12 +- .../npx/index.js => src/commands/npx.ts | 10 +- src/commands/raw-npm.ts | 61 + .../index.js => src/commands/raw-npx.ts | 47 +- src/commands/report/create.ts | 307 + .../index.js => src/commands/report/index.ts | 15 +- src/commands/report/view.ts | 215 + src/commands/repos/create.ts | 174 + src/commands/repos/delete.ts | 100 + .../index.js => src/commands/repos/index.ts | 19 +- .../list.js => src/commands/repos/list.ts | 126 +- src/commands/repos/update.ts | 174 + src/commands/repos/view.ts | 132 + .../create.js => src/commands/scan/create.ts | 197 +- src/commands/scan/delete.ts | 116 + .../index.js => src/commands/scan/index.ts | 19 +- .../scan/list.js => src/commands/scan/list.ts | 145 +- src/commands/scan/metadata.ts | 116 + src/commands/scan/stream.ts | 123 + .../index.js => src/commands/wrapper.ts | 157 +- src/flags.ts | 40 + src/shadow/link.ts | 38 + src/shadow/npm-cli.ts | 29 + src/shadow/npm-injection.ts | 625 + src/shadow/npx-cli.ts | 29 + src/shadow/tty-server.ts | 272 + src/utils/api-helpers.ts | 48 + .../utils/chalk-markdown.ts | 94 +- src/utils/errors.ts | 11 + src/utils/format-issues.ts | 71 + src/utils/formatting.ts | 53 + src/utils/issue-rules.ts | 180 + src/utils/meow-with-subcommands.ts | 82 + src/utils/misc.ts | 46 + src/utils/path-resolve.ts | 137 + src/utils/sdk.ts | 86 + src/utils/settings.ts | 68 + src/utils/type-helpers.ts | 8 + test/.eslintrc | 5 +- test/issue-rule-ux.test.js | 317 - test/issue-rule-ux.test.ts | 369 + ...h-resolve.test.js => path-resolve.test.ts} | 312 +- ...t-cdxgen.test.js => socket-cdxgen.test.ts} | 24 +- .../lacking-typosquat/package.json | 3 +- test/socket-npm.test.cjs | 43 + test/socket-npm.test.js | 52 - ...t-helpers.test.js => test-helpers.test.ts} | 9 +- .../translations.json => translations.json | 40 +- tsconfig.json | 37 +- 126 files changed, 14798 insertions(+), 9088 deletions(-) create mode 100644 .config/babel.config.js create mode 100644 .config/rollup.base.config.mjs create mode 100644 .config/rollup.dist.config.mjs create mode 100644 .config/rollup.test.config.mjs create mode 100644 .config/tsconfig.base.json create mode 100644 .config/tsconfig.rollup.json create mode 100644 .config/tsconfig.tap.json create mode 100644 .dep-stats.json delete mode 100644 .eslintrc create mode 100644 .eslintrc.js create mode 100644 .prettierignore create mode 100644 .taprc create mode 100755 bin/npm create mode 100755 bin/npx delete mode 100755 cli.js delete mode 100644 lib/commands/audit-log/index.js delete mode 100644 lib/commands/dependencies/index.js delete mode 100644 lib/commands/index.js delete mode 100644 lib/commands/info/index.js delete mode 100644 lib/commands/login/index.js delete mode 100644 lib/commands/raw-npm/index.js delete mode 100644 lib/commands/report/create.js delete mode 100644 lib/commands/report/view.js delete mode 100644 lib/commands/repos/create.js delete mode 100644 lib/commands/repos/delete.js delete mode 100644 lib/commands/repos/update.js delete mode 100644 lib/commands/repos/view.js delete mode 100644 lib/commands/scan/delete.js delete mode 100644 lib/commands/scan/metadata.js delete mode 100644 lib/commands/scan/stream.js delete mode 100644 lib/flags/command.js delete mode 100644 lib/flags/index.js delete mode 100644 lib/flags/output.js delete mode 100644 lib/flags/validation.js delete mode 100755 lib/shadow/bin/npm delete mode 100755 lib/shadow/bin/npx delete mode 100644 lib/shadow/link.cjs delete mode 100755 lib/shadow/npm-cli.cjs delete mode 100644 lib/shadow/npm-injection.cjs delete mode 100755 lib/shadow/npx-cli.cjs delete mode 100644 lib/shadow/package.json delete mode 100644 lib/shadow/tty-server.cjs delete mode 100644 lib/shadow/update-notifier.mjs delete mode 100644 lib/utils/api-helpers.js delete mode 100644 lib/utils/errors.js delete mode 100644 lib/utils/flags.js delete mode 100644 lib/utils/format-issues.js delete mode 100644 lib/utils/formatting.js delete mode 100644 lib/utils/issue-rules.cjs delete mode 100644 lib/utils/meow-with-subcommands.js delete mode 100644 lib/utils/misc.js delete mode 100644 lib/utils/path-resolve.js delete mode 100644 lib/utils/sdk.js delete mode 100644 lib/utils/settings.js delete mode 100644 lib/utils/type-helpers.cjs delete mode 100644 lib/utils/update-notifier.js create mode 100644 scripts/files.js create mode 100644 scripts/objects.js create mode 100644 scripts/packages.js create mode 100644 scripts/paths.js create mode 100644 scripts/rollup/socket-modify-plugin.js create mode 100644 scripts/sorts.js create mode 100644 scripts/strings.js create mode 100755 src/cli.ts create mode 100644 src/commands/audit-log.ts rename lib/commands/cdxgen/index.js => src/commands/cdxgen.ts (81%) create mode 100644 src/commands/dependencies.ts create mode 100644 src/commands/index.ts create mode 100644 src/commands/info.ts create mode 100644 src/commands/login.ts rename lib/commands/logout/index.js => src/commands/logout.ts (66%) rename lib/commands/npm/index.js => src/commands/npm.ts (65%) rename lib/commands/npx/index.js => src/commands/npx.ts (65%) create mode 100644 src/commands/raw-npm.ts rename lib/commands/raw-npx/index.js => src/commands/raw-npx.ts (52%) create mode 100644 src/commands/report/create.ts rename lib/commands/report/index.js => src/commands/report/index.ts (58%) create mode 100644 src/commands/report/view.ts create mode 100644 src/commands/repos/create.ts create mode 100644 src/commands/repos/delete.ts rename lib/commands/repos/index.js => src/commands/repos/index.ts (54%) rename lib/commands/repos/list.js => src/commands/repos/list.ts (51%) create mode 100644 src/commands/repos/update.ts create mode 100644 src/commands/repos/view.ts rename lib/commands/scan/create.js => src/commands/scan/create.ts (50%) create mode 100644 src/commands/scan/delete.ts rename lib/commands/scan/index.js => src/commands/scan/index.ts (54%) rename lib/commands/scan/list.js => src/commands/scan/list.ts (50%) create mode 100644 src/commands/scan/metadata.ts create mode 100644 src/commands/scan/stream.ts rename lib/commands/wrapper/index.js => src/commands/wrapper.ts (50%) create mode 100644 src/flags.ts create mode 100644 src/shadow/link.ts create mode 100755 src/shadow/npm-cli.ts create mode 100644 src/shadow/npm-injection.ts create mode 100755 src/shadow/npx-cli.ts create mode 100644 src/shadow/tty-server.ts create mode 100644 src/utils/api-helpers.ts rename lib/utils/chalk-markdown.js => src/utils/chalk-markdown.ts (51%) create mode 100644 src/utils/errors.ts create mode 100644 src/utils/format-issues.ts create mode 100644 src/utils/formatting.ts create mode 100644 src/utils/issue-rules.ts create mode 100644 src/utils/meow-with-subcommands.ts create mode 100644 src/utils/misc.ts create mode 100644 src/utils/path-resolve.ts create mode 100644 src/utils/sdk.ts create mode 100644 src/utils/settings.ts create mode 100644 src/utils/type-helpers.ts delete mode 100644 test/issue-rule-ux.test.js create mode 100644 test/issue-rule-ux.test.ts rename test/{path-resolve.test.js => path-resolve.test.ts} (58%) rename test/{socket-cdxgen.test.js => socket-cdxgen.test.ts} (52%) create mode 100644 test/socket-npm.test.cjs delete mode 100644 test/socket-npm.test.js rename test/{test-helpers.test.js => test-helpers.test.ts} (69%) rename lib/shadow/translations.json => translations.json (96%) diff --git a/.config/babel.config.js b/.config/babel.config.js new file mode 100644 index 00000000..19e75ea9 --- /dev/null +++ b/.config/babel.config.js @@ -0,0 +1,39 @@ +'use strict' + +const { isEsmId } = require('../scripts/packages') + +module.exports = { + plugins: [ + '@babel/plugin-proposal-export-default-from', + '@babel/plugin-transform-export-namespace-from', + [ + '@babel/plugin-transform-runtime', + { + absoluteRuntime: false, + corejs: false, + helpers: true, + regenerator: false, + version: '^7.24.6' + } + ], + [ + '@babel/plugin-transform-modules-commonjs', + { + allowTopLevelThis: true, + importInterop: (specifier, requestingFilename) => { + if (requestingFilename) { + const specIsEsm = isEsmId(specifier, requestingFilename) + const parentIsEsm = isEsmId(requestingFilename) + if (specIsEsm && parentIsEsm) { + return 'none' + } + if (specIsEsm) { + return 'babel' + } + } + return 'node' + } + } + ] + ] +} diff --git a/.config/rollup.base.config.mjs b/.config/rollup.base.config.mjs new file mode 100644 index 00000000..e364bbe1 --- /dev/null +++ b/.config/rollup.base.config.mjs @@ -0,0 +1,229 @@ +import { builtinModules, createRequire } from 'node:module' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import commonjs from '@rollup/plugin-commonjs' +import replace from '@rollup/plugin-replace' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import rangesIntersect from 'semver/ranges/intersects.js' +import { readPackageUpSync } from 'read-package-up' + +import { loadJSON } from '../scripts/files.js' +import { + getPackageName, + getPackageNameEnd, + isEsmId, + normalizeId, + isPackageName, + isBuiltin, + resolveId +} from '../scripts/packages.js' +import { escapeRegExp } from '../scripts/strings.js' +import socketModifyPlugin from '../scripts/rollup/socket-modify-plugin.js' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) +const require = createRequire(import.meta.url) + +const ts = require('rollup-plugin-ts') + +const ENTRY_SUFFIX = '?commonjs-entry' +const EXTERNAL_SUFFIX = '?commonjs-external' + +const builtinAliases = builtinModules.reduce((o, n) => { + o[n] = `node:${n}` + return o +}, {}) + +const rootPath = path.resolve(__dirname, '..') +const babelConfigPath = path.join(__dirname, 'babel.config.js') +const tsconfigPath = path.join(__dirname, 'tsconfig.rollup.json') + +const babelConfig = require(babelConfigPath) +const { dependencies: pkgDeps, devDependencies: pkgDevDeps } = loadJSON( + path.resolve(rootPath, 'package.json') +) + +const customResolver = nodeResolve({ + exportConditions: ['node'], + preferBuiltins: true +}) + +export default (extendConfig = {}) => { + const depStats = { + dependencies: { __proto__: null }, + devDependencies: { __proto__: null }, + esm: { __proto__: null }, + external: { __proto__: null }, + transitives: { __proto__: null } + } + + const config = { + __proto__: { + meta: { + depStats + } + }, + external(id_, parentId_) { + if (id_.endsWith(EXTERNAL_SUFFIX) || isBuiltin(id_)) { + return true + } + const id = normalizeId(id_) + if (id.endsWith('.cjs') || id.endsWith('.json')) { + return true + } + if ( + id.endsWith('.mjs') || + id.endsWith('.mts') || + id.endsWith('.ts') || + !isPackageName(id) + ) { + return false + } + const name = getPackageName(id) + const parentId = parentId_ ? resolveId(parentId_) : undefined + const resolvedId = resolveId(id, parentId) + if (isEsmId(resolvedId, parentId)) { + const parentPkg = parentId + ? readPackageUpSync({ cwd: path.dirname(parentId) })?.packageJson + : undefined + depStats.esm[name] = + pkgDeps[name] ?? + pkgDevDeps[name] ?? + parentPkg?.dependencies?.[name] ?? + parentPkg?.optionalDependencies?.[name] ?? + parentPkg?.peerDependencies?.[name] ?? + readPackageUpSync({ cwd: path.dirname(resolvedId) })?.packageJson + ?.version ?? + '' + return false + } + const parentNodeModulesIndex = parentId.lastIndexOf('/node_modules/') + if (parentNodeModulesIndex !== -1) { + const parentNameStart = parentNodeModulesIndex + 14 + const parentNameEnd = getPackageNameEnd(parentId, parentNameStart) + const { + version, + dependencies = {}, + optionalDependencies = {}, + peerDependencies = {} + } = loadJSON(`${parentId.slice(0, parentNameEnd)}/package.json`) + const curRange = + dependencies[name] ?? + optionalDependencies[name] ?? + peerDependencies[name] ?? + version + const seenRange = pkgDeps[name] ?? depStats.external[name] + if (seenRange) { + return rangesIntersect(seenRange, curRange) + } + depStats.external[name] = curRange + depStats.transitives[name] = curRange + } else if (pkgDeps[name]) { + depStats.external[name] = pkgDeps[name] + depStats.dependencies[name] = pkgDeps[name] + } else if (pkgDevDeps[name]) { + depStats.devDependencies[name] = pkgDevDeps[name] + } + return true + }, + ...extendConfig, + plugins: [ + customResolver, + ts({ + transpiler: 'babel', + browserslist: false, + transpileOnly: true, + exclude: ['**/*.json'], + babelConfig, + tsconfig: tsconfigPath + }), + // Convert un-prefixed built-in imports into "node:"" prefixed forms. + replace({ + delimiters: ['(?<=(?:require\\(|from\\s*)["\'])', '(?=["\'])'], + preventAssignment: false, + values: builtinAliases + }), + // Convert `require('u' + 'rl')` into something like `require$$2$3`. + socketModifyPlugin({ + find: /require\('u' \+ 'rl'\)/g, + replace(match) { + return ( + /(?<=var +)[$\w]+(?= *= *require\('node:url'\))/.exec( + this.input + )?.[0] ?? match + ) + } + }), + // Remove bare require calls, e.g. require calls not associated with an + // import binding: + // require('node:util') + // require('graceful-fs') + socketModifyPlugin({ + find: /^\s*require\(["'].+?["']\);?\r?\n/gm, + replace: '' + }), + // Fix incorrectly set "spinners" binding caused by a transpilation bug + // https://github.com/sindresorhus/ora/blob/main/index.js#L416C2-L416C50 + // export {default as spinners} from 'cli-spinners' + socketModifyPlugin({ + find: /(?<=ora[^.]+\.spinners\s*=\s*)[$\w]+/g, + replace(match) { + return ( + new RegExp(`(?<=${escapeRegExp(match)}\\s*=\\s*)[$\\w]+`).exec( + this.input + )?.[0] ?? match + ) + } + }), + commonjs({ + ignoreDynamicRequires: true, + ignoreGlobal: true, + ignoreTryCatch: true, + defaultIsModuleExports: true, + transformMixedEsModules: true, + extensions: ['.cjs', '.js', '.ts', `.ts${ENTRY_SUFFIX}`] + }), + ...(extendConfig.plugins ?? []) + ] + } + + const output = ( + Array.isArray(config.output) + ? config.output + : config.output + ? [config.output] + : [] + ).map(o => ({ + ...o, + chunkFileNames: '[name].js', + manualChunks(id) { + if (id.includes('/node_modules/')) { + return 'vendor' + } + } + })) + + // Replace hard-coded absolute paths in source with hard-coded relative paths. + const replacePlugin = replace({ + delimiters: ['(?<=["\'])', '/'], + preventAssignment: false, + values: { + [rootPath]: '../' + } + }) + + const replaceOutputPlugin = { + name: replacePlugin.name, + renderChunk: replacePlugin.renderChunk + } + + for (const o of output) { + o.plugins = [ + ...(Array.isArray(o.plugins) ? o.plugins : []), + replaceOutputPlugin + ] + } + + config.output = output + return config +} diff --git a/.config/rollup.dist.config.mjs b/.config/rollup.dist.config.mjs new file mode 100644 index 00000000..e1b13677 --- /dev/null +++ b/.config/rollup.dist.config.mjs @@ -0,0 +1,102 @@ +import { chmodSync, readFileSync, writeFileSync } from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import { loadJSON } from '../scripts/files.js' +import { hasKeys } from '../scripts/objects.js' +import { toSortedObject } from '../scripts/sorts.js' +import { formatObject } from '../scripts/strings.js' + +import baseConfig from './rollup.base.config.mjs' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + +const rootPath = path.resolve(__dirname, '..') +const depStatsPath = path.join(rootPath, '.dep-stats.json') +const distPath = path.join(rootPath, 'dist') +const srcPath = path.join(rootPath, 'src') + +const pkgJSONPath = path.resolve(rootPath, 'package.json') +const pkgJSON = loadJSON(pkgJSONPath) + +export default () => { + const config = baseConfig({ + input: { + cli: `${srcPath}/cli.ts`, + 'npm-cli': `${srcPath}/shadow/npm-cli.ts`, + 'npx-cli': `${srcPath}/shadow/npx-cli.ts`, + 'npm-injection': `${srcPath}/shadow/npm-injection.ts` + }, + output: [ + { + dir: 'dist', + entryFileNames: '[name].js', + format: 'cjs', + exports: 'auto', + externalLiveBindings: false, + freeze: false + } + ], + plugins: [ + { + writeBundle() { + const { '@cyclonedx/cdxgen': cdxgenRange, synp: synpRange } = + pkgJSON.dependencies + const { depStats } = config.meta + + // Manually add @cyclonedx/cdxgen and synp as they are not directly + // referenced in the code but used through spawned processes. + depStats.dependencies['@cyclonedx/cdxgen'] = cdxgenRange + depStats.dependencies.synp = synpRange + depStats.external['@cyclonedx/cdxgen'] = cdxgenRange + depStats.external.synp = synpRange + + try { + // Remove transitives from dependencies + const oldDepStats = loadJSON(depStatsPath) + for (const key of Object.keys(oldDepStats.transitives)) { + if (pkgJSON.dependencies[key]) { + depStats.transitives[key] = pkgJSON.dependencies[key] + depStats.external[key] = pkgJSON.dependencies[key] + delete depStats.dependencies[key] + } + } + } catch {} + + depStats.dependencies = toSortedObject(depStats.dependencies) + depStats.devDependencies = toSortedObject(depStats.devDependencies) + depStats.esm = toSortedObject(depStats.esm) + depStats.external = toSortedObject(depStats.external) + depStats.transitives = toSortedObject(depStats.transitives) + + // Write dep stats + writeFileSync(depStatsPath, `${formatObject(depStats)}\n`, 'utf8') + + // Make dist files chmod +x + chmodSync(path.join(distPath, 'cli.js'), 0o755) + chmodSync(path.join(distPath, 'npm-cli.js'), 0o755) + chmodSync(path.join(distPath, 'npx-cli.js'), 0o755) + + // Update dependencies with additional inlined modules + writeFileSync( + pkgJSONPath, + readFileSync(pkgJSONPath, 'utf8').replace( + /(?<="dependencies":\s*)\{[^\}]*\}/, + () => { + const deps = { + ...depStats.dependencies, + ...depStats.transitives + } + const formatted = formatObject(deps, 4) + return hasKeys(deps) ? formatted.replace('}', ' }') : formatted + } + ), + 'utf8' + ) + } + } + ] + }) + + return config +} diff --git a/.config/rollup.test.config.mjs b/.config/rollup.test.config.mjs new file mode 100644 index 00000000..52b7da29 --- /dev/null +++ b/.config/rollup.test.config.mjs @@ -0,0 +1,26 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import baseConfig from './rollup.base.config.mjs' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + +const rootPath = path.resolve(__dirname, '..') +const srcPath = path.join(rootPath, 'src') + +export default () => + baseConfig({ + input: { + 'path-resolve': `${srcPath}/utils/path-resolve.ts` + }, + output: [ + { + dir: 'test/dist', + entryFileNames: '[name].js', + format: 'cjs', + exports: 'auto', + externalLiveBindings: false, + freeze: false + } + ] + }) diff --git a/.config/tsconfig.base.json b/.config/tsconfig.base.json new file mode 100644 index 00000000..e6424ebc --- /dev/null +++ b/.config/tsconfig.base.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "allowJs": false, + "composite": true, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "incremental": true, + "isolatedModules": true, + "lib": ["esnext"], + "noEmit": true, + "noEmitOnError": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "strictNullChecks": true, + "target": "esnext", + + /* New checks being tried out */ + "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noUncheckedIndexedAccess": true, + + /* Additional checks */ + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/.config/tsconfig.rollup.json b/.config/tsconfig.rollup.json new file mode 100644 index 00000000..b58469bb --- /dev/null +++ b/.config/tsconfig.rollup.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "preserve", + "moduleResolution": "bundler" + } +} diff --git a/.config/tsconfig.tap.json b/.config/tsconfig.tap.json new file mode 100644 index 00000000..05d1a51e --- /dev/null +++ b/.config/tsconfig.tap.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "commonjs" + } +} diff --git a/.dep-stats.json b/.dep-stats.json new file mode 100644 index 00000000..460c861d --- /dev/null +++ b/.dep-stats.json @@ -0,0 +1,136 @@ +{ + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.6", + "@cyclonedx/cdxgen": "^10.8.9", + "@inquirer/prompts": "^5.3.2", + "@socketsecurity/config": "^2.1.3", + "@socketsecurity/sdk": "^1.2.0", + "chalk-table": "^1.0.2", + "hpagent": "^1.2.0", + "ignore": "^5.3.1", + "ignore-by-default": "^2.1.0", + "pacote": "^18.0.6", + "pony-cause": "^2.1.11", + "synp": "^1.9.13", + "which": "^4.0.0", + "yargs-parser": "^21.1.1" + }, + "devDependencies": {}, + "esm": { + "@sindresorhus/merge-streams": "^4.0.0", + "ansi-escapes": "^5.0.0", + "ansi-regex": "^6.0.1", + "ansi-styles": "^6.1.0", + "boxen": "^7.1.1", + "bundle-name": "^4.1.0", + "camelcase": "^7.0.1", + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "configstore": "^6.0.0", + "crypto-random-string": "^4.0.0", + "default-browser": "^5.2.1", + "default-browser-id": "^5.0.0", + "define-lazy-prop": "^3.0.0", + "escape-goat": "^4.0.0", + "execa": "^9.3.0", + "figures": "^6.1.0", + "get-east-asian-width": "^1.0.0", + "get-stream": "^9.0.0", + "global-directory": "^4.0.1", + "globby": "^14.0.2", + "human-signals": "^7.0.0", + "is-docker": "^3.0.0", + "is-in-ci": "^0.1.0", + "is-inside-container": "^1.0.0", + "is-installed-globally": "^1.0.0", + "is-interactive": "^2.0.0", + "is-npm": "^6.0.0", + "is-path-inside": "^4.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "is-unicode-supported": "^2.0.0", + "is-wsl": "^3.1.0", + "ky": "^1.2.0", + "latest-version": "^9.0.0", + "log-symbols": "^6.0.0", + "meow": "^13.2.0", + "npm-run-path": "^5.2.0", + "open": "^10.1.0", + "ora": "^8.0.1", + "package-json": "^10.0.0", + "parse-ms": "^4.0.0", + "path-key": "^4.0.0", + "path-type": "^5.0.0", + "pretty-ms": "^9.0.0", + "pupa": "^3.1.0", + "registry-url": "^6.0.1", + "restore-cursor": "^4.0.0", + "run-applescript": "^7.0.0", + "semver-diff": "^4.0.0", + "slash": "^5.1.0", + "stdin-discarder": "^0.2.1", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1", + "strip-final-newline": "^4.0.0", + "terminal-link": "^3.0.0", + "unicorn-magic": "^0.1.0", + "unique-string": "^3.0.0", + "update-notifier": "^7.1.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0", + "xdg-basedir": "^5.0.1", + "yoctocolors": "^2.0.0" + }, + "external": { + "@apideck/better-ajv-errors": "^0.3.6", + "@cyclonedx/cdxgen": "^10.8.9", + "@inquirer/prompts": "^5.3.2", + "@socketsecurity/config": "^2.1.3", + "@socketsecurity/sdk": "^1.2.0", + "ansi-align": "^3.0.1", + "chalk-table": "^1.0.2", + "cli-boxes": "^3.0.0", + "cli-spinners": "^2.9.2", + "cross-spawn": "^7.0.3", + "dot-prop": "^6.0.1", + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.3.0", + "fast-glob": "^3.3.2", + "graceful-fs": "^4.2.6", + "hpagent": "^1.2.0", + "ignore": "^5.3.1", + "ignore-by-default": "^2.1.0", + "ini": "4.1.1", + "onetime": "^5.1.0", + "pacote": "^18.0.6", + "pony-cause": "^2.1.11", + "rc": "1.2.8", + "registry-auth-token": "^5.0.2", + "semver": "^7.6.2", + "signal-exit": "^4.1.0", + "supports-hyperlinks": "^2.2.0", + "synp": "^1.9.13", + "which": "^4.0.0", + "write-file-atomic": "^3.0.3", + "yargs-parser": "^21.1.1" + }, + "transitives": { + "ansi-align": "^3.0.1", + "cli-boxes": "^3.0.0", + "cli-spinners": "^2.9.2", + "cross-spawn": "^7.0.3", + "dot-prop": "^6.0.1", + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.3.0", + "fast-glob": "^3.3.2", + "graceful-fs": "^4.2.6", + "ini": "4.1.1", + "onetime": "^5.1.0", + "rc": "1.2.8", + "registry-auth-token": "^5.0.2", + "semver": "^7.6.2", + "signal-exit": "^4.1.0", + "supports-hyperlinks": "^2.2.0", + "write-file-atomic": "^3.0.3" + } +} diff --git a/.eslintignore b/.eslintignore index 930e4c4f..fad90a54 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,5 @@ -/coverage/**/* -/lib/types/api.d.ts +.github/ +coverage/ +**/dist +scripts/ +package-lock.json diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 6240ed0e..00000000 --- a/.eslintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "root": true, - "extends": [ - "@socketsecurity/eslint-config/jsdoc" - ], - "parserOptions": { - "project": "./tsconfig.json" - }, - "ignorePatterns": [ - "lib/shadow/bin" - ], - "rules": { - "@typescript-eslint/quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": false }], - "no-console": "warn" - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..00faaea5 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,38 @@ +'use strict' + +const path = require('node:path') + +const { includeIgnoreFile } = require('@eslint/compat') + +const { ignores } = includeIgnoreFile(path.join(__dirname, '.gitignore')) + +module.exports = { + ignorePatterns: ignores, + extends: ['@socketsecurity', 'plugin:import/typescript', 'prettier'], + parserOptions: { + project: ['./tsconfig.json'], + EXPERIMENTAL_useProjectService: { + maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: 1e10 + } + }, + rules: { + '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/no-floating-promises': [ + 'error', + { + ignoreVoid: true, + ignoreIIFE: true + } + ], + 'no-warning-comments': ['warn', { terms: ['fixme'] }], + // Returning unawaited promises in a try/catch/finally is dangerous + // (the `catch` won't catch if the promise is rejected, and the `finally` + // won't wait for the promise to resolve). Returning unawaited promises + // elsewhere is probably fine, but this lint rule doesn't have a way + // to only apply to try/catch/finally (the 'in-try-catch' option *enforces* + // not awaiting promises *outside* of try/catch/finally, which is not what + // we want), and it's nice to await before returning anyways, since you get + // a slightly more comprehensive stack trace upon promise rejection. + '@typescript-eslint/return-await': ['error', 'always'] + } +} diff --git a/.gitignore b/.gitignore index 0d52fb43..d0d18c77 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,13 @@ # Basic ones -/coverage -/coverage-ts -/node_modules -/.DS_Store +.DS_Store +/.eslintcache /.env -/.nyc_output +/.tap /.vscode - -/lib/shadow/bin +/coverage +**/dist +**/node_modules +/*.tsbuildinfo # We're a library, so please, no lock files /yarn.lock diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..fad90a54 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +.github/ +coverage/ +**/dist +scripts/ +package-lock.json diff --git a/.prettierrc b/.prettierrc index a209a01c..ddc7a325 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1 +1,8 @@ -"prettier-config-x-standard" \ No newline at end of file +{ + "arrowParens": "avoid", + "semi": false, + "singleQuote": true, + "jsxSingleQuote": true, + "trailingComma": "none", + "printWidth": 80 +} diff --git a/.taprc b/.taprc new file mode 100644 index 00000000..17fe021a --- /dev/null +++ b/.taprc @@ -0,0 +1,15 @@ +# vim: set filetype=yaml : +timeout: 1200 +color: true +include: + - test/**/*.test.ts +exclude: + - dist/** +tsconfig: .config/tsconfig.tap.json +typecheck: false +allow-incomplete-coverage: true +coverage-report: + - none +plugin: + - "!@tapjs/spawn" + - "!@tapjs/stdin" diff --git a/README.md b/README.md index 8203c172..2a122cdb 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ socket wrapper --enable ## Commands -* `socket info ` - looks up issues for a package +- `socket info ` - looks up issues for a package -* `socket report create ` - creates a report on [socket.dev](https://socket.dev/) +- `socket report create ` - creates a report on [socket.dev](https://socket.dev/) Uploads the specified `package.json` and lock files for JavaScript, Python, and Go dependency manifests. If any folder is specified, the ones found in there recursively are uploaded. @@ -34,40 +34,40 @@ socket wrapper --enable Ignores any file specified in your project's `.gitignore`, the `projectIgnorePaths` in your project's [`socket.yml`](https://docs.socket.dev/docs/socket-yml) and on top of that has a sensible set of [default ignores](https://www.npmjs.com/package/ignore-by-default) -* `socket report view ` - looks up issues and scores from a report +- `socket report view ` - looks up issues and scores from a report -* `socket wrapper --enable` and `socket wrapper --disable` - Enables and disables the Socket 'safe-npm' wrapper. +- `socket wrapper --enable` and `socket wrapper --disable` - Enables and disables the Socket 'safe-npm' wrapper. -* `socket raw-npm` and `socket raw-npx` - Temporarily disables the Socket 'safe-npm' wrapper. +- `socket raw-npm` and `socket raw-npx` - Temporarily disables the Socket 'safe-npm' wrapper. ## Aliases All aliases supports flags and arguments of the commands they alias. -* `socket ci` - alias for `socket report create --view --strict` which creates a report and quits with an exit code if the result is unhealthy. Use like eg. `socket ci .` for a report for the current folder +- `socket ci` - alias for `socket report create --view --strict` which creates a report and quits with an exit code if the result is unhealthy. Use like eg. `socket ci .` for a report for the current folder ## Flags ### Command specific flags -* `--view` - when set on `socket report create` the command will immediately do a `socket report view` style view of the created report, waiting for the server to complete it +- `--view` - when set on `socket report create` the command will immediately do a `socket report view` style view of the created report, waiting for the server to complete it ### Output flags -* `--json` - outputs result as json which you can then pipe into [`jq`](https://stedolan.github.io/jq/) and other tools -* `--markdown` - outputs result as markdown which you can then copy into an issue, PR or even chat +- `--json` - outputs result as json which you can then pipe into [`jq`](https://stedolan.github.io/jq/) and other tools +- `--markdown` - outputs result as markdown which you can then copy into an issue, PR or even chat ## Strictness flags -* `--all` - by default only `high` and `critical` issues are included, by setting this flag all issues will be included -* `--strict` - when set, exits with an error code if report result is deemed unhealthy +- `--all` - by default only `high` and `critical` issues are included, by setting this flag all issues will be included +- `--strict` - when set, exits with an error code if report result is deemed unhealthy ### Other flags -* `--dry-run` - like all CLI tools that perform an action should have, we have a dry run flag. Eg. `socket report create` supports running the command without actually uploading anything -* `--debug` - outputs additional debug output. Great for debugging, geeks and us who develop. Hopefully you will never _need_ it, but it can still be fun, right? -* `--help` - prints the help for the current command. All CLI tools should have this flag -* `--version` - prints the version of the tool. All CLI tools should have this flag +- `--dry-run` - like all CLI tools that perform an action should have, we have a dry run flag. Eg. `socket report create` supports running the command without actually uploading anything +- `--debug` - outputs additional debug output. Great for debugging, geeks and us who develop. Hopefully you will never _need_ it, but it can still be fun, right? +- `--help` - prints the help for the current command. All CLI tools should have this flag +- `--version` - prints the version of the tool. All CLI tools should have this flag ## Configuration files @@ -75,21 +75,21 @@ The CLI reads and uses data from a [`socket.yml` file](https://docs.socket.dev/d ## Environment variables -* `SOCKET_SECURITY_API_KEY` - if set, this will be used as the API-key +- `SOCKET_SECURITY_API_KEY` - if set, this will be used as the API-key ## Contributing ### Environment variables for development -* `SOCKET_SECURITY_API_BASE_URL` - if set, this will be the base for all API-calls. Defaults to `https://api.socket.dev/v0/` -* `SOCKET_SECURITY_API_PROXY` - if set to something like [`http://127.0.0.1:9090`](https://docs.proxyman.io/troubleshooting/couldnt-see-any-requests-from-3rd-party-network-libraries), then all request will be proxied through that proxy +- `SOCKET_SECURITY_API_BASE_URL` - if set, this will be the base for all API-calls. Defaults to `https://api.socket.dev/v0/` +- `SOCKET_SECURITY_API_PROXY` - if set to something like [`http://127.0.0.1:9090`](https://docs.proxyman.io/troubleshooting/couldnt-see-any-requests-from-3rd-party-network-libraries), then all request will be proxied through that proxy ## Similar projects -* [`@socketsecurity/sdk`](https://github.com/SocketDev/socket-sdk-js) - the SDK used in this CLI +- [`@socketsecurity/sdk`](https://github.com/SocketDev/socket-sdk-js) - the SDK used in this CLI ## See also -* [Announcement blog post](https://socket.dev/blog/announcing-socket-cli-preview) -* [Socket API Reference](https://docs.socket.dev/reference) - the API used in this CLI -* [Socket GitHub App](https://github.com/apps/socket-security) - the plug-and-play GitHub App +- [Announcement blog post](https://socket.dev/blog/announcing-socket-cli-preview) +- [Socket API Reference](https://docs.socket.dev/reference) - the API used in this CLI +- [Socket GitHub App](https://github.com/apps/socket-security) - the plug-and-play GitHub App diff --git a/bin/npm b/bin/npm new file mode 100755 index 00000000..2af5219d --- /dev/null +++ b/bin/npm @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('../dist/npm-cli.js') diff --git a/bin/npx b/bin/npx new file mode 100755 index 00000000..ab2e66ee --- /dev/null +++ b/bin/npx @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('../dist/npx-cli.js') diff --git a/cli.js b/cli.js deleted file mode 100755 index 8f0ba396..00000000 --- a/cli.js +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ - -import chalk from 'chalk' -import { messageWithCauses, stackWithCauses } from 'pony-cause' - -import * as cliCommands from './lib/commands/index.js' -import { logSymbols } from './lib/utils/chalk-markdown.js' -import { AuthError, InputError } from './lib/utils/errors.js' -import { meowWithSubcommands } from './lib/utils/meow-with-subcommands.js' -import { initUpdateNotifier } from './lib/utils/update-notifier.js' - -// TODO: Add autocompletion using https://www.npmjs.com/package/omelette - -initUpdateNotifier() - -try { - const formattedCliCommands = Object.fromEntries(Object.entries(cliCommands).map((entry) => { - if (entry[0] === 'rawNpm') { - entry[0] = 'raw-npm' - } else if (entry[0] === 'rawNpx') { - entry[0] = 'raw-npx' - } else if (entry[0] === 'auditlog') { - entry[0] = 'audit-log' - } - return entry - })) - - await meowWithSubcommands( - formattedCliCommands, - { - aliases: { - ci: { - description: 'Alias for "report create --view --strict"', - argv: ['report', 'create', '--view', '--strict'] - }, - }, - argv: process.argv.slice(2), - name: 'socket', - importMeta: import.meta - } - ) -} catch (err) { - /** @type {string} */ - let errorTitle - /** @type {string} */ - let errorMessage = '' - /** @type {string|undefined} */ - let errorBody - - if (err instanceof AuthError) { - errorTitle = 'Authentication error' - errorMessage = err.message - } else if (err instanceof InputError) { - errorTitle = 'Invalid input' - errorMessage = err.message - errorBody = err.body - } else if (err instanceof Error) { - errorTitle = 'Unexpected error' - errorMessage = messageWithCauses(err) - errorBody = stackWithCauses(err) - } else { - errorTitle = 'Unexpected error with no details' - } - - console.error(`${logSymbols.error} ${chalk.white.bgRed(errorTitle + ':')} ${errorMessage}`) - if (errorBody) { - console.error('\n' + errorBody) - } - - process.exit(1) -} diff --git a/lib/commands/audit-log/index.js b/lib/commands/audit-log/index.js deleted file mode 100644 index 7fb51f00..00000000 --- a/lib/commands/audit-log/index.js +++ /dev/null @@ -1,162 +0,0 @@ -/* eslint-disable no-console */ -import { Separator } from '@inquirer/select' -import chalk from 'chalk' -import inquirer from 'inquirer' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { FREE_API_KEY, getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const auditlog = { - description: 'Look up the audit log for an organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' audit-log' - - const input = setupCommand(name, auditlog.description, argv, importMeta) - if (input) { - const spinner = ora(`Looking up audit log for ${input.orgSlug}\n`).start() - await fetchOrgAuditLog(input.orgSlug, input, spinner) - } - } -} - -const auditLogFlags = prepareFlags({ - type: { - type: 'string', - shortFlag: 't', - default: '', - description: 'Type of log event', - }, - perPage: { - type: 'number', - shortFlag: 'pp', - default: 30, - description: 'Results per page - default is 30', - }, - page: { - type: 'number', - shortFlag: 'p', - default: 1, - description: 'Page number - default is 1', - } - }) - -// Internal functions - -/** - * @typedef CommandInput - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} type - * @property {number} page - * @property {number} per_page - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandInput} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...auditLogFlags, - ...outputFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - type, - page, - perPage - } = cli.flags - - if (cli.input.length < 1) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug \n`) - cli.showHelp() - return - } - const [orgSlug = ''] = cli.input - - return { - outputJson, - outputMarkdown, - orgSlug, - type: type && type.charAt(0).toUpperCase() + type.slice(1), - page, - per_page: perPage - } -} - -/** - * @typedef AuditLogData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getAuditLogEvents'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {CommandInput} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function fetchOrgAuditLog (orgSlug, input, spinner) { - const socketSdk = await setupSdk(getDefaultKey() || FREE_API_KEY) - const result = await handleApiCall(socketSdk.getAuditLogEvents(orgSlug, input), `Looking up audit log for ${orgSlug}\n`) - - if (!result.success) { - return handleUnsuccessfulApiResponse('getAuditLogEvents', result, spinner) - } - spinner.stop() - - const /** @type {({name: string} | Separator)[]} */ data = [] - const /** @type {{[key: string]: string}} */ logDetails = {} - - result.data.results.map(d => { - data.push({ - name: `${d.created_at && new Date(d.created_at).toLocaleDateString('en-us', { year: 'numeric', month: 'numeric', day: 'numeric' })} - ${d.user_email} - ${d.type} - ${d.ip_address} - ${d.user_agent}` - }, new Separator()) - - logDetails[`${d.created_at && new Date(d.created_at).toLocaleDateString('en-us', { year: 'numeric', month: 'numeric', day: 'numeric' })} - ${d.user_email} - ${d.type} - ${d.ip_address} - ${d.user_agent}`] = JSON.stringify(d.payload) - return data - }) - - inquirer - .prompt( - { - type: 'list', - name: 'log', - message: input.type ? `\n Audit log for: ${orgSlug} with type: ${input.type} \n` : `\n Audit log for: ${orgSlug} \n`, - choices: data, - pageSize: 30 - } - ) - .then((/** @type {{log: string}} */ answers) => console.log(logDetails[answers.log])) - - return { - data: result.data - } -} diff --git a/lib/commands/dependencies/index.js b/lib/commands/dependencies/index.js deleted file mode 100644 index 9c731136..00000000 --- a/lib/commands/dependencies/index.js +++ /dev/null @@ -1,150 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -// @ts-ignore -import chalkTable from 'chalk-table' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const dependencies = { - description: 'Search for any dependency that is being used in your organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' dependencies' - - const input = setupCommand(name, dependencies.description, argv, importMeta) - if (input) { - const spinnerText = 'Searching dependencies...' - const spinner = ora(spinnerText).start() - await searchDeps(input, spinner) - } - } -} - -const dependenciesFlags = prepareFlags({ - limit: { - type: 'number', - shortFlag: 'l', - default: 50, - description: 'Maximum number of dependencies returned', - }, - offset: { - type: 'number', - shortFlag: 'o', - default: 0, - description: 'Page number', - } - }) - -// Internal functions - -/** - * @typedef Command - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {number} limit - * @property {number} offset - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|Command} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - ...dependenciesFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - limit, - offset - } = cli.flags - - return { - outputJson, - outputMarkdown, - limit, - offset - } -} - -/** - * @typedef DependenciesData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'searchDependencies'>["data"]} data - */ - -/** - * @param {Command} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function searchDeps ({ limit, offset, outputJson }, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.searchDependencies({ limit, offset }), 'Searching dependencies') - - if (!result.success) { - return handleUnsuccessfulApiResponse('searchDependencies', result, spinner) - } - - spinner.stop() - - console.log('Organization dependencies: \n') - - if (outputJson) { - return console.log(result.data) - } - - const options = { - columns: [ - { field: 'namespace', name: chalk.cyan('Namespace') }, - { field: 'name', name: chalk.cyan('Name') }, - { field: 'version', name: chalk.cyan('Version') }, - { field: 'repository', name: chalk.cyan('Repository') }, - { field: 'branch', name: chalk.cyan('Branch') }, - { field: 'type', name: chalk.cyan('Type') }, - { field: 'direct', name: chalk.cyan('Direct') } - ] - } - - const formattedResults = result.data.rows.map((/** @type {{[key:string]: any}} */ d) => { - return { - ...d - } - }) - - const table = chalkTable(options, formattedResults) - - console.log(table, '\n') - - return { - data: result.data - } -} diff --git a/lib/commands/index.js b/lib/commands/index.js deleted file mode 100644 index 749118a8..00000000 --- a/lib/commands/index.js +++ /dev/null @@ -1,14 +0,0 @@ -export * from './cdxgen/index.js' -export * from './info/index.js' -export * from './login/index.js' -export * from './logout/index.js' -export * from './npm/index.js' -export * from './npx/index.js' -export * from './raw-npm/index.js' -export * from './raw-npx/index.js' -export * from './report/index.js' -export * from './wrapper/index.js' -export * from './scan/index.js' -export * from './audit-log/index.js' -export * from './repos/index.js' -export * from './dependencies/index.js' diff --git a/lib/commands/info/index.js b/lib/commands/info/index.js deleted file mode 100644 index 65fdf849..00000000 --- a/lib/commands/info/index.js +++ /dev/null @@ -1,287 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags, validationFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { ChalkOrMarkdown } from '../../utils/chalk-markdown.js' -import { prepareFlags } from '../../utils/flags.js' -import { formatSeverityCount, getCountSeverity } from '../../utils/format-issues.js' -import { printFlagList } from '../../utils/formatting.js' -import { objectSome } from '../../utils/misc.js' -import { FREE_API_KEY, getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const info = { - description: 'Look up info regarding a package', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' info' - - const input = setupCommand(name, info.description, argv, importMeta) - if (input) { - const spinnerText = `Looking up data for packages: ${input.packages.join(', ')}\n` - const spinner = ora(spinnerText).start() - const packageData = await fetchPackageData(input.packages, input.includeAlerts, spinner) - if (packageData) { - formatPackageDataOutput(packageData, { name, ...input }, spinner) - } - } - } -} - -const infoFlags = prepareFlags({ - // At the moment in API v0, alerts and license do the same thing. - // The license parameter will be implemented later. - // license: { - // type: 'boolean', - // shortFlag: 'l', - // default: false, - // description: 'Include license - Default is false', - // }, - alerts: { - type: 'boolean', - shortFlag: 'a', - default: false, - description: 'Include alerts - Default is false', - } -}) - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} includeAlerts - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string[]} packages - * @property {boolean} strict - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - ...validationFlags, - ...infoFlags - } - - const cli = meow(` - Usage - $ ${name} :@ - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} npm:webtorrent - $ ${name} npm:webtorrent@1.9.1 - `, { - argv, - description, - importMeta, - flags - }) - - const { - alerts: includeAlerts, - json: outputJson, - markdown: outputMarkdown, - strict, - } = cli.flags - - const [rawPkgName = ''] = cli.input - - if (!rawPkgName) { - console.error(`${chalk.bgRed('Input error')}: Please provide an ecosystem and package name`) - cli.showHelp() - return - } - - const /** @type {string[]} */inputPkgs = [] - - cli.input.map(pkg => { - const ecosystem = pkg.split(':')[0] - if (!ecosystem) { - console.error(`Package name ${pkg} formatted incorrectly.`) - return cli.showHelp() - } else { - const versionSeparator = pkg.lastIndexOf('@') - const ecosystemSeparator = pkg.lastIndexOf(ecosystem) - const pkgName = versionSeparator < 1 ? pkg.slice(ecosystemSeparator + ecosystem.length + 1) : pkg.slice(ecosystemSeparator + ecosystem.length + 1, versionSeparator) - const pkgVersion = versionSeparator < 1 ? 'latest' : pkg.slice(versionSeparator + 1) - inputPkgs.push(`${ecosystem}/${pkgName}@${pkgVersion}`) - } - return inputPkgs - }) - - return { - includeAlerts, - outputJson, - outputMarkdown, - packages: inputPkgs, - strict, - } -} - -/** - * @typedef PackageData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'batchPackageFetch'>["data"]} data - */ - -/** - * @param {string[]} packages - * @param {boolean} includeAlerts - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function fetchPackageData (packages, includeAlerts, spinner) { - const socketSdk = await setupSdk(getDefaultKey() || FREE_API_KEY) - - const components = packages.map(pkg => { - return { 'purl': `pkg:${pkg}` } - }) - - const result = await handleApiCall(socketSdk.batchPackageFetch( - { alerts: includeAlerts.toString() }, - { - components - }), 'looking up package') - - if (!result.success) { - return handleUnsuccessfulApiResponse('batchPackageFetch', result, spinner) - } - - // @ts-ignore - result.data.map(pkg => { - const severityCount = pkg.alerts && getCountSeverity(pkg.alerts, includeAlerts ? undefined : 'high') - pkg.severityCount = severityCount - return pkg - }) - - spinner.stop() - - return { - data: result.data - } -} - -/** - * @param {CommandContext} data - * @param {{ name: string } & CommandContext} context - * @param {import('ora').Ora} spinner - * @returns {void} - */ -function formatPackageDataOutput (/** @type {{ [key: string]: any }} */ { data }, { outputJson, outputMarkdown, strict }, spinner) { - if (outputJson) { - console.log(JSON.stringify(data, undefined, 2)) - } else { - data.map((/** @type {{[key:string]: any}} */ d) => { - const { score, license, name, severityCount, version } = d - console.log(`\nPackage metrics for ${name}:`) - - const scoreResult = { - 'Supply Chain Risk': Math.floor(score.supplyChain * 100), - 'Maintenance': Math.floor(score.maintenance * 100), - 'Quality': Math.floor(score.quality * 100), - 'Vulnerabilities': Math.floor(score.vulnerability * 100), - 'License': Math.floor(score.license * 100), - 'Overall': Math.floor(score.overall * 100) - } - - Object.entries(scoreResult).map(score => console.log(`- ${score[0]}: ${formatScore(score[1])}`)) - - // Package license - console.log('\nPackage license:') - console.log(`${license}`) - - // Package issues list - if (objectSome(severityCount)) { - const issueSummary = formatSeverityCount(severityCount) - console.log('\n') - spinner[strict ? 'fail' : 'succeed'](`Package has these issues: ${issueSummary}`) - formatPackageIssuesDetails(data.alerts, outputMarkdown) - } else if (severityCount && !objectSome(severityCount)) { - console.log('\n') - spinner.succeed('Package has no issues') - } - - // Link to issues list - const format = new ChalkOrMarkdown(!!outputMarkdown) - const url = `https://socket.dev/npm/package/${name}/overview/${version}` - if (version === 'latest') { - console.log('\nDetailed info on socket.dev: ' + format.hyperlink(`${name}`, url, { fallbackToUrl: true })) - } else { - console.log('\nDetailed info on socket.dev: ' + format.hyperlink(`${name} v${version}`, url, { fallbackToUrl: true })) - } - if (!outputMarkdown) { - console.log(chalk.dim('\nOr rerun', chalk.italic(name), 'using the', chalk.italic('--json'), 'flag to get full JSON output')) - } - - if (strict && objectSome(severityCount)) { - process.exit(1) - } - return d - }) - } -} - -/** - * @param {{[key: string]: any}[]} alertsData - * @param {boolean} outputMarkdown - * @returns {void[]} - */ -function formatPackageIssuesDetails (alertsData, outputMarkdown) { - const issueDetails = alertsData.filter(d => d['severity'] === 'high' || d['severity'] === 'critical') - - const uniqueIssues = issueDetails.reduce((/** @type {{ [key: string]: {count: Number, label: string | undefined} }} */ acc, issue) => { - const { type } = issue - if (type) { - if (!acc[type]) { - acc[type] = { - label: issue['type'], - count: 1 - } - } else { - // @ts-ignore - acc[type].count += 1 - } - } - return acc - }, {}) - - const format = new ChalkOrMarkdown(!!outputMarkdown) - - return Object.keys(uniqueIssues).map(issue => { - const issueWithLink = format.hyperlink(`${uniqueIssues[issue]?.label}`, `https://socket.dev/npm/issue/${issue}`, { fallbackToUrl: true }) - if (uniqueIssues[issue]?.count === 1) { - return console.log(`- ${issueWithLink}`) - } - return console.log(`- ${issueWithLink}: ${uniqueIssues[issue]?.count}`) - }) -} - -/** - * @param {number} score - * @returns {string} - */ -function formatScore (score) { - const error = chalk.hex('#de7c7b') - const warning = chalk.hex('#e59361') - const success = chalk.hex('#a4cb9d') - - if (score > 80) { - return `${success(score)}` - } else if (score < 80 && score > 60) { - return `${warning(score)}` - } else { - return `${error(score)}` - } -} diff --git a/lib/commands/login/index.js b/lib/commands/login/index.js deleted file mode 100644 index 4c15d801..00000000 --- a/lib/commands/login/index.js +++ /dev/null @@ -1,170 +0,0 @@ -import isInteractive from 'is-interactive' -import meow from 'meow' -import ora from 'ora' -import prompts from 'prompts' -import terminalLink from 'terminal-link' - -import { AuthError, InputError } from '../../utils/errors.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { FREE_API_KEY, setupSdk } from '../../utils/sdk.js' -import { getSetting, updateSetting } from '../../utils/settings.js' - -const description = 'Socket API login' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const login = { - description, - run: async (argv, importMeta, { parentName }) => { - const flags = prepareFlags({ - apiBaseUrl: { - type: 'string', - description: 'API server to connect to for login', - }, - apiProxy: { - type: 'string', - description: 'Proxy to use when making connection to API server' - } - }) - const name = parentName + ' login' - const cli = meow(` - Usage - $ ${name} - - Logs into the Socket API by prompting for an API key - - Options - ${printFlagList({ - 'api-base-url': flags.apiBaseUrl.description, - 'api-proxy': flags.apiProxy.description - }, 8)} - - Examples - $ ${name} - `, { - argv, - description, - importMeta, - flags - }) - - /** - * @param {{aborted: boolean}} state - */ - const promptAbortHandler = (state) => { - if (state.aborted) { - process.nextTick(() => process.exit(1)) - } - } - - if (cli.input.length) cli.showHelp() - - if (!isInteractive()) { - throw new InputError('cannot prompt for credentials in a non-interactive shell') - } - /** - * @type {{ apiKey: string }} - */ - const result = await prompts({ - type: 'password', - name: 'apiKey', - message: `Enter your ${terminalLink( - 'Socket.dev API key', - 'https://docs.socket.dev/docs/api-keys' - )} (leave blank for a public key)`, - onState: promptAbortHandler - }) - - const apiKey = result.apiKey || FREE_API_KEY - - /** - * @type {string | null | undefined} - */ - let apiBaseUrl = cli.flags.apiBaseUrl - apiBaseUrl ??= getSetting('apiBaseUrl') ?? - undefined - - /** - * @type {string | null | undefined} - */ - let apiProxy = cli.flags.apiProxy - apiProxy ??= getSetting('apiProxy') ?? - undefined - - const spinner = ora('Verifying API key...').start() - - /** @type {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrganizations'>['data']} */ - let orgs - - try { - const sdk = await setupSdk(apiKey, apiBaseUrl, apiProxy) - const result = await sdk.getOrganizations() - if (!result.success) throw new AuthError() - orgs = result.data - spinner.succeed('API key verified\n') - } catch (e) { - spinner.fail('Invalid API key') - return - } - - /** - * @template T - * @param {T | null | undefined} value - * @returns {value is T} - */ - const nonNullish = value => value != null - - /** @type {prompts.Choice[]} */ - const enforcedChoices = Object.values(orgs.organizations) - .filter(nonNullish) - .filter(org => org.plan === 'enterprise') - .map(org => ({ - title: org.name, - value: org.id - })) - - /** @type {string[]} */ - let enforcedOrgs = [] - - if (enforcedChoices.length > 1) { - /** - * @type { {id: string} } - */ - const { id } = await prompts({ - type: 'select', - name: 'id', - hint: '\n Pick "None" if this is a personal device', - message: 'Which organization\'s policies should Socket enforce system-wide?', - choices: enforcedChoices.concat({ - title: 'None', - value: null - }), - onState: promptAbortHandler - }) - if (id) enforcedOrgs = [id] - } else if (enforcedChoices.length) { - /** - * @type { {confirmOrg: boolean} } - */ - const { confirmOrg } = await prompts({ - type: 'confirm', - name: 'confirmOrg', - message: `Should Socket enforce ${enforcedChoices[0]?.title}'s security policies system-wide?`, - initial: true, - onState: promptAbortHandler - }) - if (confirmOrg) { - const existing = /** @type {undefined | {value: string}} */(enforcedChoices[0]) - if (existing) { - enforcedOrgs = [existing.value] - } - } - } - // MUST DO all updateSetting ON SAME TICK TO AVOID PARTIAL WRITE - updateSetting('enforcedOrgs', enforcedOrgs) - const oldKey = getSetting('apiKey') - updateSetting('apiKey', apiKey) - updateSetting('apiBaseUrl', apiBaseUrl) - spinner.succeed(`API credentials ${oldKey ? 'updated' : 'set'}`) - } -} diff --git a/lib/commands/raw-npm/index.js b/lib/commands/raw-npm/index.js deleted file mode 100644 index ffaadd55..00000000 --- a/lib/commands/raw-npm/index.js +++ /dev/null @@ -1,59 +0,0 @@ -import { spawn } from 'child_process' - -import meow from 'meow' - -import { validationFlags } from '../../flags/index.js' -import { printFlagList } from '../../utils/formatting.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const rawNpm = { - description: 'Temporarily disable the Socket npm wrapper', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' raw-npm' - - setupCommand(name, rawNpm.description, argv, importMeta) - } -} - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = validationFlags - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} install - `, { - argv, - description, - importMeta, - flags - }) - - if (!argv[0]) { - cli.showHelp() - return - } - - spawn('npm', [argv.join(' ')], { - stdio: 'inherit', - shell: true - }).on('exit', (code, signal) => { - if (signal) { - process.kill(process.pid, signal) - } else if (code !== null) { - process.exit(code) - } - }) -} diff --git a/lib/commands/report/create.js b/lib/commands/report/create.js deleted file mode 100644 index eb02e789..00000000 --- a/lib/commands/report/create.js +++ /dev/null @@ -1,251 +0,0 @@ -/* eslint-disable no-console */ - -import path from 'node:path' - -import { betterAjvErrors } from '@apideck/better-ajv-errors' -import { readSocketConfig, SocketValidationError } from '@socketsecurity/config' -import meow from 'meow' -import ora from 'ora' -import { ErrorWithCause } from 'pony-cause' - -import { fetchReportData, formatReportDataOutput } from './view.js' -import { outputFlags, validationFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { ChalkOrMarkdown, logSymbols } from '../../utils/chalk-markdown.js' -import { InputError } from '../../utils/errors.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { createDebugLogger } from '../../utils/misc.js' -import { getPackageFiles } from '../../utils/path-resolve.js' -import { setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const create = { - description: 'Create a project report', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' create' - - const input = await setupCommand(name, create.description, argv, importMeta) - - if (input) { - const { - config, - cwd, - debugLog, - dryRun, - includeAllIssues, - outputJson, - outputMarkdown, - packagePaths, - strict, - view, - } = input - - const result = input && await createReport(packagePaths, { config, cwd, debugLog, dryRun }) - - if (result && view) { - const reportId = result.data.id - const reportData = input && await fetchReportData(reportId, { includeAllIssues, strict }) - - if (reportData) { - formatReportDataOutput(reportData, { includeAllIssues, name, outputJson, outputMarkdown, reportId, strict }) - } - } else if (result) { - formatReportCreationOutput(result.data, { outputJson, outputMarkdown }) - } - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {import('@socketsecurity/config').SocketYml|undefined} config - * @property {string} cwd - * @property {typeof console.error} debugLog - * @property {boolean} dryRun - * @property {boolean} includeAllIssues - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string[]} packagePaths - * @property {boolean} strict - * @property {boolean} view - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {Promise} - */ -async function setupCommand (name, description, argv, importMeta) { - const flags = prepareFlags({ - ...outputFlags, - ...validationFlags, - debug: { - type: 'boolean', - shortFlag: 'd', - default: false, - description: 'Output debug information', - }, - dryRun: { - type: 'boolean', - default: false, - description: 'Only output what will be done without actually doing it', - }, - view: { - type: 'boolean', - shortFlag: 'v', - default: false, - description: 'Will wait for and return the created report' - }, - }) - - const cli = meow(` - Usage - $ ${name} - - Uploads the specified "package.json" and lock files for JavaScript, Python, and Go dependency manifests. - If any folder is specified, the ones found in there recursively are uploaded. - - Supports globbing such as "**/package.json", "**/requirements.txt", "**/pyproject.toml", and "**/go.mod". - - Ignores any file specified in your project's ".gitignore", your project's - "socket.yml" file's "projectIgnorePaths" and also has a sensible set of - default ignores from the "ignore-by-default" module. - - Options - ${printFlagList({ - 'all': 'Include all issues', - 'debug': 'Output debug information', - 'dry-run': 'Only output what will be done without actually doing it', - 'json': 'Output result as json', - 'markdown': 'Output result as markdown', - 'strict': 'Exits with an error code if any matching issues are found', - 'view': 'Will wait for and return the created report' - }, 6)} - - Examples - $ ${name} . - $ ${name} '**/package.json' - $ ${name} /path/to/a/package.json /path/to/another/package.json - $ ${name} . --view --json - `, { - argv, - description, - importMeta, - flags, - }) - - const { - all: includeAllIssues, - dryRun, - json: outputJson, - markdown: outputMarkdown, - strict, - view, - } = cli.flags - - if (!cli.input[0]) { - cli.showHelp() - return - } - - const debugLog = createDebugLogger(dryRun || cli.flags.debug) - - // TODO: Allow setting a custom cwd and/or configFile path? - const cwd = process.cwd() - const absoluteConfigPath = path.join(cwd, 'socket.yml') - - const config = await readSocketConfig(absoluteConfigPath) - .catch(/** @param {unknown} cause */ cause => { - if (cause && typeof cause === 'object' && cause instanceof SocketValidationError) { - // Inspired by workbox-build: https://github.com/GoogleChrome/workbox/blob/95f97a207fd51efb3f8a653f6e3e58224183a778/packages/workbox-build/src/lib/validate-options.ts#L68-L71 - const betterErrors = betterAjvErrors({ - basePath: 'config', - data: cause.data, - errors: cause.validationErrors, - // @ts-ignore - schema: cause.schema, - }) - throw new InputError( - 'The socket.yml config is not valid', - betterErrors.map((err) => `[${err.path}] ${err.message}.${err.suggestion ? err.suggestion : ''}`).join('\n') - ) - } else { - throw new ErrorWithCause('Failed to read socket.yml config', { cause }) - } - }) - - const socketSdk = await setupSdk() - const supportedFiles = await socketSdk.getReportSupportedFiles() - .then(res => { - if (!res.success) handleUnsuccessfulApiResponse('getReportSupportedFiles', res, ora()) - return res.data - }).catch( - /** @type {(cause: Error) => never} */ - (cause) => { - throw new ErrorWithCause('Failed getting supported files for report', { cause }) - }) - - const packagePaths = await getPackageFiles(cwd, cli.input, config, supportedFiles, debugLog) - - return { - config, - cwd, - debugLog, - dryRun, - includeAllIssues, - outputJson, - outputMarkdown, - packagePaths, - strict, - view, - } -} - -/** - * @param {string[]} packagePaths - * @param {Pick} context - * @returns {Promise>} - */ -async function createReport (packagePaths, { config, cwd, debugLog, dryRun }) { - debugLog('Uploading:', packagePaths.join(`\n${logSymbols.info} Uploading: `)) - - if (dryRun) { - return - } - - const socketSdk = await setupSdk() - const spinner = ora(`Creating report with ${packagePaths.length} package files`).start() - const apiCall = socketSdk.createReportFromFilePaths(packagePaths, cwd, config?.issueRules) - const result = await handleApiCall(apiCall, 'creating report') - - if (result.success === false) { - return handleUnsuccessfulApiResponse('createReport', result, spinner) - } - - // Conclude the status of the API call - - spinner.succeed() - - return result -} - -/** - * @param {import('@socketsecurity/sdk').SocketSdkReturnType<'createReport'>["data"]} data - * @param {Pick} context - * @returns {void} - */ -function formatReportCreationOutput (data, { outputJson, outputMarkdown }) { - if (outputJson) { - console.log(JSON.stringify(data, undefined, 2)) - return - } - - const format = new ChalkOrMarkdown(!!outputMarkdown) - - console.log('\nNew report: ' + format.hyperlink(data.id, data.url, { fallbackToUrl: true })) -} diff --git a/lib/commands/report/view.js b/lib/commands/report/view.js deleted file mode 100644 index bbb12993..00000000 --- a/lib/commands/report/view.js +++ /dev/null @@ -1,176 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' -import { ErrorWithCause } from 'pony-cause' - -import { outputFlags, validationFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { ChalkOrMarkdown } from '../../utils/chalk-markdown.js' -import { InputError } from '../../utils/errors.js' -import { getSeverityCount, formatSeverityCount } from '../../utils/format-issues.js' -import { printFlagList } from '../../utils/formatting.js' -import { setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const view = { - description: 'View a project report', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' view' - - const input = setupCommand(name, view.description, argv, importMeta) - const result = input && await fetchReportData(input.reportId, input) - - if (result) { - formatReportDataOutput(result, { name, ...input }) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} includeAllIssues - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} reportId - * @property {boolean} strict - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - ...validationFlags, - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} QXU8PmK7LfH608RAwfIKdbcHgwEd_ZeWJ9QEGv05FJUQ - `, { - argv, - description, - importMeta, - flags, - }) - - // Extract the input - - const { - all: includeAllIssues, - json: outputJson, - markdown: outputMarkdown, - strict, - } = cli.flags - - const [reportId, ...extraInput] = cli.input - - if (!reportId) { - cli.showHelp() - return - } - - // Validate the input - - if (extraInput.length) { - throw new InputError(`Can only handle a single report ID at a time, but got ${cli.input.length} report ID:s: ${cli.input.join(', ')}`) - } - - return { - includeAllIssues, - outputJson, - outputMarkdown, - reportId, - strict, - } -} - -/** - * @typedef {import('@socketsecurity/sdk').SocketSdkReturnType<'getReport'>["data"]} ReportData - */ - -const MAX_TIMEOUT_RETRY = 5 - -/** - * @param {string} reportId - * @param {Pick} context - * @returns {Promise} - */ -export async function fetchReportData (reportId, { includeAllIssues, strict }) { - // Do the API call - - const socketSdk = await setupSdk() - const spinner = ora(`Fetching report with ID ${reportId} (this could take a while)`).start() - /** @type {import('@socketsecurity/sdk').SocketSdkResultType<'getReport'> | undefined} */ - let result - for (let retry = 1; !result; ++retry) { - try { - result = await handleApiCall(socketSdk.getReport(reportId), 'fetching report') - } catch (err) { - if ( - retry >= MAX_TIMEOUT_RETRY || - !(err instanceof ErrorWithCause) || - err.cause?.cause?.response?.statusCode !== 524 - ) { - throw err - } - } - } - - if (result.success === false) { - return handleUnsuccessfulApiResponse('getReport', result, spinner) - } - - // Conclude the status of the API call - - if (strict) { - if (result.data.healthy) { - spinner.succeed('Report result is healthy and great!') - } else { - spinner.fail('Report result deemed unhealthy for project') - } - } else if (result.data.healthy === false) { - const severityCount = getSeverityCount(result.data.issues, includeAllIssues ? undefined : 'high') - const issueSummary = formatSeverityCount(severityCount) - spinner.succeed(`Report has these issues: ${issueSummary}`) - } else { - spinner.succeed('Report has no issues') - } - - return result.data -} - -/** - * @param {ReportData} data - * @param {{ name: string } & CommandContext} context - * @returns {void} - */ -export function formatReportDataOutput (data, { name, outputJson, outputMarkdown, reportId, strict }) { - if (outputJson) { - console.log(JSON.stringify(data, undefined, 2)) - } else { - const format = new ChalkOrMarkdown(!!outputMarkdown) - console.log('\nDetailed info on socket.dev: ' + format.hyperlink(reportId, data.url, { fallbackToUrl: true })) - if (!outputMarkdown) { - console.log(chalk.dim('\nOr rerun', chalk.italic(name), 'using the', chalk.italic('--json'), 'flag to get full JSON output')) - } - } - - if (strict && data.healthy === false) { - process.exit(1) - } -} diff --git a/lib/commands/repos/create.js b/lib/commands/repos/create.js deleted file mode 100644 index 5390495d..00000000 --- a/lib/commands/repos/create.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const create = { - description: 'Create a repository in an organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' create' - - const input = setupCommand(name, create.description, argv, importMeta) - if (input) { - const spinnerText = 'Creating repository... \n' - const spinner = ora(spinnerText).start() - await createRepo(input.orgSlug, input, spinner) - } - } -} - -const repositoryCreationFlags = prepareFlags({ - repoName: { - type: 'string', - shortFlag: 'n', - default: '', - description: 'Repository name', - }, - repoDescription: { - type: 'string', - shortFlag: 'd', - default: '', - description: 'Repository description', - }, - homepage: { - type: 'string', - shortFlag: 'h', - default: '', - description: 'Repository url', - }, - defaultBranch: { - type: 'string', - shortFlag: 'b', - default: 'main', - description: 'Repository default branch', - }, - visibility: { - type: 'string', - shortFlag: 'v', - default: 'private', - description: 'Repository visibility (Default Private)', - } -}) - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} name - * @property {string} description - * @property {string} homepage - * @property {string} default_branch - * @property {string} visibility - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - ...repositoryCreationFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg --repoName=test-repo - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - repoName, - repoDescription, - homepage, - defaultBranch, - visibility - } = cli.flags - - const [orgSlug = ''] = cli.input - - if (!orgSlug) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug \n`) - cli.showHelp() - return - } - - if (!repoName) { - console.error(`${chalk.bgRed('Input error')}: Repository name is required. \n`) - cli.showHelp() - return - } - - return { - outputJson, - outputMarkdown, - orgSlug, - name: repoName, - description: repoDescription, - homepage, - default_branch: defaultBranch, - visibility - } -} - -/** - * @typedef RepositoryData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'createOrgRepo'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {CommandContext} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function createRepo (orgSlug, input, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.createOrgRepo(orgSlug, input), 'creating repository') - - if (!result.success) { - return handleUnsuccessfulApiResponse('createOrgRepo', result, spinner) - } - - spinner.stop() - - console.log('\n✅ Repository created successfully \n') - - return { - data: result.data - } -} diff --git a/lib/commands/repos/delete.js b/lib/commands/repos/delete.js deleted file mode 100644 index 50339804..00000000 --- a/lib/commands/repos/delete.js +++ /dev/null @@ -1,93 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const del = { - description: 'Delete a repository in an organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' del' - - const input = setupCommand(name, del.description, argv, importMeta) - if (input) { - const spinnerText = 'Deleting repository... \n' - const spinner = ora(spinnerText).start() - await deleteRepository(input.orgSlug, input.repoName, spinner) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {string} orgSlug - * @property {string} repoName - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const cli = meow(` - Usage - $ ${name} - - Examples - $ ${name} FakeOrg test-repo - `, { - argv, - description, - importMeta - }) - - const [orgSlug = '', repoName = ''] = cli.input - - if (!orgSlug || !repoName) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug and repository slug \n`) - cli.showHelp() - return - } - - return { - orgSlug, - repoName - } -} - -/** - * @typedef RepositoryData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'deleteOrgRepo'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {string} repoName - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function deleteRepository (orgSlug, repoName, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.deleteOrgRepo(orgSlug, repoName), 'deleting repository') - - if (!result.success) { - return handleUnsuccessfulApiResponse('deleteOrgRepo', result, spinner) - } - - spinner.stop() - - console.log('\n✅ Repository deleted successfully \n') - - return { - data: result.data - } -} diff --git a/lib/commands/repos/update.js b/lib/commands/repos/update.js deleted file mode 100644 index 298a2ebc..00000000 --- a/lib/commands/repos/update.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const update = { - description: 'Update a repository in an organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' update' - - const input = setupCommand(name, update.description, argv, importMeta) - if (input) { - const spinnerText = 'Updating repository... \n' - const spinner = ora(spinnerText).start() - await updateRepository(input.orgSlug, input, spinner) - } - } -} - -const repositoryUpdateFlags = prepareFlags({ - repoName: { - type: 'string', - shortFlag: 'n', - default: '', - description: 'Repository name', - }, - repoDescription: { - type: 'string', - shortFlag: 'd', - default: '', - description: 'Repository description', - }, - homepage: { - type: 'string', - shortFlag: 'h', - default: '', - description: 'Repository url', - }, - defaultBranch: { - type: 'string', - shortFlag: 'b', - default: 'main', - description: 'Repository default branch', - }, - visibility: { - type: 'string', - shortFlag: 'v', - default: 'private', - description: 'Repository visibility (Default Private)', - } -}) - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} name - * @property {string} description - * @property {string} homepage - * @property {string} default_branch - * @property {string} visibility - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - ...repositoryUpdateFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - repoName, - repoDescription, - homepage, - defaultBranch, - visibility - } = cli.flags - - const [orgSlug = ''] = cli.input - - if (!orgSlug) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug and repository name \n`) - cli.showHelp() - return - } - - if (!repoName) { - console.error(`${chalk.bgRed('Input error')}: Repository name is required. \n`) - cli.showHelp() - return - } - - return { - outputJson, - outputMarkdown, - orgSlug, - name: repoName, - description: repoDescription, - homepage, - default_branch: defaultBranch, - visibility - } -} - -/** - * @typedef RepositoryData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'updateOrgRepo'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {CommandContext} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function updateRepository (orgSlug, input, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.updateOrgRepo(orgSlug, input.name, input), 'updating repository') - - if (!result.success) { - return handleUnsuccessfulApiResponse('updateOrgRepo', result, spinner) - } - - spinner.stop() - - console.log('\n✅ Repository updated successfully \n') - - return { - data: result.data - } -} diff --git a/lib/commands/repos/view.js b/lib/commands/repos/view.js deleted file mode 100644 index a6251a75..00000000 --- a/lib/commands/repos/view.js +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -// @ts-ignore -import chalkTable from 'chalk-table' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const view = { - description: 'View repositories in an organization', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' view' - - const input = setupCommand(name, view.description, argv, importMeta) - if (input) { - const spinnerText = 'Fetching repository... \n' - const spinner = ora(spinnerText).start() - await viewRepository(input.orgSlug, input.repositoryName, spinner) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} repositoryName - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown - } = cli.flags - - if (!cli.input[0]) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug and repository name \n`) - cli.showHelp() - return - } - - const [orgSlug = '', repositoryName = ''] = cli.input - - return { - outputJson, - outputMarkdown, - orgSlug, - repositoryName - } -} - -/** - * @typedef RepositoryData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrgRepo'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {string} repoName - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function viewRepository (orgSlug, repoName, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.getOrgRepo(orgSlug, repoName), 'fetching repository') - - if (!result.success) { - return handleUnsuccessfulApiResponse('getOrgRepo', result, spinner) - } - - spinner.stop() - - const options = { - columns: [ - { field: 'id', name: chalk.magenta('ID') }, - { field: 'name', name: chalk.magenta('Name') }, - { field: 'visibility', name: chalk.magenta('Visibility') }, - { field: 'default_branch', name: chalk.magenta('Default branch') }, - { field: 'homepage', name: chalk.magenta('Homepage') }, - { field: 'archived', name: chalk.magenta('Archived') }, - { field: 'created_at', name: chalk.magenta('Created at') } - ] - } - - const table = chalkTable(options, [result.data]) - - console.log(table, '\n') - - return { - data: result.data - } -} diff --git a/lib/commands/scan/delete.js b/lib/commands/scan/delete.js deleted file mode 100644 index c5f5918c..00000000 --- a/lib/commands/scan/delete.js +++ /dev/null @@ -1,112 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const del = { - description: 'Delete a scan', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' del' - - const input = setupCommand(name, del.description, argv, importMeta) - if (input) { - const spinnerText = 'Deleting scan...' - const spinner = ora(spinnerText).start() - await deleteOrgFullScan(input.orgSlug, input.fullScanId, spinner) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} fullScanId - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - } = cli.flags - - if (cli.input.length < 2) { - console.error(`${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n`) - cli.showHelp() - return - } - - const [orgSlug = '', fullScanId = ''] = cli.input - - return { - outputJson, - outputMarkdown, - orgSlug, - fullScanId - } -} - -/** - * @typedef FullScanData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'deleteOrgFullScan'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {string} fullScanId - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function deleteOrgFullScan (orgSlug, fullScanId, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.deleteOrgFullScan(orgSlug, fullScanId), 'Deleting scan') - - if (!result.success) { - return handleUnsuccessfulApiResponse('deleteOrgFullScan', result, spinner) - } - - console.log('\n ✅ Scan deleted successfully. \n') - - spinner.stop() - - return { - data: result.data - } -} diff --git a/lib/commands/scan/metadata.js b/lib/commands/scan/metadata.js deleted file mode 100644 index 8b8c4290..00000000 --- a/lib/commands/scan/metadata.js +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const metadata = { - description: 'Get a scan\'s metadata', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' metadata' - - const input = setupCommand(name, metadata.description, argv, importMeta) - if (input) { - const spinnerText = 'Getting scan\'s metadata... \n' - const spinner = ora(spinnerText).start() - await getOrgScanMetadata(input.orgSlug, input.scanID, spinner) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} scanID - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags, - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - } = cli.flags - - if (cli.input.length < 2) { - console.error(`${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n`) - cli.showHelp() - return - } - - const [orgSlug = '', scanID = ''] = cli.input - - return { - outputJson, - outputMarkdown, - orgSlug, - scanID - } -} - -/** - * @typedef FullScansData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrgFullScanMetadata'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {string} scanId - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function getOrgScanMetadata (orgSlug, scanId, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.getOrgFullScanMetadata(orgSlug, scanId), 'Listing scans') - - if (!result.success) { - return handleUnsuccessfulApiResponse('getOrgFullScanMetadata', result, spinner) - } - spinner.stop() - - console.log('\nScan metadata: \n') - - console.log(result.data) - - return { - data: result.data - } -} diff --git a/lib/commands/scan/stream.js b/lib/commands/scan/stream.js deleted file mode 100644 index a9f41ba3..00000000 --- a/lib/commands/scan/stream.js +++ /dev/null @@ -1,115 +0,0 @@ -/* eslint-disable no-console */ - -import chalk from 'chalk' -import meow from 'meow' -import ora from 'ora' - -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' - -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const stream = { - description: 'Stream the output of a scan', - async run (argv, importMeta, { parentName }) { - const name = parentName + ' stream' - - const input = setupCommand(name, stream.description, argv, importMeta) - if (input) { - const spinnerText = 'Streaming scan... \n' - const spinner = ora(spinnerText).start() - await getOrgFullScan(input.orgSlug, input.fullScanId, input.file, spinner) - } - } -} - -// Internal functions - -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} fullScanId - * @property {string | undefined} file - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { - ...outputFlags - } - - const cli = meow(` - Usage - $ ${name} - - Options - ${printFlagList(flags, 6)} - - Examples - $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 ./stream.txt - `, { - argv, - description, - importMeta, - flags - }) - - const { - json: outputJson, - markdown: outputMarkdown, - } = cli.flags - - if (cli.input.length < 2) { - console.error(`${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n`) - cli.showHelp() - return - } - - const [orgSlug = '', fullScanId = '', file] = cli.input - - return { - outputJson, - outputMarkdown, - orgSlug, - fullScanId, - file - } -} - -/** - * @typedef FullScanData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrgFullScan'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {string} fullScanId - * @param {string | undefined} file - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function getOrgFullScan (orgSlug, fullScanId, file, spinner) { - const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.getOrgFullScan(orgSlug, fullScanId, file), 'Streaming a scan') - - if (!result?.success) { - return handleUnsuccessfulApiResponse('getOrgFullScan', result, spinner) - } - - spinner.stop() - - console.log(file ? `\nFull scan details written to ${file} \n` : '\nFull scan details: \n') - - return { - data: result.data - } -} diff --git a/lib/flags/command.js b/lib/flags/command.js deleted file mode 100644 index 59a569a9..00000000 --- a/lib/flags/command.js +++ /dev/null @@ -1,14 +0,0 @@ -import { prepareFlags } from '../utils/flags.js' - -export const commandFlags = prepareFlags({ - enable: { - type: 'boolean', - default: false, - description: 'Enables the Socket npm/npx wrapper', - }, - disable: { - type: 'boolean', - default: false, - description: 'Disables the Socket npm/npx wrapper', - } -}) diff --git a/lib/flags/index.js b/lib/flags/index.js deleted file mode 100644 index 60ea7174..00000000 --- a/lib/flags/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { outputFlags } from './output.js' -export { validationFlags } from './validation.js' -export { commandFlags } from './command.js' diff --git a/lib/flags/output.js b/lib/flags/output.js deleted file mode 100644 index a96662b1..00000000 --- a/lib/flags/output.js +++ /dev/null @@ -1,16 +0,0 @@ -import { prepareFlags } from '../utils/flags.js' - -export const outputFlags = prepareFlags({ - json: { - type: 'boolean', - shortFlag: 'j', - default: false, - description: 'Output result as json', - }, - markdown: { - type: 'boolean', - shortFlag: 'm', - default: false, - description: 'Output result as markdown', - }, -}) diff --git a/lib/flags/validation.js b/lib/flags/validation.js deleted file mode 100644 index 0f986dee..00000000 --- a/lib/flags/validation.js +++ /dev/null @@ -1,14 +0,0 @@ -import { prepareFlags } from '../utils/flags.js' - -export const validationFlags = prepareFlags({ - all: { - type: 'boolean', - default: false, - description: 'Include all issues', - }, - strict: { - type: 'boolean', - default: false, - description: 'Exits with an error code if any matching issues are found', - }, -}) diff --git a/lib/shadow/bin/npm b/lib/shadow/bin/npm deleted file mode 100755 index 4f1908fa..00000000 --- a/lib/shadow/bin/npm +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('../npm-cli.cjs') diff --git a/lib/shadow/bin/npx b/lib/shadow/bin/npx deleted file mode 100755 index 8a5d48c1..00000000 --- a/lib/shadow/bin/npx +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('../npx-cli.cjs') diff --git a/lib/shadow/link.cjs b/lib/shadow/link.cjs deleted file mode 100644 index c0bb7b8e..00000000 --- a/lib/shadow/link.cjs +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable no-console */ -const { realpathSync } = require('fs') -const path = require('path') - -const which = require('which') - -if (process.platform === 'win32') { - console.error('Socket dependency manager Windows suppport is limited to WSL at this time.') - process.exit(1) -} - -/** - * @param {string} realDirname path to shadow/bin - * @param {'npm' | 'npx'} binname - * @returns {string} path to original bin - */ -function installLinks (realDirname, binname) { - const realShadowBinDir = realDirname - // find package manager being shadowed by this process - const bins = which.sync(binname, { - all: true - }) - let shadowIndex = -1 - const binpath = bins.find((binPath, i) => { - const isShadow = realpathSync(path.dirname(binPath)) === realShadowBinDir - if (isShadow) { - shadowIndex = i - } - return !isShadow - }) - if (binpath && process.platform === 'win32') { - return binpath - } - if (!binpath) { - console.error(`Socket unable to locate ${binname}; ensure it is available in the PATH environment variable`) - process.exit(127) - } - if (shadowIndex === -1) { - const bindir = path.join(realDirname) - process.env['PATH'] = `${ - bindir - }${ - process.platform === 'win32' ? ';' : ':' - }${ - process.env['PATH'] - }` - } - return binpath -} -module.exports = installLinks diff --git a/lib/shadow/npm-cli.cjs b/lib/shadow/npm-cli.cjs deleted file mode 100755 index 323f3483..00000000 --- a/lib/shadow/npm-cli.cjs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node -// THIS FILE USES .cjs to get around the extension-free entrypoint problem with ESM -'use strict' -const { spawn } = require('child_process') -const { realpathSync } = require('fs') -const path = require('path') - -const realFilename = realpathSync(__filename) -const realDirname = path.dirname(realFilename) - -/** - */ -async function main () { - const npmpath = await require('./link.cjs')(path.join(realDirname, 'bin'), 'npm') - process.exitCode = 1 - const injectionpath = path.join(realDirname, 'npm-injection.cjs') - spawn(process.execPath, ['--require', injectionpath, npmpath, ...process.argv.slice(2)], { - stdio: 'inherit' - }).on('exit', (code, signal) => { - if (signal) { - process.kill(process.pid, signal) - } else if (code !== null) { - process.exit(code) - } - }) -} -main() diff --git a/lib/shadow/npm-injection.cjs b/lib/shadow/npm-injection.cjs deleted file mode 100644 index fb26715f..00000000 --- a/lib/shadow/npm-injection.cjs +++ /dev/null @@ -1,649 +0,0 @@ -/* eslint-disable no-console */ -// THIS MUST BE CJS TO WORK WITH --require -'use strict' - -const events = require('events') -const fs = require('fs') -const https = require('https') -const path = require('path') -const rl = require('readline') -const { PassThrough } = require('stream') - -const config = require('@socketsecurity/config') - -const oraPromise = import('ora') -const isInteractivePromise = import('is-interactive') -const chalkPromise = import('chalk') -const chalkMarkdownPromise = import('../utils/chalk-markdown.js') -const settingsPromise = import('../utils/settings.js') -const sdkPromise = import('../utils/sdk.js') -const createTTYServer = require('./tty-server.cjs') -const { createIssueUXLookup } = require('../utils/issue-rules.cjs') -const { isErrnoException } = require('../utils/type-helpers.cjs') - -try { - // due to update-notifier pkg being ESM only we actually spawn a subprocess sadly - require('child_process').spawnSync(process.execPath, [ - path.join(__dirname, 'update-notifier.mjs') - ], { - stdio: 'inherit' - }) -} catch (e) { - // ignore if update notification fails -} - -/** - * @typedef {import('stream').Readable} Readable - */ -/** - * @typedef {import('stream').Writable} Writable - */ - -const pubTokenPromise = sdkPromise.then(({ getDefaultKey, FREE_API_KEY }) => getDefaultKey() || FREE_API_KEY) -const apiKeySettingsInit = sdkPromise.then(async ({ setupSdk }) => { - try { - const sdk = await setupSdk(await pubTokenPromise) - const orgResult = await sdk.getOrganizations() - if (!orgResult.success) { - throw new Error('Failed to fetch Socket organization info: ' + orgResult.error.message) - } - /** - * @type {(Exclude)[]} - */ - const orgs = [] - for (const org of Object.values(orgResult.data.organizations)) { - if (org) { - orgs.push(org) - } - } - const result = await sdk.postSettings(orgs.map(org => { - return { - organization: org.id - } - })) - if (!result.success) { - throw new Error('Failed to fetch API key settings: ' + result.error.message) - } - return { - orgs, - settings: result.data - } - } catch (e) { - if (e && typeof e === 'object' && 'cause' in e) { - const cause = e.cause - if (isErrnoException(cause)) { - if (cause.code === 'ENOTFOUND' || cause.code === 'ECONNREFUSED') { - throw new Error('Unable to connect to socket.dev, ensure internet connectivity before retrying', { - cause: e - }) - } - } - } - throw e - } -}) -// mark apiKeySettingsInit as handled -apiKeySettingsInit.catch(() => {}) - -/** - * - */ -async function findSocketYML () { - let prevDir = null - let dir = process.cwd() - const fs = require('fs/promises') - while (dir !== prevDir) { - const ymlPath = path.join(dir, 'socket.yml') - const yml = fs.readFile(ymlPath, 'utf-8') - // mark as handled - yml.catch(() => {}) - const yamlPath = path.join(dir, 'socket.yaml') - const yaml = fs.readFile(yamlPath, 'utf-8') - // mark as handled - yaml.catch(() => {}) - /** - * @param {unknown} e - * @returns {boolean} - */ - function checkFileFoundError (e) { - if (isErrnoException(e)) { - if (e.code !== 'ENOENT' && e.code !== 'EISDIR') { - throw e - } - return false - } - return true - } - try { - return { - path: ymlPath, - parsed: config.parseSocketConfig(await yml) - } - } catch (e) { - if (checkFileFoundError(e)) { - throw new Error('Found file but was unable to parse ' + ymlPath) - } - } - try { - return { - path: ymlPath, - parsed: config.parseSocketConfig(await yaml) - } - } catch (e) { - if (checkFileFoundError(e)) { - throw new Error('Found file but was unable to parse ' + yamlPath) - } - } - prevDir = dir - dir = path.join(dir, '..') - } - return null -} - -/** - * @type {Promise | undefined>} - */ -const uxLookupInit = settingsPromise.then(async ({ getSetting }) => { - const enforcedOrgs = getSetting('enforcedOrgs') ?? [] - const remoteSettings = await apiKeySettingsInit - const { orgs, settings } = remoteSettings - - // remove any organizations not being enforced - for (const [i, org] of orgs.entries()) { - if (!enforcedOrgs.includes(org.id)) { - settings.entries.splice(i, 1) - } - } - - const socketYml = await findSocketYML() - if (socketYml) { - settings.entries.push({ - start: socketYml.path, - // @ts-ignore - settings: { - [socketYml.path]: { - deferTo: null, - issueRules: socketYml.parsed.issueRules - } - } - }) - } - return createIssueUXLookup(settings) -}) -// mark uxLookupInit as handled -uxLookupInit.catch(() => {}) - -// shadow `npm` and `npx` to mitigate subshells -require('./link.cjs')(fs.realpathSync(path.join(__dirname, 'bin')), 'npm') - -/** - * - * @param {string} pkgid - * @returns {{name: string, version: string}} - */ -const pkgidParts = (pkgid) => { - const delimiter = pkgid.lastIndexOf('@') - const name = pkgid.slice(0, delimiter) - const version = pkgid.slice(delimiter + 1) - return { name, version } -} - -/** - * @typedef PURLParts - * @property {'npm'} type - * @property {string} namespace_and_name - * @property {string} version - * @property {URL['href']} repository_url - */ - -/** - * @param {string[]} pkgids - * @returns {AsyncGenerator<{eco: string, pkg: string, ver: string } & ({type: 'missing'} | {type: 'success', value: { issues: any[] }})>} - */ -async function * batchScan ( - pkgids -) { - const pubToken = await pubTokenPromise - const query = { - packages: pkgids.map(pkgid => { - const { name, version } = pkgidParts(pkgid) - return { - eco: 'npm', pkg: name, ver: version, top: true - } - }) - } - // TODO: migrate to SDK - const pkgDataReq = https.request( - 'https://api.socket.dev/v0/scan/batch', - { - method: 'POST', - headers: { - Authorization: `Basic ${Buffer.from(`${pubToken}:`).toString('base64url')}` - } - } - ).end( - JSON.stringify(query) - ) - const [res] = await events.once(pkgDataReq, 'response') - const isSuccess = res.statusCode === 200 - if (!isSuccess) { - throw new Error('Socket API Error: ' + res.statusCode) - } - const rli = rl.createInterface(res) - for await (const line of rli) { - const result = JSON.parse(line) - yield result - } -} - -/** - * @type {import('./translations.json') | null} - */ -let translations = null -/** - * @type {import('../utils/chalk-markdown.js').ChalkOrMarkdown | null} - */ -let formatter = null - -const ttyServerPromise = chalkPromise.then(async (chalk) => { - return createTTYServer(chalk.default.level, (await isInteractivePromise).default({ - stream: process.stdin - }), npmlog) -}) - -const npmEntrypoint = fs.realpathSync(`${process.argv[1]}`) -/** - * @param {string} filepath - * @returns {string | null} - */ -function findRoot (filepath) { - if (path.basename(filepath) === 'npm') { - return filepath - } - const parent = path.dirname(filepath) - if (parent === filepath) { - return null - } - return findRoot(parent) -} -const npmDir = findRoot(path.dirname(npmEntrypoint)) -if (npmDir === null) { - console.error('Unable to find npm cli install directory, this is potentiall a bug with socket-npm caused by changes to npm cli.') - console.error(`Searched parent directories of ${npmEntrypoint}`) - process.exit(127) -} -let arboristLibClassPath -try { - arboristLibClassPath = path.join(npmDir, 'node_modules', '@npmcli', 'arborist', 'lib', 'arborist', 'index.js') -} catch (e) { - console.error('Unable to integrate with npm cli internals, this is potentially a bug with socket-npm caused by changes to npm cli.') - process.exit(127); -} - -let npmlog - -try { - npmlog = require(path.join(npmDir, 'node_modules', 'npmlog', 'lib', 'log.js')) -} catch { - try { - const { log } = require(path.join(npmDir, 'node_modules', 'proc-log', 'lib', 'index.js')) - npmlog = log - } catch { - console.error('Unable to integrate with npm cli logging infrastructure, this is potentially a bug with socket-npm caused by changes to npm cli.') - process.exit(127); - } -} - -/** - * @type {import('pacote')} - */ -const pacote = require(path.join(npmDir, 'node_modules', 'pacote')) - -/** - * @type {typeof import('@npmcli/arborist')} - */ -const Arborist = require(arboristLibClassPath) - -const kCtorArgs = Symbol('ctorArgs') -const kRiskyReify = Symbol('riskyReify') -class SafeArborist extends Arborist { - /** - * @param {ConstructorParameters} ctorArgs - */ - constructor (...ctorArgs) { - const mutedArguments = [{ - ...(ctorArgs[0] ?? {}), - audit: true, - dryRun: true, - ignoreScripts: true, - save: false, - saveBundle: false, - // progress: false, - fund: false - }, ctorArgs.slice(1)] - super(...mutedArguments) - this[kCtorArgs] = ctorArgs - } - - /** - * @param {Parameters['reify']>} args - */ - async [kRiskyReify] (...args) { - // safe arborist has suffered side effects and must be rebuilt from scratch - const arb = new Arborist(...this[kCtorArgs]) - const ret = await arb.reify(...args) - Object.assign(this, arb) - return ret - } - - /** - * @param {Parameters['reify']>} args - * @override - */ - async reify (...args) { - // @ts-expect-error types are wrong - if (args[0]?.dryRun) { - return this[kRiskyReify](...args) - } - args[0] ??= {} - const old = { - dryRun: false, - save: Boolean(args[0].save ?? true), - saveBundle: Boolean(args[0].saveBundle ?? false), - ...args[0] - } - // @ts-expect-error types are wrong - args[0].dryRun = true - args[0].save = false - args[0].saveBundle = false - // const originalDescriptors = Object.getOwnPropertyDescriptors(this) - // TODO: make this deal w/ any refactor to private fields by punching the class itself - await super.reify(...args) - const diff = gatherDiff(this) - // @ts-expect-error types are wrong - args[0].dryRun = old.dryRun - args[0].save = old.save - args[0].saveBundle = old.saveBundle - // nothing to check, mmm already installed or all private? - if (diff.findIndex(c => c.newPackage.repository_url === 'https://registry.npmjs.org') === -1) { - return this[kRiskyReify](...args) - } - const ttyServer = await ttyServerPromise - const proceed = await ttyServer.captureTTY(async (input, output, colorLevel) => { - if (input && output) { - const chalkNS = await chalkPromise - chalkNS.default.level = colorLevel - const oraNS = await oraPromise - const ora = () => { - return oraNS.default({ - stream: output, - color: 'cyan', - isEnabled: true, - isSilent: false, - hideCursor: true, - discardStdin: true, - spinner: oraNS.spinners.dots, - }) - } - const risky = await packagesHaveRiskyIssues(this, this.registry, diff, ora, input, output) - if (!risky) { - return true - } - const rl = require('readline') - const rlin = new PassThrough() - input.pipe(rlin, { - end: true - }) - const rlout = new PassThrough() - rlout.pipe(output, { - end: false - }) - const rli = rl.createInterface(rlin, rlout) - try { - while (true) { - /** - * @type {string} - */ - const answer = await new Promise((resolve) => { - rli.question('Accept risks of installing these packages (y/N)? ', (str) => resolve(str)) - }) - if (/^\s*y(es)?\s*$/i.test(answer)) { - return true - } else if (/^(\s*no?\s*|)$/i.test(answer)) { - return false - } - } - } finally { - rli.close() - } - } else { - if (await packagesHaveRiskyIssues(this, this.registry, diff, null, null, output)) { - throw new Error('Socket npm Unable to prompt to accept risk, need TTY to do so') - } - return true - } - // @ts-ignore paranoia - // eslint-disable-next-line - return false - }) - if (proceed) { - return this[kRiskyReify](...args) - } else { - throw new Error('Socket npm exiting due to risks') - } - } -} -// @ts-ignore -require.cache[arboristLibClassPath].exports = SafeArborist - -/** - * @typedef {{ - * check: InstallEffect[], - * unknowns: InstallEffect[] - * }} InstallDiff - */ - -/** - * @param {InstanceType} arb - * @returns {InstallEffect[]} - */ -function gatherDiff (arb) { - return walk(arb.diff) -} -/** - * @typedef InstallEffect - * @property {import('@npmcli/arborist').Diff['action']} action - * @property {import('@npmcli/arborist').Node['pkgid'] | null} existing - * @property {import('@npmcli/arborist').Node['pkgid']} pkgid - * @property {import('@npmcli/arborist').Node['resolved']} resolved - * @property {import('@npmcli/arborist').Node['location']} location - * @property {PURLParts | null} oldPackage - * @property {PURLParts} newPackage - */ -/** - * @param {import('@npmcli/arborist').Diff | null} diff - * @param {InstallEffect[]} needInfoOn - * @returns {InstallEffect[]} - */ -function walk (diff, needInfoOn = []) { - if (!diff) { - return needInfoOn - } - - if (diff.action) { - const sameVersion = diff.actual?.package.version === diff.ideal?.package.version - let keep = false - let existing = null - if (diff.action === 'CHANGE') { - if (!sameVersion) { - existing = diff.actual.pkgid - keep = true - } else { - // console.log('SKIPPING META CHANGE ON', diff) - } - } else { - keep = diff.action !== 'REMOVE' - } - if (keep) { - if (diff.ideal?.pkgid) { - /** - * - * @param {string} pkgid - `pkg@ver` - * @param {string} resolved - tarball link, should match `/name/-/name-ver.tgz` as tail, used to obtain repository_url - * @returns {PURLParts} - */ - function toPURL (pkgid, resolved) { - const repo = resolved - .replace(/#[\s\S]*$/u, '') - .replace(/\?[\s\S]*$/u, '') - .replace(/\/[^/]*\/-\/[\s\S]*$/u, '') - const { name, version } = pkgidParts(pkgid) - return { - type: 'npm', - namespace_and_name: name, - version, - repository_url: repo - } - } - if (diff.ideal.resolved && (!diff.actual || diff.actual.resolved)) { - needInfoOn.push({ - existing, - action: diff.action, - location: diff.ideal.location, - pkgid: diff.ideal.pkgid, - newPackage: toPURL(diff.ideal.pkgid, diff.ideal.resolved), - oldPackage: diff.actual && diff.actual.resolved ? toPURL(diff.actual.pkgid, diff.actual.resolved) : null, - resolved: diff.ideal.resolved, - }) - } - } - } - } - if (diff.children) { - for (const child of diff.children) { - walk(child, needInfoOn) - } - } - return needInfoOn -} - -/** - * @param {SafeArborist} safeArb - * @param {string} _registry - * @param {InstallEffect[]} pkgs - * @param {import('ora')['default'] | null} ora - * @param {Readable | null} [_input] - * @param {Writable | null} [output] - * @returns {Promise} - */ -async function packagesHaveRiskyIssues (safeArb, _registry, pkgs, ora = null, _input, output) { - let failed = false - if (pkgs.length) { - let remaining = pkgs.length - /** - * - * @returns {string} - */ - function getText () { - return `Looking up data for ${remaining} packages` - } - const spinner = ora ? ora().start(getText()) : null - const pkgDatas = [] - try { - // TODO: determine org based on cwd, pass in - const uxLookup = await uxLookupInit - - for await (const pkgData of batchScan(pkgs.map(pkg => pkg.pkgid))) { - /** - * @type {Array} - */ - let failures = [] - let displayWarning = false - const name = pkgData.pkg - const version = pkgData.ver - let blocked = false - if (pkgData.type === 'missing') { - failed = true - failures.push({ - type: 'missingDependency' - }) - continue - } else { - for (const failure of pkgData.value.issues) { - const ux = await uxLookup({ package: { name, version }, issue: { type: failure.type } }) - if (ux.display || ux.block) { - failures.push({ raw: failure, block: ux.block }) - // before we ask about problematic issues, check to see if they already existed in the old version - // if they did, be quiet - const pkg = pkgs.find(pkg => pkg.pkgid === `${pkgData.pkg}@${pkgData.ver}` && pkg.existing?.startsWith(pkgData.pkg + '@')) - if (pkg?.existing) { - for await (const oldPkgData of batchScan([pkg.existing])) { - if (oldPkgData.type === 'success') { - failures = failures.filter( - issue => oldPkgData.value.issues.find(oldIssue => oldIssue.type === issue.raw.type) == null - ) - } - } - } - } - if (ux.block) { - failed = true - blocked = true - } - if (ux.display) { - displayWarning = true - } - } - } - if (!blocked) { - const pkg = pkgs.find(pkg => pkg.pkgid === `${pkgData.pkg}@${pkgData.ver}`) - if (pkg) { - pacote.tarball.stream(pkg.pkgid, (stream) => { - stream.resume() - // @ts-ignore pacote does a naughty - return stream.promise() - }, { ...safeArb[kCtorArgs][0] }) - } - } - if (displayWarning) { - translations ??= JSON.parse(fs.readFileSync(path.join(__dirname, '/translations.json'), 'utf-8')) - formatter ??= new ((await chalkMarkdownPromise).ChalkOrMarkdown)(false) - spinner?.stop() - output?.write(`(socket) ${formatter.hyperlink(`${name}@${version}`, `https://socket.dev/npm/package/${name}/overview/${version}`)} contains risks:\n`) - const lines = new Set() - for (const failure of failures.sort((a, b) => a.raw.type < b.raw.type ? -1 : 1)) { - const type = failure.raw.type - if (type) { - // @ts-ignore - const issueTypeTranslation = translations.issues[type] - // TODO: emoji seems to misalign terminals sometimes - // @ts-ignore - lines.add(` ${issueTypeTranslation?.title ?? type}${failure.block ? '' : ' (non-blocking)'} - ${issueTypeTranslation?.description ?? ''}\n`) - } - } - for (const line of lines) { - output?.write(line) - } - spinner?.start() - } - remaining-- - if (remaining !== 0) { - if (spinner) { - spinner.text = getText() - } - } - pkgDatas.push(pkgData) - } - return failed - } finally { - if (spinner?.isSpinning) { - spinner?.stop() - } - } - } else { - if (ora) { - ora('').succeed('No changes detected') - } - return false - } -} diff --git a/lib/shadow/npx-cli.cjs b/lib/shadow/npx-cli.cjs deleted file mode 100755 index 89964fa2..00000000 --- a/lib/shadow/npx-cli.cjs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node -// THIS FILE USES .cjs to get around the extension-free entrypoint problem with ESM -'use strict' -const { spawn } = require('child_process') -const { realpathSync } = require('fs') -const path = require('path') - -const realFilename = realpathSync(__filename) -const realDirname = path.dirname(realFilename) - -/** - */ -async function main () { - const npxpath = await require('./link.cjs')(path.join(realDirname, 'bin'), 'npx') - process.exitCode = 1 - const injectionpath = path.join(realDirname, 'npm-injection.cjs') - spawn(process.execPath, ['--require', injectionpath, npxpath, ...process.argv.slice(2)], { - stdio: 'inherit' - }).on('exit', (code, signal) => { - if (signal) { - process.kill(process.pid, signal) - } else if (code !== null) { - process.exit(code) - } - }) -} -main() diff --git a/lib/shadow/package.json b/lib/shadow/package.json deleted file mode 100644 index 5bbefffb..00000000 --- a/lib/shadow/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/lib/shadow/tty-server.cjs b/lib/shadow/tty-server.cjs deleted file mode 100644 index c6c657fa..00000000 --- a/lib/shadow/tty-server.cjs +++ /dev/null @@ -1,222 +0,0 @@ -const path = require('path') -const { PassThrough } = require('stream') - -const ipc_version = require('../../package.json').version -const { isErrnoException } = require('../utils/type-helpers.cjs') - -/** - * @typedef {import('stream').Readable} Readable - */ -/** - * @typedef {import('stream').Writable} Writable - */ -/** - * @param {import('chalk')['default']['level']} colorLevel - * @param {boolean} isInteractive - * @param {any} npmlog - * @returns {Promise<{ captureTTY(mutexFn: (input: Readable | null, output?: Writable, colorLevel: import('chalk')['default']['level']) => Promise): Promise }>} - */ -module.exports = async function createTTYServer (colorLevel, isInteractive, npmlog) { - const TTY_IPC = process.env['SOCKET_SECURITY_TTY_IPC'] - const net = require('net') - /** - * @type {import('readline')} - */ - let readline - const isSTDINInteractive = isInteractive - if (!isSTDINInteractive && TTY_IPC) { - return { - async captureTTY (mutexFn) { - return new Promise((resolve, reject) => { - const conn = net.createConnection({ - path: TTY_IPC - }).on('error', reject) - let captured = false - /** - * @type {Array} - */ - const bufs = [] - conn.on('data', function awaitCapture (chunk) { - bufs.push(chunk) - /** - * @type {Buffer | null} - */ - let lineBuff = Buffer.concat(bufs) - try { - if (!captured) { - const EOL = lineBuff.indexOf('\n'.charCodeAt(0)) - if (EOL !== -1) { - conn.removeListener('data', awaitCapture) - conn.push(lineBuff.slice(EOL + 1)) - const { - ipc_version: remote_ipc_version, - capabilities: { input: hasInput, output: hasOutput, colorLevel: ipcColorLevel } - } = JSON.parse(lineBuff.slice(0, EOL).toString('utf-8')) - lineBuff = null - captured = true - if (remote_ipc_version !== ipc_version) { - throw new Error('Mismatched STDIO tunnel IPC version, ensure you only have 1 version of socket CLI being called.') - } - const input = hasInput ? new PassThrough() : null - input?.pause() - if (input) conn.pipe(input) - const output = hasOutput ? new PassThrough() : null - output?.pipe(conn) - // make ora happy - // @ts-ignore - output.isTTY = true - // @ts-ignore - output.cursorTo = function cursorTo (x, y, callback) { - readline = readline || require('readline') - // @ts-ignore - readline.cursorTo(this, x, y, callback) - } - // @ts-ignore - output.clearLine = function clearLine (dir, callback) { - readline = readline || require('readline') - // @ts-ignore - readline.clearLine(this, dir, callback) - } - mutexFn(hasInput ? input : null, hasOutput ? /** @type {Writable} */(output) : undefined, ipcColorLevel) - .then(resolve, reject) - .finally(() => { - conn.unref() - conn.end() - input?.end() - output?.end() - // process.exit(13) - }) - } - } - } catch (e) { - reject(e) - } - }) - }) - } - } - } - /** - * @type {Array<{resolve(): void}>}} - */ - const pendingCaptures = [] - let captured = false - const sock = path.join(require('os').tmpdir(), `socket-security-tty-${process.pid}.sock`) - process.env['SOCKET_SECURITY_TTY_IPC'] = sock - try { - await require('fs/promises').unlink(sock) - } catch (e) { - if (isErrnoException(e) && e.code !== 'ENOENT') { - throw e - } - } - const input = isSTDINInteractive ? process.stdin : null - const output = process.stderr - if (input) { - await new Promise((resolve, reject) => { - const server = net.createServer(async (conn) => { - if (captured) { - const captured = new Promise((resolve) => { - pendingCaptures.push({ - resolve () { - resolve(undefined) - } - }) - }) - await captured - } else { - captured = true - } - const wasProgressEnabled = npmlog.progressEnabled - npmlog.pause() - if (wasProgressEnabled) { - npmlog.disableProgress() - } - conn.write(`${JSON.stringify({ - ipc_version, - capabilities: { - input: Boolean(input), - output: true, - colorLevel - } - })}\n`) - conn.on('data', (data) => { - output.write(data) - }) - conn.on('error', (e) => { - output.write(`there was an error prompting from a subshell (${e.message}), socket npm closing`) - process.exit(1) - }) - input.on('data', (data) => { - conn.write(data) - }) - input.on('end', () => { - conn.unref() - conn.end() - if (wasProgressEnabled) { - npmlog.enableProgress() - } - npmlog.resume() - nextCapture() - }) - }).listen(sock, () => resolve(server)).on('error', (err) => { - reject(err) - }).unref() - process.on('exit', () => { - server.close() - try { - require('fs').unlinkSync(sock) - } catch (e) { - if (isErrnoException(e) && e.code !== 'ENOENT') { - throw e - } - } - }) - resolve(server) - }) - } - /** - * - */ - function nextCapture () { - if (pendingCaptures.length > 0) { - const nextCapture = pendingCaptures.shift() - if (nextCapture) { - nextCapture.resolve() - } - } else { - captured = false - } - } - return { - async captureTTY (mutexFn) { - if (captured) { - const captured = new Promise((resolve) => { - pendingCaptures.push({ - resolve () { - resolve(undefined) - } - }) - }) - await captured - } else { - captured = true - } - const wasProgressEnabled = npmlog.progressEnabled - try { - npmlog.pause() - if (wasProgressEnabled) { - npmlog.disableProgress() - } - // need await here for proper finally timing - return await mutexFn(input, output, colorLevel) - } finally { - if (wasProgressEnabled) { - npmlog.enableProgress() - } - npmlog.resume() - nextCapture() - } - } - } -} diff --git a/lib/shadow/update-notifier.mjs b/lib/shadow/update-notifier.mjs deleted file mode 100644 index 2dc524a4..00000000 --- a/lib/shadow/update-notifier.mjs +++ /dev/null @@ -1,3 +0,0 @@ -// ESM entrypoint doesn't work w/ --require, this needs to be done w/ a spawnSync sadly -import { initUpdateNotifier } from '../utils/update-notifier.js' -initUpdateNotifier() diff --git a/lib/utils/api-helpers.js b/lib/utils/api-helpers.js deleted file mode 100644 index 0820ab94..00000000 --- a/lib/utils/api-helpers.js +++ /dev/null @@ -1,42 +0,0 @@ -import chalk from 'chalk' -import { ErrorWithCause } from 'pony-cause' - -import { AuthError } from './errors.js' - -/** - * @template {import('@socketsecurity/sdk').SocketSdkOperations} T - * @param {T} _name - * @param {import('@socketsecurity/sdk').SocketSdkErrorType} result - * @param {import('ora').Ora} spinner - * @returns {never} - */ -export function handleUnsuccessfulApiResponse (_name, result, spinner) { - const resultError = 'error' in result && result.error && typeof result.error === 'object' ? result.error : {} - const message = 'message' in resultError && typeof resultError.message === 'string' ? resultError.message : 'No error message returned' - - if (result.status === 401 || result.status === 403) { - spinner.stop() - throw new AuthError(message) - } - spinner.fail(chalk.white.bgRed('API returned an error:') + ' ' + message) - process.exit(1) -} - -/** - * @template T - * @param {Promise} value - * @param {string} description - * @returns {Promise} - */ -export async function handleApiCall (value, description) { - /** @type {T} */ - let result - - try { - result = await value - } catch (cause) { - throw new ErrorWithCause(`Failed ${description}`, { cause }) - } - - return result -} diff --git a/lib/utils/errors.js b/lib/utils/errors.js deleted file mode 100644 index 31972e8a..00000000 --- a/lib/utils/errors.js +++ /dev/null @@ -1,14 +0,0 @@ -export class AuthError extends Error {} - -export class InputError extends Error { - /** - * @param {string} message - * @param {string} [body] - */ - constructor (message, body) { - super(message) - - /** @type {string|undefined} */ - this.body = body - } -} diff --git a/lib/utils/flags.js b/lib/utils/flags.js deleted file mode 100644 index 4cff202e..00000000 --- a/lib/utils/flags.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @typedef FlagExtensions - * @property {string} description - */ - -/** - * @template {import('meow').FlagType} Type - * @template Default - * @template {boolean} [IsMultiple=false] - * @typedef {import('meow').Flag & FlagExtensions} Flag - */ - -/** @typedef {Flag<'string', string> | Flag<'string', string[], true>} StringFlag */ -/** @typedef {Flag<'boolean', boolean> | Flag<'boolean', boolean[], true>} BooleanFlag */ -/** @typedef {Flag<'number', number> | Flag<'number', number[], true>} NumberFlag */ -/** @typedef {StringFlag | BooleanFlag | NumberFlag} AnyFlag */ -/** @typedef {Record} AnyFlags */ - -/** - * @template {AnyFlags} Flags - * @param {Flags} flags - * @returns {Readonly} - */ -export function prepareFlags (flags) { - // As we can't do "satisfies AnyFlags" in JS yet (+ we add a bonus through Readonly<>) - return flags -} diff --git a/lib/utils/format-issues.js b/lib/utils/format-issues.js deleted file mode 100644 index 5c09d2cd..00000000 --- a/lib/utils/format-issues.js +++ /dev/null @@ -1,99 +0,0 @@ -/** @typedef {import('@socketsecurity/sdk').SocketSdkReturnType<'getIssuesByNPMPackage'>['data']} SocketIssueList */ -/** @typedef {SocketIssueList[number]['value'] extends infer U | undefined ? U : never} SocketIssue */ - -import { pick, stringJoinWithSeparateFinalSeparator } from './misc.js' - -const SEVERITIES_BY_ORDER = /** @type {const} */ ([ - 'critical', - 'high', - 'middle', - 'low', -]) - -/** - * @param {SocketIssue['severity']|undefined} lowestToInclude - * @returns {Array} - */ - function getDesiredSeverities (lowestToInclude) { - /** @type {Array} */ - const result = [] - - for (const severity of SEVERITIES_BY_ORDER) { - result.push(severity) - if (severity === lowestToInclude) { - break - } - } - - return result -} -/* TODO: Delete this function when we remove the report command */ -/** - * @param {SocketIssueList} issues - * @param {SocketIssue['severity']} [lowestToInclude] - * @returns {Record} - */ -export function getSeverityCount (issues, lowestToInclude) { - const severityCount = pick( - { low: 0, middle: 0, high: 0, critical: 0 }, - getDesiredSeverities(lowestToInclude) - ) - - for (const issue of issues) { - const value = issue.value - - if (!value) { - continue - } - - if (severityCount[value.severity] !== undefined) { - severityCount[value.severity] += 1 - } - } - - return severityCount -} - -/* The following function is the updated one */ -/** - * @param {Array} issues - * @param {SocketIssue['severity']} [lowestToInclude] - * @returns {Record} - */ -export function getCountSeverity (issues, lowestToInclude) { - const severityCount = pick( - { low: 0, middle: 0, high: 0, critical: 0 }, - getDesiredSeverities(lowestToInclude) - ) - - for (const issue of issues) { - const severity = issue.severity - - if (!severity) { - continue - } - - if (severityCount[severity] !== undefined) { - severityCount[severity] += 1 - } - } - - return severityCount -} - -/** - * @param {Record} severityCount - * @returns {string} - */ -export function formatSeverityCount (severityCount) { - /** @type {string[]} */ - const summary = [] - - for (const severity of SEVERITIES_BY_ORDER) { - if (severityCount[severity]) { - summary.push(`${severityCount[severity]} ${severity}`) - } - } - - return stringJoinWithSeparateFinalSeparator(summary) -} diff --git a/lib/utils/formatting.js b/lib/utils/formatting.js deleted file mode 100644 index 6da1d8b1..00000000 --- a/lib/utils/formatting.js +++ /dev/null @@ -1,47 +0,0 @@ -/** @typedef {string|{ description: string }} ListDescription */ - -/** - * @typedef HelpListOptions - * @property {string} [keyPrefix] - * @property {number} [padName] - */ - -/** - * @param {Record} list - * @param {number} indent - * @param {HelpListOptions} options - * @returns {string} - */ -export function printHelpList (list, indent, options = {}) { - const { - keyPrefix = '', - padName = 18, - } = options - - const names = Object.keys(list).sort() - - let result = '' - - for (const name of names) { - const rawDescription = list[name] - const description = (typeof rawDescription === 'object' ? rawDescription.description : rawDescription) || '' - - result += ''.padEnd(indent) + (keyPrefix + name).padEnd(padName) + description + '\n' - } - - return result.trim() -} - -/** - * @param {Record} list - * @param {number} indent - * @param {HelpListOptions} options - * @returns {string} - */ -export function printFlagList (list, indent, options = {}) { - return printHelpList({ - 'help': 'Print this help and exits.', - 'version': 'Prints current version and exits.', - ...list, - }, indent, { keyPrefix: '--', ...options }) -} diff --git a/lib/utils/issue-rules.cjs b/lib/utils/issue-rules.cjs deleted file mode 100644 index 642d4cad..00000000 --- a/lib/utils/issue-rules.cjs +++ /dev/null @@ -1,180 +0,0 @@ -//#region UX Constants -/** - * @typedef {{block: boolean, display: boolean}} RuleActionUX - */ -const IGNORE_UX = { - block: false, - display: false -} -const WARN_UX = { - block: false, - display: true -} -const ERROR_UX = { - block: true, - display: true -} -//#endregion -//#region utils -/** - * @typedef { NonNullable> & {success: true})['data']['entries'][number]['settings'][string]>['issueRules']>>[string] | boolean } NonNormalizedIssueRule - */ -/** - * @typedef { (NonNullable> & {success: true})['data']['defaults']['issueRules']>[string]> & { action: string }) | boolean } NonNormalizedResolvedIssueRule - */ -/** - * Iterates over all entries with ordered issue rule for deferal - * Iterates over all issue rules and finds the first defined value that does not defer otherwise uses the defaultValue - * Takes the value and converts into a UX workflow - * - * @param {Iterable>} entriesOrderedIssueRules - * @param {NonNormalizedResolvedIssueRule} defaultValue - * @returns {RuleActionUX} - */ -function resolveIssueRuleUX (entriesOrderedIssueRules, defaultValue) { - if (defaultValue === true || defaultValue == null) { - defaultValue = { - action: 'error' - } - } else if (defaultValue === false) { - defaultValue = { - action: 'ignore' - } - } - let block = false - let display = false - let needDefault = true - iterate_entries: - for (const issueRuleArr of entriesOrderedIssueRules) { - for (const rule of issueRuleArr) { - if (issueRuleValueDoesNotDefer(rule)) { - // there was a rule, even if a defer, don't narrow to the default - needDefault = false - const narrowingFilter = uxForDefinedNonDeferValue(rule) - block = block || narrowingFilter.block - display = display || narrowingFilter.display - continue iterate_entries - } - } - // all rules defer, narrow - const narrowingFilter = uxForDefinedNonDeferValue(defaultValue) - block = block || narrowingFilter.block - display = display || narrowingFilter.display - } - if (needDefault) { - // no config set a - const narrowingFilter = uxForDefinedNonDeferValue(defaultValue) - block = block || narrowingFilter.block - display = display || narrowingFilter.display - } - return { - block, - display - } -} - -/** - * Negative form because it is narrowing the type - * - * @type {(issueRuleValue: NonNormalizedIssueRule) => issueRuleValue is NonNormalizedResolvedIssueRule} - */ -function issueRuleValueDoesNotDefer (issueRule) { - if (issueRule === undefined) { - return false - } else if (typeof issueRule === 'object' && issueRule) { - const { action } = issueRule - if (action === undefined || action === 'defer') { - return false - } - } - return true -} - -/** - * Handles booleans for backwards compatibility - * - * @param {NonNormalizedResolvedIssueRule} issueRuleValue - * @returns {RuleActionUX} - */ -function uxForDefinedNonDeferValue (issueRuleValue) { - if (typeof issueRuleValue === 'boolean') { - return issueRuleValue ? ERROR_UX : IGNORE_UX - } - const { action } = issueRuleValue - if (action === 'warn') { - return WARN_UX - } else if (action === 'ignore') { - return IGNORE_UX - } - return ERROR_UX -} -//#endregion -//#region exports -module.exports = { - /** - * - * @param {(Awaited> & {success: true})['data']} settings - * @returns {(context: {package: {name: string, version: string}, issue: {type: string}}) => RuleActionUX} - */ - createIssueUXLookup (settings) { - /** - * @type {Map} - */ - const cachedUX = new Map() - return (context) => { - const key = context.issue.type - /** - * @type {RuleActionUX | undefined} - */ - let ux = cachedUX.get(key) - if (ux) { - return ux - } - /** - * @type {Array>} - */ - const entriesOrderedIssueRules = [] - for (const settingsEntry of settings.entries) { - /** - * @type {Array} - */ - const orderedIssueRules = [] - let target = settingsEntry.start - while (target !== null) { - const resolvedTarget = settingsEntry.settings[target] - if (!resolvedTarget) { - break - } - const issueRuleValue = resolvedTarget.issueRules?.[key] - if (typeof issueRuleValue !== 'undefined') { - orderedIssueRules.push(issueRuleValue) - } - target = resolvedTarget.deferTo ?? null - } - entriesOrderedIssueRules.push(orderedIssueRules) - } - const defaultValue = settings.defaults.issueRules[key] - /** - * @type {NonNormalizedResolvedIssueRule} - */ - let resolvedDefaultValue = { - action: 'error' - } - // @ts-ignore backcompat, cover with tests - if (defaultValue === false) { - resolvedDefaultValue = { - action: 'ignore' - } - // @ts-ignore backcompat, cover with tests - } else if (defaultValue && defaultValue !== true) { - resolvedDefaultValue = { - action: defaultValue.action ?? 'error' - } - } - ux = resolveIssueRuleUX(entriesOrderedIssueRules, resolvedDefaultValue) - cachedUX.set(key, ux) - return ux - } - } -} -//#endregion diff --git a/lib/utils/meow-with-subcommands.js b/lib/utils/meow-with-subcommands.js deleted file mode 100644 index 5fc0cb90..00000000 --- a/lib/utils/meow-with-subcommands.js +++ /dev/null @@ -1,87 +0,0 @@ -import meow from 'meow' - -import { printFlagList, printHelpList } from './formatting.js' - -/** - * @typedef CliAlias - * @property {string} description - * @property {readonly string[]} argv - */ - -/** @typedef {Record} CliAliases */ - -/** - * @callback CliSubcommandRun - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @param {{ parentName: string }} context - * @returns {Promise|void} - */ - -/** - * @typedef CliSubcommand - * @property {string} description - * @property {CliSubcommandRun} run - */ - -/** - * @param {Record} subcommands - * @param {import('meow').Options & { aliases?: CliAliases, argv: readonly string[], name: string }} options - * @returns {Promise} - */ -export async function meowWithSubcommands (subcommands, options) { - const { - aliases = {}, - argv, - name, - importMeta, - ...additionalOptions - } = options - - const [commandOrAliasName, ...rawCommandArgv] = argv - - // If we got at least some args, then lets find out if we can find a command - if (commandOrAliasName) { - const alias = aliases[commandOrAliasName] - - // First: Resolve argv data from alias if its an alias that's been given - const [commandName, ...commandArgv] = alias - ? [...alias.argv, ...rawCommandArgv] - : [commandOrAliasName, ...rawCommandArgv] - - // Second: Find a command definition using that data - const commandDefinition = commandName ? subcommands[commandName] : undefined - - // Third: If a valid command has been found, then we run it... - if (commandDefinition) { - return await commandDefinition.run( - commandArgv, - importMeta, - { - parentName: name - } - ) - } - } - - // ...else we provide basic instructions and help - const cli = meow(` - Usage - $ ${name} - - Commands - ${printHelpList({ ...subcommands, ...aliases }, 6)} - - Options - ${printFlagList({}, 6)} - - Examples - $ ${name} --help - `, { - argv, - importMeta, - ...additionalOptions, - }) - - cli.showHelp() -} diff --git a/lib/utils/misc.js b/lib/utils/misc.js deleted file mode 100644 index 378266fe..00000000 --- a/lib/utils/misc.js +++ /dev/null @@ -1,61 +0,0 @@ -import { logSymbols } from './chalk-markdown.js' - -/** - * @param {boolean|undefined} printDebugLogs - * @returns {typeof console.error} - */ -export function createDebugLogger (printDebugLogs) { - return printDebugLogs - // eslint-disable-next-line no-console - ? /** @type { (...params: unknown[]) => void } */(...params) => console.error(logSymbols.info, ...params) - : () => {} -} - -/** - * @param {(string|undefined)[]} list - * @param {string} separator - * @returns {string} - */ -export function stringJoinWithSeparateFinalSeparator (list, separator = ' and ') { - const values = list.filter(value => !!value) - - if (values.length < 2) { - return values[0] || '' - } - - const finalValue = values.pop() - - return values.join(', ') + separator + finalValue -} - -/** - * Returns a new object with only the specified keys from the input object - * @template {Record} T - * @template {keyof T} K - * @param {T} input - * @param {K[]|ReadonlyArray} keys - * @returns {Pick} - */ -export function pick (input, keys) { - /** @type {Partial>} */ - const result = {} - - for (const key of keys) { - result[key] = input[key] - } - - return /** @type {Pick} */ (result) -} - -/** - * @param {Record} obj - * @returns {boolean} - */ -export function objectSome (obj) { - for (const key in obj) { - if (obj[key]) { - return true - } - } - return false -} diff --git a/lib/utils/path-resolve.js b/lib/utils/path-resolve.js deleted file mode 100644 index 856e40ee..00000000 --- a/lib/utils/path-resolve.js +++ /dev/null @@ -1,204 +0,0 @@ -import { stat } from 'node:fs/promises' -import path from 'node:path' - -import { globby } from 'globby' -import ignore from 'ignore' -// @ts-ignore This package provides no types -import { directories } from 'ignore-by-default' -import { ErrorWithCause } from 'pony-cause' - -import { InputError } from './errors.js' -import { isErrnoException } from './type-helpers.cjs' - -/** - * There are a lot of possible folders that we should not be looking in and "ignore-by-default" helps us with defining those - * @type {readonly string[]} - */ -const ignoreByDefault = directories() - -/** @type {import('globby').Options} */ -const BASE_GLOBBY_OPTS = { - absolute: true, - expandDirectories: false, - gitignore: true, - ignore: [ - ...ignoreByDefault.map(item => '**/' + item) - ], - markDirectories: true, - unique: true, -} - -/** - * Resolves package.json and lockfiles from (globbed) input paths, applying relevant ignores - * @param {string} cwd The working directory to use when resolving paths - * @param {string[]} inputPaths A list of paths to folders, package.json files and/or recognized lockfiles. Supports globs. - * @param {import('@socketsecurity/config').SocketYml|undefined} config - * @param {import('@socketsecurity/sdk').SocketSdkReturnType<"getReportSupportedFiles">['data']} supportedFiles - * @param {typeof console.error} debugLog - * @returns {Promise} - * @throws {InputError} - */ -export async function getPackageFiles (cwd, inputPaths, config, supportedFiles, debugLog) { - debugLog(`Globbed resolving ${inputPaths.length} paths:`, inputPaths) - - // TODO: Does not support `~/` paths - const entries = await globby(inputPaths, { - ...BASE_GLOBBY_OPTS, - cwd, - onlyFiles: false - }) - - debugLog(`Globbed resolved ${inputPaths.length} paths to ${entries.length} paths:`, entries) - - const packageFiles = await mapGlobResultToFiles(entries, supportedFiles) - - debugLog(`Mapped ${entries.length} entries to ${packageFiles.length} files:`, packageFiles) - - const includedPackageFiles = config?.projectIgnorePaths?.length - // @ts-ignore - ? ignore() - .add(config.projectIgnorePaths) - .filter(packageFiles.map(item => path.relative(cwd, item))) - .map((/** @type {string} */ item) => path.resolve(cwd, item)) - : packageFiles - - return includedPackageFiles -} - -/** - * Resolves package.json and lockfiles from (globbed) input paths, applying relevant ignores - * @param {string} cwd The working directory to use when resolving paths - * @param {string[]} inputPaths A list of paths to folders, package.json files and/or recognized lockfiles. Supports globs. - * @param {import('@socketsecurity/sdk').SocketSdkReturnType<"getReportSupportedFiles">['data']} supportedFiles - * @param {typeof console.error} debugLog - * @returns {Promise} - * @throws {InputError} - */ -export async function getPackageFilesFullScans (cwd, inputPaths, supportedFiles, debugLog) { - debugLog(`Globbed resolving ${inputPaths.length} paths:`, inputPaths) - - // TODO: Does not support `~/` paths - const entries = await globby(inputPaths, { - ...BASE_GLOBBY_OPTS, - cwd, - onlyFiles: false - }) - - debugLog(`Globbed resolved ${inputPaths.length} paths to ${entries.length} paths:`, entries) - - const packageFiles = await mapGlobResultToFiles(entries, supportedFiles) - - debugLog(`Mapped ${entries.length} entries to ${packageFiles.length} files:`, packageFiles) - - return packageFiles -} - -/** - * Takes paths to folders, package.json and/or recognized lock files and resolves them to package.json + lockfile pairs (where possible) - * @param {string[]} entries - * @param {import('@socketsecurity/sdk').SocketSdkReturnType<"getReportSupportedFiles">['data']} supportedFiles - * @returns {Promise} - * @throws {InputError} - */ -export async function mapGlobResultToFiles (entries, supportedFiles) { - const packageFiles = await Promise.all( - entries.map(entry => mapGlobEntryToFiles(entry, supportedFiles)) - ) - - const uniquePackageFiles = [...new Set(packageFiles.flat())] - - return uniquePackageFiles -} - -/** - * Takes a single path to a folder, package.json or a recognized lock file and resolves to a package.json + lockfile pair (where possible) - * @param {string} entry - * @param {import('@socketsecurity/sdk').SocketSdkReturnType<'getReportSupportedFiles'>['data']} supportedFiles - * @returns {Promise} - * @throws {InputError} - */ -export async function mapGlobEntryToFiles (entry, supportedFiles) { - const jsSupported = supportedFiles['npm'] || {} - const jsLockFilePatterns = Object.values(jsSupported) - // .filter(key => key !== 'packagejson') - .map(p => `**/${/** @type {{ pattern: string }} */ (p).pattern}`) - - const pyFilePatterns = Object.values(supportedFiles['pypi'] || {}) - .map(p => `**/${/** @type {{ pattern: string }} */ (p).pattern}`) - - const goSupported = supportedFiles['golang'] || {} - const goSupplementalPatterns = Object.values(goSupported) - // .filter(key => key !== 'gomod') - .map(p => `**/${/** @type {{ pattern: string }} */ (p).pattern}`) - - const files = await globby([ - ...jsLockFilePatterns, - ...pyFilePatterns, - ...goSupplementalPatterns - ], { - ...BASE_GLOBBY_OPTS, - onlyFiles: true, - cwd: path.resolve((await stat(entry)).isDirectory() ? entry : path.dirname(entry)) - }) - return files - - // if (entry.endsWith('/')) { - // // If the match is a folder and that folder contains a package.json file, then include it - // const jsPkg = path.resolve(entry, 'package.json') - // if (await fileExists(jsPkg)) pkgJSFile = jsPkg - - // const goPkg = path.resolve(entry, 'go.mod') - // if (await fileExists(goPkg)) pkgGoFile = goPkg - - // pyFiles = await globby(pyFilePatterns, { - // ...BASE_GLOBBY_OPTS, - // cwd: entry - // }) - // } else { - // const entryFile = path.basename(entry) - - // if (entryFile === 'package.json') { - // // If the match is a package.json file, then include it - // pkgJSFile = entry - // } else if (micromatch.isMatch(entryFile, jsLockFilePatterns)) { - // jsLockFiles = [entry] - // pkgJSFile = path.resolve(path.dirname(entry), 'package.json') - // if (!(await fileExists(pkgJSFile))) return [] - // } else if (entryFile === 'go.mod') { - // pkgGoFile = entry - // } else if (micromatch.isMatch(entryFile, goSupplementalPatterns)) { - // goExtraFiles = [entry] - // pkgGoFile = path.resolve(path.dirname(entry), 'go.mod') - // } else if (micromatch.isMatch(entryFile, pyFilePatterns)) { - // pyFiles = [entry] - // } - // } - - // return [...jsLockFiles, ...pyFiles, ...goExtraFiles] - // .concat(pkgJSFile ? [pkgJSFile] : []) - // .concat(pkgGoFile ? [pkgGoFile] : []) -} - -/** - * @param {string} filePath - * @returns {Promise} - */ -export async function fileExists (filePath) { - /** @type {import('node:fs').Stats} */ - let pathStat - - try { - pathStat = await stat(filePath) - } catch (err) { - if (isErrnoException(err) && err.code === 'ENOENT') { - return false - } - throw new ErrorWithCause('Error while checking if file exists', { cause: err }) - } - - if (!pathStat.isFile()) { - throw new InputError(`Expected '${filePath}' to be a file`) - } - - return true -} diff --git a/lib/utils/sdk.js b/lib/utils/sdk.js deleted file mode 100644 index abeb31ab..00000000 --- a/lib/utils/sdk.js +++ /dev/null @@ -1,99 +0,0 @@ -import { readFile } from 'node:fs/promises' -import { dirname, join } from 'node:path' -import { fileURLToPath } from 'node:url' - -import { SocketSdk, createUserAgentFromPkgJson } from '@socketsecurity/sdk' -import isInteractive from 'is-interactive' -import prompts from 'prompts' - -import { AuthError } from './errors.js' -import { getSetting } from './settings.js' - -export const FREE_API_KEY = 'sktsec_t_--RAN5U4ivauy4w37-6aoKyYPDt5ZbaT5JBVMqiwKo_api' - -/** - * This API key should be stored globally for the duration of the CLI execution - * @type {string | undefined} - */ -let defaultKey - -/** @returns {string | undefined} */ -export function getDefaultKey () { - defaultKey = process.env['SOCKET_SECURITY_API_KEY'] || getSetting('apiKey') || defaultKey - return defaultKey -} - -/** - * The API server that should be used for operations - * @type {string | undefined} - */ -let defaultAPIBaseUrl - -/** - * @returns {string | undefined} - */ -export function getDefaultAPIBaseUrl () { - defaultAPIBaseUrl = process.env['SOCKET_SECURITY_API_BASE_URL'] || getSetting('apiBaseUrl') || undefined - return defaultAPIBaseUrl -} - -/** - * The API server that should be used for operations - * @type {string | undefined} - */ -let defaultApiProxy - -/** - * @returns {string | undefined} - */ -export function getDefaultHTTPProxy () { - defaultApiProxy = process.env['SOCKET_SECURITY_API_PROXY'] || getSetting('apiProxy') || undefined - return defaultApiProxy -} - -/** - * @param {string} [apiKey] - * @param {string} [apiBaseUrl] - * @param {string} [proxy] - * @returns {Promise} - */ -export async function setupSdk (apiKey = getDefaultKey(), apiBaseUrl = getDefaultAPIBaseUrl(), proxy = getDefaultHTTPProxy()) { - if (apiKey == null && isInteractive()) { - /** - * @type {{ apiKey: string }} - */ - const input = await prompts({ - type: 'password', - name: 'apiKey', - message: 'Enter your Socket.dev API key (not saved, use socket login to persist)', - }) - - apiKey = defaultKey = input.apiKey - } - - if (!apiKey) { - throw new AuthError('You need to provide an API key') - } - - /** @type {import('@socketsecurity/sdk').SocketSdkOptions["agent"]} */ - let agent - - if (proxy) { - const { HttpProxyAgent, HttpsProxyAgent } = await import('hpagent') - agent = { - http: new HttpProxyAgent({ proxy }), - https: new HttpsProxyAgent({ proxy }), - } - } - const packageJsonPath = join(dirname(fileURLToPath(import.meta.url)), '../../package.json') - const packageJson = await readFile(packageJsonPath, 'utf8') - - /** @type {import('@socketsecurity/sdk').SocketSdkOptions} */ - const sdkOptions = { - agent, - baseUrl: apiBaseUrl, - userAgent: createUserAgentFromPkgJson(JSON.parse(packageJson)) - } - - return new SocketSdk(apiKey || '', sdkOptions) -} diff --git a/lib/utils/settings.js b/lib/utils/settings.js deleted file mode 100644 index c5d83bf7..00000000 --- a/lib/utils/settings.js +++ /dev/null @@ -1,69 +0,0 @@ -import * as fs from 'fs' -import * as os from 'os' -import * as path from 'path' - -import ora from 'ora' - -let dataHome = process.platform === 'win32' - ? process.env['LOCALAPPDATA'] - : process.env['XDG_DATA_HOME'] - -if (!dataHome) { - if (process.platform === 'win32') throw new Error('missing %LOCALAPPDATA%') - const home = os.homedir() - dataHome = path.join(home, ...(process.platform === 'darwin' - ? ['Library', 'Application Support'] - : ['.local', 'share'] - )) -} - -const settingsPath = path.join(dataHome, 'socket', 'settings') - -/** - * @typedef {Record} IssueRules - */ - -/** @type {{apiKey?: string | null, enforcedOrgs?: string[] | null, apiBaseUrl?: string | null, apiProxy?: string | null}} */ -let settings = {} - -if (fs.existsSync(settingsPath)) { - const raw = fs.readFileSync(settingsPath, 'utf-8') - try { - settings = JSON.parse(Buffer.from(raw, 'base64').toString()) - } catch (e) { - ora(`Failed to parse settings at ${settingsPath}`).warn() - } -} else { - fs.mkdirSync(path.dirname(settingsPath), { recursive: true }) -} - -/** - * @template {keyof typeof settings} Key - * @param {Key} key - * @returns {typeof settings[Key]} - */ -export function getSetting (key) { - return settings[key] -} - -let pendingSave = false - -/** - * @template {keyof typeof settings} Key - * @param {Key} key - * @param {typeof settings[Key]} value - * @returns {void} - */ -export function updateSetting (key, value) { - settings[key] = value - if (!pendingSave) { - pendingSave = true - process.nextTick(() => { - pendingSave = false - fs.writeFileSync( - settingsPath, - Buffer.from(JSON.stringify(settings)).toString('base64') - ) - }) - } -} diff --git a/lib/utils/type-helpers.cjs b/lib/utils/type-helpers.cjs deleted file mode 100644 index 6782df56..00000000 --- a/lib/utils/type-helpers.cjs +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @param {unknown} value - * @returns {value is NodeJS.ErrnoException} - */ -exports.isErrnoException = function isErrnoException (value) { - if (!(value instanceof Error)) { - return false - } - - const errnoException = /** @type NodeJS.ErrnoException} */ (value) - - return errnoException.code !== undefined -} diff --git a/lib/utils/update-notifier.js b/lib/utils/update-notifier.js deleted file mode 100644 index 044127e9..00000000 --- a/lib/utils/update-notifier.js +++ /dev/null @@ -1,18 +0,0 @@ -import { readFile } from 'node:fs/promises' - -import updateNotifier from 'update-notifier' - -/** @returns {void} */ -export function initUpdateNotifier () { - readFile(new URL('../../package.json', import.meta.url), 'utf8') - .then(rawPkg => { - /** - * @type {Exclude[0], undefined>['pkg']} - */ - const pkg = JSON.parse(rawPkg) - updateNotifier({ pkg }).notify() - }) - .catch(() => { - // Fail silently if package.json could not be read or parsed - }) -} diff --git a/package-lock.json b/package-lock.json index 3c8e9694..0eb923b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,86 +1,157 @@ { "name": "@socketsecurity/cli", - "version": "0.10.0", + "version": "0.9.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@socketsecurity/cli", - "version": "0.10.0", + "version": "0.9.3", "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.6", - "@cyclonedx/cdxgen": "^10.7.0", - "@inquirer/select": "^2.3.5", + "@cyclonedx/cdxgen": "^10.8.9", + "@inquirer/prompts": "^5.3.2", "@socketsecurity/config": "^2.1.3", "@socketsecurity/sdk": "^1.2.0", - "chalk": "^5.3.0", + "ansi-align": "^3.0.1", "chalk-table": "^1.0.2", - "execa": "^9.1.0", - "globby": "^14.0.1", + "cli-boxes": "^3.0.0", + "cli-spinners": "^2.9.2", + "cross-spawn": "^7.0.3", + "dot-prop": "^6.0.1", + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.3.0", + "fast-glob": "^3.3.2", + "graceful-fs": "^4.2.6", "hpagent": "^1.2.0", "ignore": "^5.3.1", "ignore-by-default": "^2.1.0", - "inquirer": "^9.2.23", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "meow": "^13.2.0", - "open": "^10.1.0", - "ora": "^8.0.1", + "ini": "4.1.1", + "onetime": "^5.1.0", + "pacote": "^18.0.6", "pony-cause": "^2.1.11", - "prompts": "^2.4.2", + "rc": "1.2.8", + "registry-auth-token": "^5.0.2", + "semver": "^7.6.2", + "signal-exit": "^4.1.0", + "supports-hyperlinks": "^2.2.0", "synp": "^1.9.13", - "terminal-link": "^3.0.0", - "update-notifier": "^7.0.0", "which": "^4.0.0", + "write-file-atomic": "^3.0.3", "yargs-parser": "^21.1.1" }, "bin": { - "socket": "cli.js", - "socket-npm": "lib/shadow/npm-cli.cjs", - "socket-npx": "lib/shadow/npx-cli.cjs" + "socket": "dist/cli.js", + "socket-npm": "dist/npm-cli.js", + "socket-npx": "dist/npx-cli.js" }, "devDependencies": { + "@babel/core": "^7.24.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-env": "^7.24.8", + "@babel/preset-typescript": "^7.24.7", + "@babel/runtime": "^7.24.8", + "@eslint/compat": "^1.1.1", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.7", + "@rollup/pluginutils": "^5.1.0", "@socketsecurity/eslint-config": "^5.0.1", "@tsconfig/node20": "^20.1.4", - "@types/chai": "^4.3.16", - "@types/chai-as-promised": "^7.1.8", - "@types/inquirer": "^9.0.7", - "@types/micromatch": "^4.0.7", - "@types/mocha": "^10.0.6", + "@types/micromatch": "^4.0.9", + "@types/mocha": "^10.0.7", "@types/mock-fs": "^4.13.4", - "@types/node": "^20.12.13", + "@types/node": "^20.14.12", "@types/npm": "^7.19.3", - "@types/npmcli__arborist": "^5.6.6", - "@types/prompts": "^2.4.9", + "@types/npmcli__arborist": "^5.6.9", "@types/update-notifier": "^6.0.8", "@types/which": "^3.0.4", "@types/yargs-parser": "^21.0.3", "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "7.10.0", "c8": "^10.1.2", - "dependency-check": "^5.0.0-7", + "chalk": "^5.3.0", + "esbuild": "^0.23.0", "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-config-standard-jsx": "^11.0.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.7", "eslint-plugin-n": "^16.6.2", "eslint-plugin-promise": "^6.2.0", - "eslint-plugin-react": "^7.34.2", - "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-unicorn": "^48.0.1", - "husky": "^9.0.11", - "installed-check": "^9.3.0", + "execa": "^9.3.0", + "globby": "^14.0.2", + "husky": "^9.1.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "knip": "^5.27.0", + "magic-string": "^0.30.10", + "meow": "^13.2.0", "mock-fs": "^5.2.0", "nock": "^13.5.4", - "npm-run-all2": "^6.2.0", - "type-coverage": "^2.29.0", - "typescript": "~5.5.2" + "npm-run-all2": "^6.2.2", + "open": "^10.1.0", + "ora": "^8.0.1", + "prettier": "3.3.3", + "read-package-up": "^11.0.0", + "rollup": "4.19.0", + "rollup-plugin-ts": "^3.4.5", + "tap": "^21.0.0", + "terminal-link": "^3.0.0", + "type-coverage": "^2.29.1", + "typescript": "~5.4.5", + "update-notifier": "^7.1.0", + "validate-npm-package-name": "^5.0.1" + }, + "engines": { + "node": "^20.9.0 || >=22.0.0" + } + }, + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", + "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@alcalzone/ansi-tokenize/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^20.9.0 || >=21.1.0" + "node": ">=6.0.0" } }, "node_modules/@apideck/better-ajv-errors": { @@ -101,14 +172,14 @@ } }, "node_modules/@appthreat/atom": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@appthreat/atom/-/atom-2.0.13.tgz", - "integrity": "sha512-ORdgSisMpQ6vhUUOV9tSbA5rg4YmaynjfmRyuSKKzwTa8vEhIRU8ukcY5SEOdY0wGH0GKdtmNCfu9iT2imYNxQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@appthreat/atom/-/atom-2.0.17.tgz", + "integrity": "sha512-OlO7sVNkFKKoBjDWbXFtxaOCEqvxYNQ+9UInRms6tdwZMAime+QIX+vZg9fcQ3dIQUfKSgYB9wdgwUzkX3ZgLQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/parser": "^7.24.7", - "typescript": "^5.4.5", + "typescript": "^5.5.3", "yargs": "^17.7.2" }, "bin": { @@ -120,6 +191,20 @@ "node": ">=16.0.0" } }, + "node_modules/@appthreat/atom/node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@appthreat/cdx-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@appthreat/cdx-proto/-/cdx-proto-1.0.1.tgz", @@ -146,62 +231,90 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "node_modules/@babel/compat-data": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz", + "integrity": "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==", + "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-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "node_modules/@babel/core": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "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/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.24.9", + "@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-split-export-declaration": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -210,1667 +323,5407 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "license": "MIT", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", "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" + "yallist": "^3.0.2" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", + "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-function-name": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/template": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "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", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "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" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { + "node_modules/@babel/helper-module-imports": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "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" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, - "license": "MIT" - }, - "node_modules/@bufbuild/protobuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.7.2.tgz", - "integrity": "sha512-i5GE2Dk5ekdlK1TR7SugY4LWRrKSfb5T1Qn4unpIMbfxoeGKERKQ59HG3iYewacGD10SR7UzevfPnh6my4tNmQ==", - "license": "(Apache-2.0 AND BSD-3-Clause)", - "optional": true - }, - "node_modules/@cyclonedx/cdxgen": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen/-/cdxgen-10.7.1.tgz", - "integrity": "sha512-H1xUsyLKzC1RsFtFtygghEaNCbJ8NcnmH+BAVgTHpB3S185+kggCxjkZ8LL6clRbwIC7lb3MMCb0gdDU4/bj1w==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@npmcli/arborist": "7.5.3", - "ajv": "^8.16.0", - "ajv-formats": "^3.0.1", - "cheerio": "^1.0.0-rc.12", - "edn-data": "1.1.2", - "find-up": "7.0.0", - "glob": "^10.4.2", - "global-agent": "^3.0.0", - "got": "14.4.1", - "iconv-lite": "^0.6.3", - "js-yaml": "^4.1.0", - "jws": "^4.0.0", - "node-stream-zip": "^1.15.0", - "packageurl-js": "1.0.2", - "prettify-xml": "^1.2.0", - "properties-reader": "^2.3.0", - "semver": "^7.6.2", - "ssri": "^10.0.6", - "table": "^6.8.2", - "tar": "^6.2.1", - "uuid": "^10.0.0", - "validate-iri": "^1.0.1", - "xml-js": "^1.6.11", - "yargs": "^17.7.2" - }, - "bin": { - "cbom": "bin/cdxgen.js", - "cdx-verify": "bin/verify.js", - "cdxgen": "bin/cdxgen.js", - "cdxi": "bin/repl.js", - "evinse": "bin/evinse.js", - "obom": "bin/cdxgen.js" + "@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": ">=20" + "node": ">=6.9.0" }, - "optionalDependencies": { - "@appthreat/atom": "2.0.13", - "@appthreat/cdx-proto": "1.0.1", - "@cyclonedx/cdxgen-plugins-bin": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-arm64": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-ppc64": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.6.0", - "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.6.0", - "body-parser": "^1.20.2", - "compression": "^1.7.4", - "connect": "^3.7.0", - "jsonata": "^2.0.5", - "sequelize": "^6.37.3", - "sqlite3": "^5.1.7" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@cyclonedx/cdxgen-plugins-bin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin/-/cdxgen-plugins-bin-1.6.0.tgz", - "integrity": "sha512-FhvjIOfMNV//k2iBDcpAGooONFe59+MGE65E0KQe8DoKM+gSY//ZcRrxcTLShcCpLiRJUzRq+rlPsr0BEe99DA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-arm64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-arm64/-/cdxgen-plugins-bin-arm64-1.6.0.tgz", - "integrity": "sha512-4o4gj9xUJbZTWjO1W0bm+sW4Ao7YCwHpbheS37oFsmL0mnGnqq4Znp4alo7sYuAz1r3cj33jPTZqR/tc7BXCoQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-darwin-amd64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-darwin-amd64/-/cdxgen-plugins-bin-darwin-amd64-1.6.0.tgz", - "integrity": "sha512-2LsxvWTM+pEquyyNEQ2GS01BM6o0EX5hXhrG+rwCJV0juk3bcdQsDNdIGKvfm5uab9IzwEUl6gYJpjUSR859xQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-darwin-arm64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-darwin-arm64/-/cdxgen-plugins-bin-darwin-arm64-1.6.0.tgz", - "integrity": "sha512-6DwVoY4HFfRKERHkqcDzTV/1xZp9V1w1b0R7kFrxfVUyKEJp0GnjdlRH216YUBzSOsTaOzs4hxIZSqiT1luDLA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-ppc64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-ppc64/-/cdxgen-plugins-bin-ppc64-1.6.0.tgz", - "integrity": "sha512-6kOfL5cQeDjHguEI2/Or7L4D7er3UYYWrNvi+F8kQ3P1tOcz4Nf0H9J3AeCUTNtMa3PahAM214O6qBM8W5oR6A==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-windows-amd64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-windows-amd64/-/cdxgen-plugins-bin-windows-amd64-1.6.0.tgz", - "integrity": "sha512-IyY8UIi+ayE956gVCoYqg40ONfxY7+PiAQ5ZOzC9x1qPakU/qCOdm93Z5aW1NLKZ66ihyWRZ+YIUlXT5dGwkEg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@cyclonedx/cdxgen-plugins-bin-windows-arm64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-windows-arm64/-/cdxgen-plugins-bin-windows-arm64-1.6.0.tgz", - "integrity": "sha512-n5R0dboT9aqqhojGIUVGSef2KgKuBXIcaocpmhzIVaapFDd9lh1LU/wyxQEDNf29n9hjCDHUJpXgdYgpFkuawg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@cyclonedx/cdxgen/node_modules/packageurl-js": { - "name": "@jdalton/packageurl-js", - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@jdalton/packageurl-js/-/packageurl-js-1.2.7.tgz", - "integrity": "sha512-xcur8vvQEr3k9G2EpM+8lXSeCz2ZKb9h986PlrCfz6i8JHOYrcqSXhtYna+tNfO+15PJDENQdIAmahRR2ZWTWA==", - "license": "MIT" - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz", - "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "^8.56.5", - "@types/estree": "^1.0.5", - "@typescript-eslint/types": "^7.2.0", - "comment-parser": "1.4.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=16" + "node": ">=6.9.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "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": ">=6.9.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "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" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "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" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "node_modules/@babel/helpers": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=0.8.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/@inquirer/core": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.3.tgz", - "integrity": "sha512-WrpDVPAaxJQjHid3Ra4FhUO70YBzkHSYVyW5X48L5zHYdudoPISJqTRRWSeamHfaXda7PNNaC5Py5MEo7QwBNA==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.3.3", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.6", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@babel/parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@inquirer/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@inquirer/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", + "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", - "engines": { - "node": ">=18" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.3.6.tgz", - "integrity": "sha512-eLqlZXre69Jenmar5s+3018xF3lpaGfxVZLHkCzkrhtuTuFjpYtb0YpiYeZNKZm9pa+ih3s9acN/zRt+dDh+qA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^8.2.3", - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.3.3", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", + "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.8.3" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/select/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@inquirer/select/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@inquirer/type": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.3.3.tgz", - "integrity": "sha512-xTUt0NulylX27/zMx04ZYar/kr1raaiFTVvQ5feljQsiAgdm0WPj4S73/ye0fbslh+15QrIuDvfCXTek7pMY5A==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "license": "ISC" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npm/types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@npm/types/-/types-1.0.2.tgz", - "integrity": "sha512-KXZccTDEnWqNrrx6JjpJKU/wJvNeg9BDgjS0XhmlZab7br921HtyVbsYzJr4L+xIvjdJ20Wh9dgxgCI2a5CEQw==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, - "license": "MIT" - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "license": "ISC", + "license": "MIT", "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.3" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.3.tgz", - "integrity": "sha512-7gbMdDNSYUzi0j2mpb6FoXRg3BxXWplMQZH1MZlvNjSdWFObaUz2Ssvo0Nlh2xmWks1OPo+gpsE6qxpT/5M7lQ==", - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@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.4", - "cacache": "^18.0.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "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.6", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" + "node": ">=6.9.0" }, - "bin": { - "arborist": "bin/index.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "license": "ISC", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.3.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", - "license": "ISC", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "license": "ISC", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "license": "ISC", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", - "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", - "license": "ISC", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "license": "ISC", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "license": "ISC", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", + "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/package-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", - "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", - "license": "ISC", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "license": "ISC", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "dev": true, + "license": "MIT", "dependencies": { - "which": "^4.0.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/query": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", - "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", - "license": "ISC", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "license": "ISC", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "license": "ISC", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, "engines": { - "node": ">=12.22.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/constants": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/constants/-/constants-7.1.1.tgz", - "integrity": "sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=16.14" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/pnpm" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/error": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@pnpm/error/-/error-5.0.3.tgz", - "integrity": "sha512-ONJU5cUeoeJSy50qOYsMZQHTA/9QKmGgh1ATfEpCLgtbdwqUiwD9MxHNeXUYYI/pocBCz6r1ZCFqiQvO+8SUKA==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "license": "MIT", "dependencies": { - "@pnpm/constants": "7.1.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { - "node": ">=16.14" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/pnpm" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=12.22.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/workspace.read-manifest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@pnpm/workspace.read-manifest/-/workspace.read-manifest-1.0.3.tgz", - "integrity": "sha512-AC83sfZze5MzsaZjMzAgOOncOfDx8Edo1Pz5GTAFH7Pjqu1a/wFqgL+1ulyLADH5mfYQnF5olXTp7+EPXpZ4sQ==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "license": "MIT", "dependencies": { - "@pnpm/constants": "7.1.1", - "@pnpm/error": "5.0.3", - "read-yaml-file": "^2.1.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=16.14" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/pnpm" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "license": "MIT" - }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "license": "Apache-2.0", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sindresorhus/is": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-6.3.1.tgz", - "integrity": "sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, "engines": { - "node": ">=16" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/config": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@socketsecurity/config/-/config-2.1.3.tgz", - "integrity": "sha512-XiMPH5kjqng4PxfNajLnKq4OIkQ/pZ/QqAdilJxPX7P11ZjCr1071ly0y6BOvFKLmrpC4ByWYAWRRFUv0W5ctA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.12.0", - "pony-cause": "^2.1.8", - "yaml": "^2.2.1" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/eslint-config": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@socketsecurity/eslint-config/-/eslint-config-5.0.1.tgz", - "integrity": "sha512-l9YYZX/XcQLFVTmi+NC/irPSiGfpY3U7JqhdCm0s74BVQtjne+uo8r3Mu0+O2z4Hqe/fVTr3hTealo2RU1rzXQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "7.10.0", - "eslint": "^8.56.0", - "eslint-config-standard": "^17.0.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsdoc": "^48.2.5", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.31.9", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-unicorn": "^48.0.1", - "typescript": "*" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@socketsecurity/sdk/-/sdk-1.2.0.tgz", - "integrity": "sha512-XvOIJJsmzivaJWyUwNOcCAxcBBQtRLoE4mYbdrpgi1gagdgmau3dzSq/OC3vgrTV27iS9zfJLP8gqjrposuhGQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "license": "MIT", "dependencies": { - "formdata-node": "^5.0.0", - "got": "^12.5.3", - "pony-cause": "^2.1.8" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { - "node": "^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 14.17" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@socketsecurity/sdk/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, "engines": { - "node": ">=12.20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tsconfig/node20": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", - "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/braces": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.4.tgz", - "integrity": "sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/cacache": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/@types/cacache/-/cacache-17.0.2.tgz", - "integrity": "sha512-IrqHzVX2VRMDQQKa7CtKRnuoCLdRJiLW6hWU+w7i7+AaQ0Ii5bKwJxd5uRK4zBCyrHd3tG6G8zOm2LplxbSfQg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", - "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz", + "integrity": "sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "*" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/configstore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-6.0.2.tgz", - "integrity": "sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", - "optional": true, "dependencies": { - "@types/ms": "*" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", + "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "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.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@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.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@bufbuild/protobuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.7.2.tgz", + "integrity": "sha512-i5GE2Dk5ekdlK1TR7SugY4LWRrKSfb5T1Qn4unpIMbfxoeGKERKQ59HG3iYewacGD10SR7UzevfPnh6my4tNmQ==", + "license": "(Apache-2.0 AND BSD-3-Clause)", + "optional": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@cyclonedx/cdxgen": { + "version": "10.8.9", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen/-/cdxgen-10.8.9.tgz", + "integrity": "sha512-YAsNJEXYaUbtneTXPEt/dj32Vphqa2IAL0IkYfCwTGu7wo7K8/oCEU0uq7HGJw4fKCl7oer59qFgw1yCCUWIiQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.24.8", + "@babel/traverse": "^7.24.8", + "@npmcli/arborist": "7.5.4", + "ajv": "^8.16.0", + "ajv-formats": "^3.0.1", + "cheerio": "^1.0.0-rc.12", + "edn-data": "1.1.2", + "find-up": "7.0.0", + "glob": "^11.0.0", + "global-agent": "^3.0.0", + "got": "14.4.1", + "iconv-lite": "^0.6.3", + "js-yaml": "^4.1.0", + "jws": "^4.0.0", + "node-stream-zip": "^1.15.0", + "packageurl-js": "1.0.2", + "prettify-xml": "^1.2.0", + "properties-reader": "^2.3.0", + "semver": "^7.6.3", + "ssri": "^10.0.6", + "table": "^6.8.2", + "tar": "^6.2.1", + "uuid": "^10.0.0", + "validate-iri": "^1.0.1", + "xml-js": "^1.6.11", + "yargs": "^17.7.2" + }, + "bin": { + "cbom": "bin/cdxgen.js", + "cdx-verify": "bin/verify.js", + "cdxgen": "bin/cdxgen.js", + "cdxi": "bin/repl.js", + "evinse": "bin/evinse.js", + "obom": "bin/cdxgen.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "@appthreat/atom": "2.0.17", + "@appthreat/cdx-proto": "1.0.1", + "@cyclonedx/cdxgen-plugins-bin": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-arm64": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-ppc64": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.6.3", + "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.6.3", + "body-parser": "^1.20.2", + "compression": "^1.7.4", + "connect": "^3.7.0", + "jsonata": "^2.0.5", + "sequelize": "^6.37.3", + "sqlite3": "^5.1.7" + } + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin/-/cdxgen-plugins-bin-1.6.3.tgz", + "integrity": "sha512-AQWpffIGygeQIr1f7QC1rXcp3O7DgYGQFZC9Jlwx0Bv/e8VKaw8nYoTNMukUms87bw8FC0jo3CWaje7iTX5svQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-arm64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-arm64/-/cdxgen-plugins-bin-arm64-1.6.3.tgz", + "integrity": "sha512-nGy+j5hjHmCLaAdSDTB2Ex3UF0pvoAbEUOcVckbvACFyF6GQQOkk5b33ddhrkxZJ20oljN/f84PCV1YX+OLocg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-darwin-amd64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-darwin-amd64/-/cdxgen-plugins-bin-darwin-amd64-1.6.3.tgz", + "integrity": "sha512-nLeiv+itgbZ8M2L4Yft4XLFZy8l/Q4oluZ+RCsnBjosBeAmZ1blv2x0WfaapCgLVnL+KXchMCeDIbZInZGuSZQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-darwin-arm64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-darwin-arm64/-/cdxgen-plugins-bin-darwin-arm64-1.6.3.tgz", + "integrity": "sha512-c80vfhEYA+AzkUQAfpLaDmIdGPfOun2O+3LqKLFcGmNbSIeKSnbS7pPkhXbK7ssWrLgNqnsp/l+kF0gioD6MPQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-ppc64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-ppc64/-/cdxgen-plugins-bin-ppc64-1.6.3.tgz", + "integrity": "sha512-vsGvkYTlNIAkQZBwQPfBfvA+veRLbLBWnQP//VS2BZyrjUrSFwGYL/eGDJj05m3TXc/kRd7jKOUdt5g9CUJqqg==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-windows-amd64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-windows-amd64/-/cdxgen-plugins-bin-windows-amd64-1.6.3.tgz", + "integrity": "sha512-Hu+U6dW846/xf3j1KFznyvcQ8eB8DBuETctDdGuDQDvbs4pA8MgHExd+QWHZYaiYgc4lTX+UbadbzFjJSsqMFg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@cyclonedx/cdxgen-plugins-bin-windows-arm64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@cyclonedx/cdxgen-plugins-bin-windows-arm64/-/cdxgen-plugins-bin-windows-arm64-1.6.3.tgz", + "integrity": "sha512-qjBAgULYO2Ud+LzXGjMLur35qW/YKG1oU+s6zIkSdU0tZc6ckRqTxlk/EusMNQDSKaFTg9kRX7EEjYxScfxHEQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@cyclonedx/cdxgen/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cyclonedx/cdxgen/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@cyclonedx/cdxgen/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@cyclonedx/cdxgen/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cyclonedx/cdxgen/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz", + "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "^8.56.5", + "@types/estree": "^1.0.5", + "@typescript-eslint/types": "^7.2.0", + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "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/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.1.tgz", + "integrity": "sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "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", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "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", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "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.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/checkbox": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.4.2.tgz", + "integrity": "sha512-iZRNbTlSB9xXt/+jdMFViBdxw1ILWu3365rzfM5OLwAyOScbDFFGSH7LEUwoq1uOIo48ymOEwYSqP5y8hQMlmA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/checkbox/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", + "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", + "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.17.tgz", + "integrity": "sha512-hwx3VpFQzOY2hFWnY+XPsUGCIUVQ5kYxH6+CExv/RbMiAoN3zXtzj8DyrWBOHami0vBrrnPS8CTq3uQWc7N2BA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.17.tgz", + "integrity": "sha512-s4V/dC+GeE5s97xoTtZSmC440uNKePKqZgzqEf0XM63ciilnXAtKGvoAWOePFdlK+oGTz0d8bhbPKwpKGvRYfg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.4.tgz", + "integrity": "sha512-wvYnDITPQn+ltktj/O9kQjPxOvpmwcpxLWh8brAyD+jlEbihxtrx9cZdZcxqaCVQj3caw4eZa2Uq5xELo4yXkA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.0.5.tgz", + "integrity": "sha512-+H6TJPU2AJEcoF6nVTWssxS7gnhxWvf6CkILAdfq/yGm/htBKNDrvYLYaJvi1Be/aXQoKID9FaP94bUCjOvJNQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.17.tgz", + "integrity": "sha512-/u6DM/fDHXoBWyA+9aRhghkeo5smE7wO9k4E2UoJbgiRCkt3JjBEuBqLOJNrz8E16M0ez4UM1vd5cXrmICHW+A==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/password/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.2.tgz", + "integrity": "sha512-8Jv+6rbY98ilFAZMYYfetu6XGXF/ZU44i5Z6Jx4t0xmwDh/AihdBV/FgetzDDZZMv5AMW1MT35LI0FiS55LoXw==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^2.4.2", + "@inquirer/confirm": "^3.1.17", + "@inquirer/editor": "^2.1.17", + "@inquirer/expand": "^2.1.17", + "@inquirer/input": "^2.2.4", + "@inquirer/number": "^1.0.5", + "@inquirer/password": "^2.1.17", + "@inquirer/rawlist": "^2.1.17", + "@inquirer/search": "^1.0.2", + "@inquirer/select": "^2.4.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.1.17.tgz", + "integrity": "sha512-RFrw34xU5aVlMA3ZJCaeKGxYjhu3j4i46O2GMmaRRGeLObCRM1yOKQOsRclSTzjd4A7+M5QleR2iuW/68J9Kwg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.0.2.tgz", + "integrity": "sha512-E/JD3MeJwJeNilOnRDmHGnlUksyVqrTQEUNqkRpioj8J0sVxW7+pFRHBM2coFsiCpvI4XKRRhWsai5VP8rrfrQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.4.2.tgz", + "integrity": "sha512-r78JlgShqRxyAtBDeBHSDtfrOhSQwm2ecWGGaxe7kD9JwgL3UN563G1ncVRYdsWD7/tigflcskfipVeoDLhLJg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/select/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", + "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "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/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "license": "ISC" + }, + "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009": { + "version": "10.9.7", + "resolved": "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.7.tgz", + "integrity": "sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node14": "*", + "@tsconfig/node16": "*", + "@tsconfig/node18": "*", + "@tsconfig/node20": "*", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=4.2" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdn/browser-compat-data": { + "version": "5.5.38", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.38.tgz", + "integrity": "sha512-rwwTAkFM5CRuECirmKB/OoG1MXW9v8LAWv8u4NBu8cghRf6zNIKVJ9s+7TT5tXwLRlfbTR2sb7V0rWcD68eXhg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npm/types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@npm/types/-/types-1.0.2.tgz", + "integrity": "sha512-KXZccTDEnWqNrrx6JjpJKU/wJvNeg9BDgjS0XhmlZab7br921HtyVbsYzJr4L+xIvjdJ20Wh9dgxgCI2a5CEQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "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.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", + "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@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.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "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.6", + "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/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "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.7", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", + "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.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/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "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.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "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/metavuln-calculator": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", + "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", + "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/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "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/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", + "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", + "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.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", + "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^10.4.1", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", + "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-6.3.1.tgz", + "integrity": "sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@snyk/github-codeowners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz", + "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^4.1.1", + "ignore": "^5.1.8", + "p-map": "^4.0.0" + }, + "bin": { + "github-codeowners": "dist/cli.js" + }, + "engines": { + "node": ">=8.10" + } + }, + "node_modules/@socketsecurity/config": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@socketsecurity/config/-/config-2.1.3.tgz", + "integrity": "sha512-XiMPH5kjqng4PxfNajLnKq4OIkQ/pZ/QqAdilJxPX7P11ZjCr1071ly0y6BOvFKLmrpC4ByWYAWRRFUv0W5ctA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "pony-cause": "^2.1.8", + "yaml": "^2.2.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@socketsecurity/eslint-config": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@socketsecurity/eslint-config/-/eslint-config-5.0.1.tgz", + "integrity": "sha512-l9YYZX/XcQLFVTmi+NC/irPSiGfpY3U7JqhdCm0s74BVQtjne+uo8r3Mu0+O2z4Hqe/fVTr3hTealo2RU1rzXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "7.10.0", + "eslint": "^8.56.0", + "eslint-config-standard": "^17.0.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsdoc": "^48.2.5", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.31.9", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-unicorn": "^48.0.1", + "typescript": "*" + } + }, + "node_modules/@socketsecurity/sdk": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@socketsecurity/sdk/-/sdk-1.2.0.tgz", + "integrity": "sha512-XvOIJJsmzivaJWyUwNOcCAxcBBQtRLoE4mYbdrpgi1gagdgmau3dzSq/OC3vgrTV27iS9zfJLP8gqjrposuhGQ==", + "dependencies": { + "formdata-node": "^5.0.0", + "got": "^12.5.3", + "pony-cause": "^2.1.8" + }, + "engines": { + "node": "^16.10.0 || >=18.0.0" + } + }, + "node_modules/@socketsecurity/sdk/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@socketsecurity/sdk/node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@socketsecurity/sdk/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@socketsecurity/sdk/node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/@socketsecurity/sdk/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tapjs/after": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.0.0.tgz", + "integrity": "sha512-BCGq+YocD0xxeGC4mMym2tg6qtgFJJdCrji8N1HbF55d55nxQrA8R/w6+D9b4N7t/4dfpbI+LW5FgdBATohFPw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/after-each": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.0.0.tgz", + "integrity": "sha512-RrkYMB3SpXKFJAijbgNkOexiClX5aygkCIHKHPIfnfqsPozkwjYbtVQs6d1/tG8ytiJtH5rvybuNJMRRNDcfBQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "function-loop": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/asserts": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.0.0.tgz", + "integrity": "sha512-V1YmOLMhyITi75e0u8vS+x1S0sDwISWk643C4a9XiY2RDin1nEueE8Nzwp2ZBP+N4HtgzKVfzJ1AYvpwaTKwUA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/stack": "4.0.0", + "is-actual-promise": "^1.0.1", + "tcompare": "9.0.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/before": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.0.0.tgz", + "integrity": "sha512-d1k6lTSzqTcq4pjGsCPUxNP5NFWZBxwHLmgVxy2RHfZwKM20eXXAOPgAw3LgPVgkoehwi+nwWUGTJDcL3AS8YQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/before-each": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.0.0.tgz", + "integrity": "sha512-zJwDLLH+3+qmpE8Pr1fAEeqZNvbok7yYKKKE/7IDMi3zdvM0Rjk7Y4JXGbVI8IreuRK0rXaSL1ZZqbFMsZGHrg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "function-loop": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/chdir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.0.0.tgz", + "integrity": "sha512-yljg4CX2/UinFytD50LaRhBVTDaW3vBcUwzYnXzJcuFLoPEpq0svlyIwzcCXfLLGP8/AgkS3MRt58AisBtz4zw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/config": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.0.0.tgz", + "integrity": "sha512-AAHbK30FwnGC3FcFACnXEGZ+uFtkpxsF2bwvgAzHND2tIE9ld2LwGMiGq3rM9EwcZ1AAnU8ibbUC0WbnS5FcCQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/core": "4.0.0", + "@tapjs/test": "4.0.0", + "chalk": "^5.2.0", + "jackspeak": "^4.0.1", + "polite-json": "^5.0.0", + "tap-yaml": "4.0.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0", + "@tapjs/test": "4.0.0" + } + }, + "node_modules/@tapjs/config/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@tapjs/config/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/core": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.0.0.tgz", + "integrity": "sha512-COWMNbGBjf0qbsbKw+2911rrt+oXXOkIXpoMpIsz0/UN2rxqAAvDyrriObVfc4v+O2auabnWfdrxwNm3Vy01yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/processinfo": "^3.1.8", + "@tapjs/stack": "4.0.0", + "@tapjs/test": "4.0.0", + "async-hook-domain": "^4.0.1", + "diff": "^5.2.0", + "is-actual-promise": "^1.0.1", + "minipass": "^7.0.4", + "signal-exit": "4.1", + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/error-serdes": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.0.0.tgz", + "integrity": "sha512-jO0CvhL7lyGcDzyPeumyXirBv/vxRuhg8SdyLwjNqO7aelckxZzY/dCchtov7PfKK7wc/iB55W2++PE9waFaWw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.0.0.tgz", + "integrity": "sha512-VCqwRB+GJKDavOtoCU6K3skR6b/Qv7vo5YwuwgTUzRDmeNJQwI4S/s0l4cRbaMVJxuXeR3o5JwBsH0Ppjwzgkw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/fixture": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.0.0.tgz", + "integrity": "sha512-h8qZwzQqNd0aLU+oU+0uhBSSlU4+5a8kkFfPrwlNQr9Vde2CyW5vMMVWvX2do+5wFyiFwKHAjbtBS7BSkfH7Kw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "mkdirp": "^3.0.0", + "rimraf": "^6.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/fixture/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/fixture/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@tapjs/fixture/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/fixture/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/fixture/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/fixture/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/fixture/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/intercept": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.0.0.tgz", + "integrity": "sha512-MSPvOcwVKZjtb2KVY6JB/dBD54mGkzaJHCdzkIAJdcUAAbZQz5pMppQkEwPw/Zs+JFPJjGzZyITrDfh9if7maw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.0.0", + "@tapjs/stack": "4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/mock": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.0.0.tgz", + "integrity": "sha512-6GyQm61wSCmfxKb7GRY24cdnO92mV7mZ0hmdbOko881FIEmjeAsLQaNKUaatnGWpzBUoqw+JCzbASee4/AfaMQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.0.0", + "@tapjs/stack": "4.0.0", + "resolve-import": "^2.0.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/mock/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/node-serialize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.0.0.tgz", + "integrity": "sha512-cFHcyEZHd4SQPSoZ4tGHfo/p1+4r24G0K0jiAb28WotdE2kbjkf7TVEiKOA5IEOmjQtdJ4+gVcuErZUchjpQZg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/error-serdes": "4.0.0", + "@tapjs/stack": "4.0.0", + "tap-parser": "18.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/processinfo": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.8.tgz", + "integrity": "sha512-FIriEB+qqArPhmVYc1PZwRHD99myRdl7C9Oe/uts04Q2LOxQ5MEmqP9XOP8vVYzpDOYwmL8OmL6eOYt9eZlQKQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "pirates": "^4.0.5", + "process-on-spawn": "^1.0.0", + "signal-exit": "^4.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=16.17" + } + }, + "node_modules/@tapjs/processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@tapjs/reporter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.0.0.tgz", + "integrity": "sha512-NCWPEtRQUziPzpYmy1HsB8d3zRgV+Uzy9yd5dnQ8JmKqixjtBY9bhQLVXJmQ3x3DB0mjJjv8pVcA/XZJasQmjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/config": "5.0.0", + "@tapjs/stack": "4.0.0", + "chalk": "^5.2.0", + "ink": "^5.0.1", + "minipass": "^7.0.4", + "ms": "^2.1.3", + "patch-console": "^2.0.0", + "prismjs-terminal": "^1.2.3", + "react": "^18.2.0", + "string-length": "^6.0.0", + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/reporter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tapjs/run": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.0.0.tgz", + "integrity": "sha512-GPZ28g+G5aGzOl6Vik8fB+4oeJQbdKDa6vdZzTGiMCpTQM0ysvBMwBo6yZ84YzZDlOkXEOuj08LSZC3ikNeRDA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.0.0", + "@tapjs/before": "4.0.0", + "@tapjs/config": "5.0.0", + "@tapjs/processinfo": "^3.1.8", + "@tapjs/reporter": "4.0.0", + "@tapjs/spawn": "4.0.0", + "@tapjs/stdin": "4.0.0", + "@tapjs/test": "4.0.0", + "c8": "^10.1.2", + "chalk": "^5.3.0", + "chokidar": "^3.6.0", + "foreground-child": "^3.1.1", + "glob": "^11.0.0", + "minipass": "^7.0.4", + "mkdirp": "^3.0.1", + "opener": "^1.5.2", + "pacote": "^18.0.6", + "path-scurry": "^2.0.0", + "resolve-import": "^2.0.0", + "rimraf": "^6.0.0", + "semver": "^7.6.0", + "signal-exit": "^4.1.0", + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0", + "trivial-deferred": "^2.0.0", + "which": "^4.0.0" + }, + "bin": { + "tap-run": "dist/esm/index.js" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/run/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/run/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@tapjs/run/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/run/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/run/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/run/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/run/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/snapshot": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.0.0.tgz", + "integrity": "sha512-1d2IOOpbra6VMDypft8NGylkIypgk2VgMRrEeSsipOyeku81STlcdzm8mS0COCqVtX6+si+tkERuqFrCVy/xSg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1", + "tcompare": "9.0.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/spawn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.0.0.tgz", + "integrity": "sha512-K+kn4wCIMiOfHtjt5lxlxmJMvL4C9txAxapTRyLEm9ul9ZKgzAOQmMD29YEtkKY53v1eAfpJ3agCXnH59uOJ+A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/stack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.0.0.tgz", + "integrity": "sha512-uj6BvHXvLf1qILvcpYit9D6JX7pg4eSbaxm1MhWpi8wdhSQyUAOe4gxCMTfJpW0ekB48N4QN3S3vaq7rWtFctw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/stdin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.0.0.tgz", + "integrity": "sha512-6QcaKEKH+RB5YPVHytclqzrKoh1d0S8i8lEgGwGAhoaShyawB5CoADnKpCXWjHKsRESUvG7CqiPDGsK39BJEaA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/test": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.0.0.tgz", + "integrity": "sha512-lOU1N0bFCCjJg2UEb8TlLj6+u754Uxi2CSuv3TSkRU+oHRBTEPZ4nJ6MpUqvgyvKm9ilVZ5FLS9/GwXB/XLH3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", + "@tapjs/after": "3.0.0", + "@tapjs/after-each": "4.0.0", + "@tapjs/asserts": "4.0.0", + "@tapjs/before": "4.0.0", + "@tapjs/before-each": "4.0.0", + "@tapjs/chdir": "3.0.0", + "@tapjs/filter": "4.0.0", + "@tapjs/fixture": "4.0.0", + "@tapjs/intercept": "4.0.0", + "@tapjs/mock": "4.0.0", + "@tapjs/node-serialize": "4.0.0", + "@tapjs/snapshot": "4.0.0", + "@tapjs/spawn": "4.0.0", + "@tapjs/stdin": "4.0.0", + "@tapjs/typescript": "3.0.0", + "@tapjs/worker": "4.0.0", + "glob": "11", + "jackspeak": "^4.0.1", + "mkdirp": "^3.0.0", + "package-json-from-dist": "^1.0.0", + "resolve-import": "^2.0.0", + "rimraf": "^6.0.0", + "sync-content": "^2.0.1", + "tap-parser": "18.0.0", + "tshy": "^3.0.2", + "typescript": "5.5", + "walk-up-path": "^4.0.0" + }, + "bin": { + "generate-tap-test-class": "dist/esm/build.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/test/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@tapjs/test/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/test/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@tapjs/test/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tapjs/typescript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.0.0.tgz", + "integrity": "sha512-gKDv+07vdNuplN32sQvkzuEnai9JqJlUX5BuqTrSeWMsoKCoGPdyt8YNwaoebVeyBpt7IgjOBln8YLhfI3AcpA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tapjs/worker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.0.0.tgz", + "integrity": "sha512-BI5Ttet5HEABPAll8Ou8oFQGIiglen87PYlwTc9yLEB+g4mj8FCZYTGJNIW981CT7lOZzMJICz3C3VTdC9vzuA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node14": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", + "integrity": "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.3.tgz", + "integrity": "sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", + "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@types/braces": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.4.tgz", + "integrity": "sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cacache": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/cacache/-/cacache-17.0.2.tgz", + "integrity": "sha512-IrqHzVX2VRMDQQKa7CtKRnuoCLdRJiLW6hWU+w7i7+AaQ0Ii5bKwJxd5uRK4zBCyrHd3tG6G8zOm2LplxbSfQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/configstore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-6.0.2.tgz", + "integrity": "sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -1884,17 +5737,11 @@ "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.9.tgz", "integrity": "sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/braces": "*" } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/mocha": { "version": "10.0.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", @@ -1922,14 +5769,16 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "20.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz", - "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -2013,6 +5862,13 @@ "@types/node": "*" } }, + "node_modules/@types/object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/pacote": { "version": "11.1.8", "resolved": "https://registry.npmjs.org/@types/pacote/-/pacote-11.1.8.tgz", @@ -2026,16 +5882,19 @@ "@types/ssri": "*" } }, - "node_modules/@types/prompts": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz", - "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "kleur": "^3.0.3" - } + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ssri": { "version": "7.1.5", @@ -2047,14 +5906,12 @@ "@types/node": "*" } }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "node_modules/@types/ua-parser-js": { + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==", "dev": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@types/update-notifier": { "version": "6.0.8", @@ -2068,9 +5925,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", - "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT", "optional": true }, @@ -2084,7 +5941,8 @@ "node_modules/@types/wrap-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "license": "MIT" }, "node_modules/@types/yargs-parser": { "version": "21.0.3", @@ -2094,16 +5952,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", - "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", + "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/type-utils": "7.16.0", - "@typescript-eslint/utils": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", + "@typescript-eslint/scope-manager": "7.17.0", + "@typescript-eslint/type-utils": "7.17.0", + "@typescript-eslint/utils": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2266,13 +6125,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", - "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", + "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0" + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2283,13 +6143,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", - "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", + "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.0", - "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/typescript-estree": "7.17.0", + "@typescript-eslint/utils": "7.17.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2310,10 +6171,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", - "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", + "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -2323,13 +6185,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", - "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", + "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2355,6 +6218,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2375,20 +6239,22 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", - "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", + "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/typescript-estree": "7.16.0" + "@typescript-eslint/scope-manager": "7.17.0", + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/typescript-estree": "7.17.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2402,12 +6268,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", - "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", + "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/types": "7.17.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2425,40 +6292,14 @@ "dev": true, "license": "ISC" }, - "node_modules/@voxpelli/semver-set": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@voxpelli/semver-set/-/semver-set-5.0.2.tgz", - "integrity": "sha512-9FzdmgUi1yFTEdilUsg95wvZCN0dtqdslhWHZDCfX74ISs7vd1Gb3QgXcYPs7EqY5SEy18iZkDVoZ02HOrHkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@voxpelli/type-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@voxpelli/type-helpers/-/type-helpers-3.4.0.tgz", - "integrity": "sha512-nDPbVFZ7y7aEMAVRC1LIllMMvwE5Qgd0z+cyd+K4z0NJ7LAjcjydhPw4RYAoYF3JzvZVpra/S0SRN/dCFE8E+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@voxpelli/typed-utils": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@voxpelli/typed-utils/-/typed-utils-1.10.1.tgz", - "integrity": "sha512-HNRZ+rTbjS9MphabJR44JKd+tI+aCQljkdUANHnk6gwE3EJ4w2D3Dodzwjy4x+bndw43JoGqOfUHC+1CRNOHaw==", + "node_modules/@wessberg/stringutil": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz", + "integrity": "sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==", "dev": true, "license": "MIT", - "dependencies": { - "@voxpelli/type-helpers": "^3.4.0" - }, "engines": { - "node": ">=18.0.0" + "node": ">=8.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2491,9 +6332,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "license": "MIT", "bin": { @@ -2513,6 +6354,34 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-loose": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", + "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -2593,6 +6462,15 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2613,10 +6491,33 @@ "node": ">=8" } }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, "license": "MIT", "dependencies": { "type-fest": "^1.0.2" @@ -2632,6 +6533,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -2641,12 +6543,15 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -2661,6 +6566,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -2674,6 +6593,7 @@ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=14" } @@ -2693,6 +6613,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2762,6 +6689,7 @@ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2842,6 +6770,7 @@ "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2854,6 +6783,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2888,26 +6818,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -2917,6 +6827,16 @@ "node": ">=8" } }, + "node_modules/async-hook-domain": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-4.0.1.tgz", + "integrity": "sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2924,6 +6844,19 @@ "dev": true, "license": "MIT" }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2940,6 +6873,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2963,7 +6948,9 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT", + "optional": true }, "node_modules/bash-glob": { "version": "2.0.0", @@ -3071,6 +7058,32 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/bin-links/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -3085,6 +7098,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3162,6 +7177,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", @@ -3201,6 +7217,68 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "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.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-generator": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/browserslist-generator/-/browserslist-generator-2.1.0.tgz", + "integrity": "sha512-ZFz4mAOgqm0cbwKaZsfJbYDbTXGoPANlte7qRsRJOfjB9KmmISQrXJxAVrnXG8C8v/QHNzXyeJt0Cfcks6zZvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^5.3.7", + "@types/object-path": "^0.11.1", + "@types/semver": "^7.5.0", + "@types/ua-parser-js": "^0.7.36", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001518", + "isbot": "^3.6.13", + "object-path": "^0.11.8", + "semver": "^7.5.4", + "ua-parser-js": "^1.0.35" + }, + "engines": { + "node": ">=16.15.1", + "npm": ">=7.0.0", + "pnpm": ">=3.2.0", + "yarn": ">=1.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/browserslist-generator?sponsor=1" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -3219,6 +7297,8 @@ "url": "https://feross.org/support" } ], + "license": "MIT", + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -3230,16 +7310,6 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, - "node_modules/buffered-async-iterable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/buffered-async-iterable/-/buffered-async-iterable-0.3.0.tgz", - "integrity": "sha512-McUDFN18nTngbI9EPqHXyifF3iReQtEeoCdukNtrypmPWMRxsJO6KbBihQ88PI+CIFhbCmm2cTkhgxmKADwFNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.6.0" - } - }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -3267,6 +7337,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -3490,65 +7562,43 @@ }, "node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "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/camelcase-keys/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "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": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -3598,6 +7648,21 @@ "node": ">=4" } }, + "node_modules/chalk-table/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk-table/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, "node_modules/chalk-table/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3639,7 +7704,8 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "license": "MIT" }, "node_modules/cheerio": { "version": "1.0.0-rc.12", @@ -3679,1084 +7745,842 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "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": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" + "url": "https://paulmillr.com/funding/" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { - "node": ">=0.8" - } - }, - "node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "node": ">= 6" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", - "optional": true, - "bin": { - "color-support": "bin.js" + "engines": { + "node": ">=10" } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=0.8.0" } }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "optional": true, "engines": { - "node": ">= 0.8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ms": "2.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true, - "license": "MIT" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, "license": "MIT", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/configstore/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "engines": { + "node": ">= 12" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "license": "MIT", - "optional": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=12" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "optional": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC", - "optional": true + "engines": { + "node": ">=8" + } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "convert-to-spaces": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, "bin": { - "cssesc": "bin/cssesc" - }, + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.1.90" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 12.0.0" } }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compatfactory": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-3.0.0.tgz", + "integrity": "sha512-WD5kF7koPwVoyKL8p0LlrmIZtilrD46sQStyzzxzTFinMKN2Dxk1hN+sddLSQU1mGIZvQfU8c+ONSghvvM40jg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "helpertypes": "^0.0.19" }, "engines": { - "node": ">=6.0" + "node": ">=14.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "typescript": ">=3.x || >= 4.x || >= 5.x" } }, - "node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", + "optional": true, "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "license": "MIT", + "optional": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "optional": true, "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "license": "MIT", - "engines": { - "node": ">=4.0.0" + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "engines": { - "node": ">=18" + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "optional": true, "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", - "engines": { - "node": ">=10" - } + "optional": true }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, + "node_modules/console-grid": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/console-grid/-/console-grid-2.2.2.tgz", + "integrity": "sha512-ohlgXexdDTKLNsZz7DSJuCAwmRc8omSS61txOk39W3NOthgKGr1a1jJpZ5BCQe4PlrwMw01OvPQ1Bl3G7Y/uFg==", + "dev": true, "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, + "optional": true, + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "browserslist": "^4.23.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 8" } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT", - "optional": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + }, + "node_modules/cross-spawn/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "optional": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/dependency-check": { - "version": "5.0.0-7", - "resolved": "https://registry.npmjs.org/dependency-check/-/dependency-check-5.0.0-7.tgz", - "integrity": "sha512-OZhz4TDlDUYiEnP1/3Q7hFlA2ViUCXNV7h9D7MrApSfmZj27MNZFdmBfYCQ1hldheILriZ+pbg/QW8wIlV1ahg==", - "deprecated": "dependency-check has been deprecated in favor of the knip module", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { - "debug": "^4.3.1", - "globby": "^12.0.2", - "is-relative": "^1.0.0", - "meow": "^10.1.3", - "picomatch": "^2.3.1", - "pkg-up": "^4.0.0", - "pony-cause": "^2.0.0", - "precinct": "^8.2.0", - "read-pkg": "^7.0.0", - "resolve": "^1.19.0" + "isexe": "^2.0.0" }, "bin": { - "dependency-check": "cli.cjs" + "node-which": "bin/node-which" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/dependency-check/node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "node_modules/crosspath": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crosspath/-/crosspath-2.0.0.tgz", + "integrity": "sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/node": "^17.0.36" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.9.0" } }, - "node_modules/dependency-check/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/crosspath/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "type-fest": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dependency-check/node_modules/globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dependency-check/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { - "lru-cache": "^6.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dependency-check/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dependency-check/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/dependency-check/node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "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" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "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" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dependency-check/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dependency-check/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dependency-check/node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "license": "MIT", "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/dependency-check/node_modules/read-pkg-up/node_modules/read-pkg": { + "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "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" + "mimic-response": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4764,21 +8588,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dependency-check/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/dependency-check/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { "node": ">=10" @@ -4787,281 +8600,206 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "optional": true, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detective-amd": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz", - "integrity": "sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^3.0.0", - "escodegen": "^2.0.0", - "get-amd-module-type": "^3.0.0", - "node-source-walk": "^4.2.0" - }, - "bin": { - "detective-amd": "bin/cli.js" - }, - "engines": { - "node": ">=6.0" - } + "license": "MIT" }, - "node_modules/detective-cjs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.3.tgz", - "integrity": "sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", - "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" - }, "engines": { - "node": ">=6.0" + "node": ">=0.10.0" } }, - "node_modules/detective-es6": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz", - "integrity": "sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, "license": "MIT", "dependencies": { - "node-source-walk": "^4.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detective-less": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", - "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" - }, "engines": { - "node": ">= 6.0" - } - }, - "node_modules/detective-postcss": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz", - "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.1", - "is-url": "^1.2.4", - "postcss": "^8.1.7", - "postcss-values-parser": "^2.0.1" + "node": ">=18" }, - "engines": { - "node": "^10 || ^12 || >=14" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detective-sass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.2.tgz", - "integrity": "sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" + "clone": "^1.0.2" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detective-scss": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.2.tgz", - "integrity": "sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==", - "dev": true, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" - }, "engines": { - "node": ">=6.0" + "node": ">=10" } }, - "node_modules/detective-stylus": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.3.tgz", - "integrity": "sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/detective-typescript": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz", - "integrity": "sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==", - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "^4.33.0", - "ast-module-types": "^2.7.1", - "node-source-walk": "^4.2.0", - "typescript": "^3.9.10" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": "^10.13 || >=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=0.4.0" } }, - "node_modules/detective-typescript/node_modules/ast-module-types": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz", - "integrity": "sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==", - "dev": true, - "license": "MIT" + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true }, - "node_modules/detective-typescript/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "optional": true, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/detective-typescript/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "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" - }, + "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detective-typescript/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } }, - "node_modules/detective-typescript/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=4.2.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -5077,6 +8815,16 @@ "node": ">=8" } }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5182,6 +8930,29 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/easy-table": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", + "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "optionalDependencies": { + "wcwidth": "^1.0.1" + } + }, + "node_modules/easy-table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -5207,10 +8978,26 @@ "license": "MIT", "optional": true }, + "node_modules/eight-colors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.0.tgz", + "integrity": "sha512-hVoK898cR71ADj7L1LZWaECLaSkzzPtqGXIaKv4K6Pzb72QgjLVsQaNI+ELDQQshzFvgp5xTPkaYkPGqw3YR+g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.825", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz", + "integrity": "sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "license": "MIT" }, "node_modules/encodeurl": { @@ -5244,9 +9031,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", - "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "license": "MIT", "dependencies": { @@ -5278,6 +9065,19 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eol": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", @@ -5388,6 +9188,7 @@ "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5412,7 +9213,8 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -5470,12 +9272,52 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT" - }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -5489,6 +9331,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -5516,28 +9359,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", @@ -5610,6 +9431,19 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-config-standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", @@ -5856,6 +9690,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.5.0.tgz", "integrity": "sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==", "dev": true, + "peer": true, "dependencies": { "@es-joy/jsdoccomment": "~0.43.1", "are-docs-informative": "^0.0.2", @@ -5958,10 +9793,11 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.4.0.tgz", - "integrity": "sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, + "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5977,6 +9813,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, + "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -6010,6 +9847,7 @@ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -6023,6 +9861,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6034,6 +9873,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6047,6 +9887,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6060,6 +9901,7 @@ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6078,6 +9920,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -6175,6 +10018,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6219,26 +10072,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6350,6 +10183,19 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6394,20 +10240,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -6444,6 +10276,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -6454,10 +10293,22 @@ "node": ">=0.10.0" } }, + "node_modules/events-to-array": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", + "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/execa": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz", "integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==", + "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", @@ -6479,6 +10330,19 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -6511,6 +10375,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -6524,6 +10389,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6592,6 +10458,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" @@ -6701,6 +10568,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -6723,14 +10603,6 @@ "dev": true, "license": "ISC" }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", - "dev": true, - "license": "MIT" - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -6742,9 +10614,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -6773,12 +10645,12 @@ } }, "node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 14.17" } }, "node_modules/formdata-node": { @@ -6794,6 +10666,27 @@ "node": ">= 14.17" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "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/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6820,6 +10713,21 @@ "devOptional": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6829,6 +10737,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function-loop": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-4.0.0.tgz", + "integrity": "sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==", + "dev": true, + "license": "ISC" + }, "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", @@ -6879,6 +10794,16 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/gauge/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6908,18 +10833,27 @@ "node": ">=8" } }, - "node_modules/get-amd-module-type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", - "integrity": "sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==", - "dev": true, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "optional": true, "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.2.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/get-caller-file": { @@ -6935,6 +10869,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -7068,125 +11003,66 @@ "node": ">=10.0" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, "license": "MIT", "dependencies": { - "ini": "2.0.0" + "ini": "4.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -7227,6 +11103,15 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/got/node_modules/form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, "node_modules/got/node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -7240,9 +11125,9 @@ } }, "node_modules/got/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" @@ -7264,16 +11149,6 @@ "dev": true, "license": "MIT" }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -7364,6 +11239,16 @@ "node": ">= 0.4" } }, + "node_modules/helpertypes": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/helpertypes/-/helpertypes-0.0.19.tgz", + "integrity": "sha512-J00e55zffgi3yVnUp0UdbMztNkr2PnizEkOe9URNohnrNhW5X0QpegkuLpOmFQInpi93Nb8MCjQRHAiCDF42NQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", @@ -7487,6 +11372,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" @@ -7503,13 +11389,13 @@ } }, "node_modules/husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.2.tgz", + "integrity": "sha512-1/aDMXZdhr1VdJJTLt6e7BipM0Jd9qkpubPiIplon1WmCeOy3nnzsCMeBqS9AsL5ioonl8F8y/F2CLOmk19/Pw==", "dev": true, "license": "MIT", "bin": { - "husky": "bin.mjs" + "husky": "bin.js" }, "engines": { "node": ">=18" @@ -7547,7 +11433,9 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause", + "optional": true }, "node_modules/ignore": { "version": "5.3.1", @@ -7600,6 +11488,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7636,13 +11525,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", - "dev": true, - "license": "MIT" - }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -7676,298 +11558,199 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true, "license": "ISC" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.2.tgz", - "integrity": "sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==", - "dependencies": { - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ink": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-5.0.1.tgz", + "integrity": "sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@alcalzone/ansi-tokenize": "^0.1.3", + "ansi-escapes": "^7.0.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "indent-string": "^5.0.0", + "is-in-ci": "^0.1.0", + "lodash": "^4.17.21", + "patch-console": "^2.0.0", + "react-reconciler": "^0.29.0", + "scheduler": "^0.23.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^7.0.0", + "type-fest": "^4.8.3", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.15.0", + "yoga-wasm-web": "~0.3.3" }, "engines": { - "node": ">=8" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0", + "react-devtools-core": "^4.19.1" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ink/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "environment": "^1.0.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/inquirer/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "node_modules/ink/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/ink/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/signal-exit": { + "node_modules/ink/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/ink/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/ink/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/installed-check": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/installed-check/-/installed-check-9.3.0.tgz", - "integrity": "sha512-4aL5tUyCc/MVkaKnTqg5CdMa20uf7HYHjHJfiv4WeIoBoSKDLd/frMnIRUglnUovHUHrwRuzUDHOd4DidHKkkA==", + "node_modules/ink/node_modules/type-fest": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", + "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "installed-check-core": "^8.3.0", - "meow": "^12.1.1", - "pony-cause": "^2.1.10", - "version-guard": "^1.1.1" - }, - "bin": { - "installed-check": "cli-wrapper.cjs" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18.6.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/installed-check-core": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/installed-check-core/-/installed-check-core-8.3.0.tgz", - "integrity": "sha512-sHqpdbhtfd4k5DgqGxGeihfiABxZSPj5FtwkgRfVkbdfvjKiShFaY+8X4OeM9rAGRn7Dw0d+TBrHgrJOgdg3BA==", + "node_modules/ink/node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dev": true, "license": "MIT", "dependencies": { - "@voxpelli/semver-set": "^5.0.2", - "@voxpelli/typed-utils": "^1.6.0", - "is-glob": "^4.0.3", - "list-installed": "^5.3.0", - "picomatch": "^4.0.1", - "semver": "^7.6.0" + "string-width": "^7.0.0" }, "engines": { - "node": ">=18.6.0" - } - }, - "node_modules/installed-check-core/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/installed-check/node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "node_modules/ink/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=16.10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/internal-slot": { @@ -7998,6 +11781,13 @@ "node": ">= 12" } }, + "node_modules/is-actual-promise": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz", + "integrity": "sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -8028,6 +11818,7 @@ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8051,6 +11842,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -8145,6 +11949,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8179,6 +11985,7 @@ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8201,6 +12008,7 @@ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8227,6 +12035,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", + "dev": true, "license": "MIT", "bin": { "is-in-ci": "cli.js" @@ -8242,6 +12051,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -8256,16 +12067,30 @@ } }, "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dev": true, "license": "MIT", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8275,6 +12100,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -8295,6 +12121,7 @@ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8302,6 +12129,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -8319,6 +12153,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -8365,6 +12200,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8374,6 +12210,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -8382,6 +12219,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -8399,25 +12256,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8507,23 +12352,11 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-unicode-supported": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -8532,19 +12365,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true, - "license": "MIT" - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8571,6 +12398,7 @@ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -8595,6 +12423,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -8612,6 +12442,16 @@ "dev": true, "license": "MIT" }, + "node_modules/isbot": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz", + "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=12" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8663,6 +12503,7 @@ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -8689,6 +12530,16 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8719,6 +12570,7 @@ "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12.0.0" } @@ -8831,6 +12683,7 @@ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -8883,35 +12736,106 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/knip": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.27.0.tgz", + "integrity": "sha512-W8+jhO7i5pXRUqOzhJGm2DT5/d9aQjyrYTCSojqJxFOvi7ku/nHKzpBO3WNf4eflJo0t3zitmUkM69g53qoZQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/knip" + }, + { + "type": "polar", + "url": "https://polar.sh/webpro-nl" + } + ], + "license": "ISC", + "dependencies": { + "@nodelib/fs.walk": "1.2.8", + "@snyk/github-codeowners": "1.1.0", + "easy-table": "1.2.0", + "fast-glob": "^3.3.2", + "jiti": "^1.21.6", + "js-yaml": "^4.1.0", + "minimist": "^1.2.8", + "picocolors": "^1.0.0", + "picomatch": "^4.0.1", + "pretty-ms": "^9.0.0", + "resolve": "^1.22.8", + "smol-toml": "^1.1.4", + "strip-json-comments": "5.0.1", + "summary": "2.1.0", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" + }, + "bin": { + "knip": "bin/knip.js", + "knip-bun": "bin/knip-bun.js" + }, + "engines": { + "node": ">=18.6.0" + }, + "peerDependencies": { + "@types/node": ">=18", + "typescript": ">=5.0.4" + } + }, + "node_modules/knip/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/knip/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ky": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.4.0.tgz", + "integrity": "sha512-tPhhoGUiEiU/WXR4rt8klIoLdnTtyu+9jVKHd/wauEjYud32jyn63mzKWQweaQrHWxBQtYoVtdcEnYX1LosnFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "dev": true, "license": "MIT", "dependencies": { - "package-json": "^8.1.0" + "package-json": "^10.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8947,73 +12871,6 @@ "dev": true, "license": "MIT" }, - "node_modules/list-installed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/list-installed/-/list-installed-5.3.0.tgz", - "integrity": "sha512-Xl8DLrhmA/X9HRBexQOOQsMaM8eg9pzYWgyi+mGBkegKM+tJmU3ictpRbp0q3hsqFFoWvTaWbsu9F599fguK2w==", - "dev": true, - "license": "0BSD", - "dependencies": { - "buffered-async-iterable": "^0.3.0", - "pony-cause": "^2.1.10", - "read-pkg": "^9.0.1", - "read-workspaces": "^1.2.0" - }, - "engines": { - "node": ">=18.6.0" - } - }, - "node_modules/list-installed/node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/list-installed/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/list-installed/node_modules/type-fest": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.3.tgz", - "integrity": "sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -9035,6 +12892,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9052,6 +12916,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^5.3.0", @@ -9068,6 +12933,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9110,6 +12976,25 @@ "node": "14 || >=16.14" } }, + "node_modules/lz-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lz-utils/-/lz-utils-2.0.2.tgz", + "integrity": "sha512-i1PJN4hNEevkrvLMqNWCCac1BcB5SRaghywG7HVzWOyVkFOasLCG19ND1sY1F/ZEsM6SnGtoXyBWnmfqOM5r6g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -9126,6 +13011,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/make-fetch-happen": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", @@ -9145,21 +13037,8 @@ "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/matcher": { @@ -9197,6 +13076,7 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -9282,9 +13162,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -9305,31 +13185,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "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/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -9494,23 +13349,6 @@ "node": ">=12.0.0" } }, - "node_modules/module-definition": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.4.0.tgz", - "integrity": "sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" - }, - "bin": { - "module-definition": "bin/cli.js" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -9534,6 +13372,85 @@ "node": "*" } }, + "node_modules/monocart-code-viewer": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/monocart-code-viewer/-/monocart-code-viewer-1.1.4.tgz", + "integrity": "sha512-ehSe1lBG7D1VDVLjTkHV63J3zAgzyhlC9OaxOri7D0X4L5/EcZUOG5TEoMmYErL+YGSOQXghU9kSSAelwNnp1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/monocart-coverage-reports": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/monocart-coverage-reports/-/monocart-coverage-reports-2.9.3.tgz", + "integrity": "sha512-guRHe/+FGwUc1x1XT4eKW4za5j9MQcq5Vp7CIZfzoGY1mwVp8LKZpDJUjoBkYAb5Xb+7CFAY3lSyNaQ8FKS6oQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "workspaces": [ + "packages/*", + "test" + ], + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jridgewell/sourcemap-codec": "^1.5.0", + "acorn": "^8.12.1", + "acorn-loose": "^8.4.0", + "acorn-walk": "^8.3.3", + "commander": "^12.1.0", + "console-grid": "^2.2.2", + "diff-sequences": "^29.6.3", + "eight-colors": "^1.3.0", + "foreground-child": "^3.2.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.7", + "lz-utils": "^2.0.2", + "minimatch": "9.0.5", + "monocart-code-viewer": "^1.1.4", + "monocart-formatter": "^3.0.0", + "monocart-locator": "^1.0.2", + "turbogrid": "^3.2.0" + }, + "bin": { + "mcr": "lib/cli.js" + } + }, + "node_modules/monocart-coverage-reports/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/monocart-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/monocart-formatter/-/monocart-formatter-3.0.0.tgz", + "integrity": "sha512-91OQpUb/9iDqvrblUv6ki11Jxi1d3Fp5u2jfVAPl3UdNp9TM+iBleLzXntUS51W0o+zoya3CJjZZ01z2XWn25g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "workspaces": [ + "packages/*" + ] + }, + "node_modules/monocart-locator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/monocart-locator/-/monocart-locator-1.0.2.tgz", + "integrity": "sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9544,29 +13461,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -9602,6 +13501,12 @@ "nmtree": "bin/nmtree.js" } }, + "node_modules/nmtree/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/nock": { "version": "13.5.4", "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.4.tgz", @@ -9618,9 +13523,9 @@ } }, "node_modules/node-abi": { - "version": "3.63.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz", - "integrity": "sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", "license": "MIT", "optional": true, "dependencies": { @@ -9631,14 +13536,11 @@ } }, "node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT", - "optional": true, - "engines": { - "node": "^16 || ^18 || >= 20" - } + "optional": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -9692,18 +13594,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } + "license": "MIT" }, "node_modules/node-stream-zip": { "version": "1.15.0", @@ -9869,6 +13765,7 @@ "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.2.tgz", "integrity": "sha512-Q+alQAGIW7ZhKcxLt8GcSi3h3ryheD6xnmXahkMRVM5LYmajcUrSITm8h+OPC9RYWMV2GR0Q1ntTUCfxaNoOJw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "cross-spawn": "^7.0.3", @@ -9893,6 +13790,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^4.0.0" @@ -9904,18 +13802,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -9951,6 +13837,7 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9974,6 +13861,16 @@ "node": ">= 0.4" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", @@ -9999,6 +13896,7 @@ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10048,6 +13946,7 @@ "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-properties": "^1.2.1", "es-abstract": "^1.23.2", @@ -10130,6 +14029,8 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", @@ -10143,6 +14044,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -10165,6 +14076,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^5.3.0", @@ -10184,28 +14096,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "license": "MIT" - }, "node_modules/ora/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", @@ -10219,25 +14114,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10307,18 +14188,19 @@ } }, "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", + "dev": true, "license": "MIT", "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" + "ky": "^1.2.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1", + "semver": "^7.6.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10329,90 +14211,12 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } + "node_modules/packageurl-js": { + "name": "@jdalton/packageurl-js", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@jdalton/packageurl-js/-/packageurl-js-1.2.7.tgz", + "integrity": "sha512-xcur8vvQEr3k9G2EpM+8lXSeCz2ZKb9h986PlrCfz6i8JHOYrcqSXhtYna+tNfO+15PJDENQdIAmahRR2ZWTWA==", + "license": "MIT" }, "node_modules/pacote": { "version": "18.0.6", @@ -10477,6 +14281,7 @@ "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.0.tgz", "integrity": "sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==", "dev": true, + "peer": true, "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" @@ -10515,6 +14320,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -10558,6 +14364,16 @@ "node": ">= 0.8" } }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -10578,12 +14394,16 @@ } }, "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-parse": { @@ -10610,13 +14430,16 @@ } }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pg-connection-string": { @@ -10657,37 +14480,14 @@ "node": ">=0.10" } }, - "node_modules/pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-4.0.0.tgz", - "integrity": "sha512-N4zdA4sfOe6yCv+ulPCmpnIBQ5I60xfhDr1otdBBhKte9QtEf3bhfrfkW7dTb+IQ0iEx4ZDzas0kc1o5rdWpYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, "node_modules/pluralize": { @@ -10700,6 +14500,19 @@ "node": ">=4" } }, + "node_modules/polite-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz", + "integrity": "sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pony-cause": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", @@ -10719,39 +14532,10 @@ "node": ">= 0.4" } }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -10761,21 +14545,6 @@ "node": ">=4" } }, - "node_modules/postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=6.14.4" - } - }, "node_modules/prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", @@ -10803,34 +14572,6 @@ "node": ">=10" } }, - "node_modules/precinct": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", - "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^2.20.3", - "debug": "^4.3.3", - "detective-amd": "^3.1.0", - "detective-cjs": "^3.1.1", - "detective-es6": "^2.2.1", - "detective-less": "^1.0.2", - "detective-postcss": "^4.0.0", - "detective-sass": "^3.0.1", - "detective-scss": "^2.0.1", - "detective-stylus": "^1.0.0", - "detective-typescript": "^7.0.0", - "module-definition": "^3.3.1", - "node-source-walk": "^4.2.0" - }, - "bin": { - "precinct": "bin/cli.js" - }, - "engines": { - "node": "^10.13 || ^12 || >=14" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10841,6 +14582,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prettify-xml": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/prettify-xml/-/prettify-xml-1.2.0.tgz", @@ -10851,6 +14608,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "dev": true, "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" @@ -10862,6 +14620,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prismjs-terminal": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.3.tgz", + "integrity": "sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "chalk": "^5.2.0", + "prismjs": "^1.29.0", + "string-length": "^6.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", @@ -10871,6 +14657,19 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/proggy": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", @@ -10917,25 +14716,13 @@ "node": ">=10" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -11004,6 +14791,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -11107,6 +14895,12 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -11116,12 +14910,81 @@ "node": ">=0.10.0" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true + }, + "node_modules/react-reconciler": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.3.1" + } }, "node_modules/read-cmd-shim": { "version": "4.0.0", @@ -11145,20 +15008,52 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11286,92 +15181,35 @@ }, "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "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" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/read-workspaces": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/read-workspaces/-/read-workspaces-1.2.0.tgz", - "integrity": "sha512-y+I+SL7+p37Kf28AE/P5lXs2JuwXg5DbWJEgOBNuUPc7tfe7b0UiRfgnPsMO/sxDGGD8PPNsymgjbhmX8LwgVA==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.4", - "@pnpm/workspace.read-manifest": "^1.0.3", - "read-pkg": "^9.0.1" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18.6.0" + "node": ">=8" } }, - "node_modules/read-workspaces/node_modules/parse-json": { + "node_modules/read-pkg/node_modules/parse-json": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", @@ -11389,30 +15227,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-workspaces/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-workspaces/node_modules/type-fest": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.3.tgz", - "integrity": "sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11422,35 +15240,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-yaml-file": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz", - "integrity": "sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-yaml": "^4.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11460,50 +15255,17 @@ "node": ">= 6" } }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "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", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redent/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.1" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.10.0" } }, "node_modules/reflect.getprototypeof": { @@ -11512,6 +15274,7 @@ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11528,6 +15291,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -11557,6 +15357,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/regexpu-core/node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/registry-auth-token": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", @@ -11573,6 +15413,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, "license": "MIT", "dependencies": { "rc": "1.2.8" @@ -11658,6 +15499,119 @@ "node": ">=4" } }, + "node_modules/resolve-import": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.0.0.tgz", + "integrity": "sha512-jpKjLibLuc8D1XEV2+7zb0aqN7I8d12u89g/v6IsgCzdVlccMQJq4TKkPw5fbhHdxhm7nbVtN+KvOTnjFf+nEA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^11.0.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/resolve-import/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/resolve-import/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/resolve-import/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/resolve-import/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/resolve-import/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/resolve-import/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -11687,6 +15641,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -11703,6 +15658,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/retry": { @@ -11811,10 +15767,111 @@ "node": ">=8.0" } }, + "node_modules/rollup": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "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.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-ts": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/rollup-plugin-ts/-/rollup-plugin-ts-3.4.5.tgz", + "integrity": "sha512-9iCstRJpEZXSRQuXitlSZAzcGlrqTbJg1pE4CMbEi6xYldxVncdPyzA2I+j6vnh73wBymZckerS+Q/iEE/M3Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "@wessberg/stringutil": "^1.0.19", + "ansi-colors": "^4.1.3", + "browserslist": "^4.21.10", + "browserslist-generator": "^2.1.0", + "compatfactory": "^3.0.0", + "crosspath": "^2.0.0", + "magic-string": "^0.30.2", + "ts-clone-node": "^3.0.0", + "tslib": "^2.6.1" + }, + "engines": { + "node": ">=16.15.1", + "npm": ">=7.0.0", + "pnpm": ">=3.2.0", + "yarn": ">=1.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/rollup-plugin-ts?sponsor=1" + }, + "peerDependencies": { + "@babel/core": ">=7.x", + "@babel/plugin-transform-runtime": ">=7.x", + "@babel/preset-env": ">=7.x", + "@babel/preset-typescript": ">=7.x", + "@babel/runtime": ">=7.x", + "@swc/core": ">=1.x", + "@swc/helpers": ">=0.2", + "rollup": ">=1.x || >=2.x || >=3.x", + "typescript": ">=3.2.x || >= 4.x || >= 5.x" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/plugin-transform-runtime": { + "optional": true + }, + "@babel/preset-env": { + "optional": true + }, + "@babel/preset-typescript": { + "optional": true + }, + "@babel/runtime": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/helpers": { + "optional": true + } + } + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -11822,14 +15879,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11853,14 +15902,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -11916,10 +15957,20 @@ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC" }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11938,6 +15989,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -12233,20 +16285,14 @@ "simple-concat": "^1.0.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12256,7 +16302,8 @@ "version": "3.0.12", "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/slice-ansi": { "version": "4.0.0", @@ -12290,24 +16337,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -12318,6 +16347,19 @@ "npm": ">= 3.0.0" } }, + "node_modules/smol-toml": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.0.tgz", + "integrity": "sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", @@ -12352,27 +16394,6 @@ "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", "license": "MIT" }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -12405,6 +16426,7 @@ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12798,6 +16820,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -12812,6 +16857,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -12825,6 +16871,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", + "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -12847,7 +16894,24 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true + }, + "node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/string-width": { "version": "5.1.2", @@ -12881,45 +16945,46 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/string-width/node_modules/ansi-regex": { + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "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.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12994,15 +17059,18 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -13018,6 +17086,15 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -13032,6 +17109,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -13066,6 +17144,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/summary": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz", + "integrity": "sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==", + "dev": true, + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13075,33 +17160,178 @@ "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-content": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.1.tgz", + "integrity": "sha512-NI1mo514yFhr8pV/5Etvgh+pSBUIpoAKoiBIUwALVlQQNAwb40bTw8hhPFaip/dvv0GhpHVOq0vq8iY02ppLTg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^11.0.0", + "mkdirp": "^3.0.1", + "path-scurry": "^2.0.0", + "rimraf": "^6.0.0", + "tshy": "^3.0.0" + }, + "bin": { + "sync-content": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sync-content/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sync-content/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sync-content/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/sync-content/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sync-content/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", + "node_modules/sync-content/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/sync-content/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, "engines": { - "node": ">= 0.4" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/synckit": { @@ -13109,6 +17339,7 @@ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz", "integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==", "dev": true, + "peer": true, "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -13165,6 +17396,15 @@ "node": ">=10.0.0" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/table/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -13185,6 +17425,87 @@ "node": ">=8" } }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.0.0.tgz", + "integrity": "sha512-iQHgScpN6VeAnKot3ZgafKvoE0VQfYGaKXSZfSLeHo3P9qKqcwYQdDW2VkVXm6TF10f1/TSYFYoMV0Th+7mieg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.0.0", + "@tapjs/after-each": "4.0.0", + "@tapjs/asserts": "4.0.0", + "@tapjs/before": "4.0.0", + "@tapjs/before-each": "4.0.0", + "@tapjs/chdir": "3.0.0", + "@tapjs/core": "4.0.0", + "@tapjs/filter": "4.0.0", + "@tapjs/fixture": "4.0.0", + "@tapjs/intercept": "4.0.0", + "@tapjs/mock": "4.0.0", + "@tapjs/node-serialize": "4.0.0", + "@tapjs/run": "4.0.0", + "@tapjs/snapshot": "4.0.0", + "@tapjs/spawn": "4.0.0", + "@tapjs/stdin": "4.0.0", + "@tapjs/test": "4.0.0", + "@tapjs/typescript": "3.0.0", + "@tapjs/worker": "4.0.0", + "resolve-import": "2" + }, + "bin": { + "tap": "dist/esm/run.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap-parser": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.0.0.tgz", + "integrity": "sha512-RM3Lp5LNCYcepRqPMuDFg8S3uYV8MDmgxUOjx2Q7f2z5QuB88u92ViBwyp3MuQ/DVMR7v48HrJfV2scXRQYf5A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "events-to-array": "^2.0.3", + "tap-yaml": "4.0.0" + }, + "bin": { + "tap-parser": "bin/cmd.cjs" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tap-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.0.0.tgz", + "integrity": "sha512-CjMbq8hhT5TvzyvHRnzbGp00wmb4TZjSscCRCCJCdCzRb+Pb56HaMlBHNBn1/GZ6UqwUgDKdF18+9VAFnQ4F0g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "yaml": "^2.4.1", + "yaml-types": "^0.4.0" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13282,10 +17603,25 @@ "node": ">=8" } }, + "node_modules/tcompare": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-9.0.0.tgz", + "integrity": "sha512-qOliew2xDAqIUbIamIFZ+pz80s9T+8IywzQPIt7YX30ojsBqk86jcD6ouygqt5lHURTxFxWjzbUmIe7Cts4bsA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "diff": "^5.2.0", + "react-element-to-jsx-string": "^15.0.0" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/terminal-link": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^5.0.0", @@ -13323,6 +17659,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -13377,17 +17714,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "node_modules/trivial-deferred": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-2.0.0.tgz", + "integrity": "sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, "node_modules/ts-api-utils": { @@ -13403,6 +17737,26 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-clone-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ts-clone-node/-/ts-clone-node-3.0.0.tgz", + "integrity": "sha512-egavvyHbIoelkgh1IC2agNB1uMNjB8VJgh0g/cn0bg2XXTcrtjrGMzEk4OD3Fi2hocICjP3vMa56nkzIzq0FRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "compatfactory": "^3.0.0" + }, + "engines": { + "node": ">=14.9.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-clone-node?sponsor=1" + }, + "peerDependencies": { + "typescript": "^3.x || ^4.x || ^5.x" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -13416,10 +17770,183 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tshy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.0.2.tgz", + "integrity": "sha512-8GkWnAfmNXxl8iDTZ1o2H4jdaj9H7HeDKkr5qd0ZhQBCNA41D3xqTyg2Ycs51VCfmjJ5e+0v9AUmD6ylAI9Bgw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "chalk": "^5.3.0", + "chokidar": "^3.6.0", + "foreground-child": "^3.1.1", + "minimatch": "^10.0.0", + "mkdirp": "^3.0.1", + "polite-json": "^5.0.0", + "resolve-import": "^2.0.0", + "rimraf": "^6.0.0", + "sync-content": "^2.0.1", + "typescript": "^5.5.3", + "walk-up-path": "^4.0.0" + }, + "bin": { + "tshy": "dist/esm/index.js" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tshy/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tshy/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/tshy/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tshy/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tshy/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tshy/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tshy/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tshy/node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/tshy/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, "license": "0BSD" }, "node_modules/tsutils": { @@ -13472,6 +17999,15 @@ "node": "*" } }, + "node_modules/turbogrid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/turbogrid/-/turbogrid-3.2.0.tgz", + "integrity": "sha512-c+2qrCGWzoYpLlxtHgRJ4V5dDRE9fUT7D9maxtdBCqJ0NzCdY+x7xF3/F6cG/+n3VIzKfIS+p9Z/0YMQPf6k/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -13486,24 +18022,24 @@ } }, "node_modules/type-coverage": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/type-coverage/-/type-coverage-2.29.0.tgz", - "integrity": "sha512-1YGnQo6kK7cq8PwPoW27EnyKsvpzM7pPPo7bcS4u/7Sb4zs0WX1rGBm1eou3ZHslu56AsmPt/pgIuhCgN1EriQ==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/type-coverage/-/type-coverage-2.29.1.tgz", + "integrity": "sha512-hsS1UYDrSltiSqMHJQn5wRFJiAeSA1PItMgeszxBkBjZEbtCzzmAU9dQswR1k8z0/ewj2/SbYEldYRurxgmxhA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "4.1.2", "minimist": "1", - "type-coverage-core": "^2.28.1" + "type-coverage-core": "^2.29.1" }, "bin": { "type-coverage": "bin/type-coverage" } }, "node_modules/type-coverage-core": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/type-coverage-core/-/type-coverage-core-2.28.1.tgz", - "integrity": "sha512-NniLJtLiDg0+dhrf/9ACGwi3OAhIfvd20f1CB0yxIUBMECwmJp7e7me3lM8djkrDBJtqSY+uXA6PRs+yv3HTnA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/type-coverage-core/-/type-coverage-core-2.29.1.tgz", + "integrity": "sha512-lonikLRWnejbW9qsjoUsqXxQ3c4D0LPHaY2fsN5YD78sHAL27AaIoWYOjtitSqmv5UCS+3tv4qYjnj56vUH5eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13550,30 +18086,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/type-coverage/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/type-coverage/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -13683,10 +18200,11 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "devOptional": true, + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13695,6 +18213,30 @@ "node": ">=14.17" } }, + "node_modules/ua-parser-js": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -13711,22 +18253,56 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", @@ -13739,13 +18315,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", - "dev": true, - "license": "MIT" - }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -13774,6 +18343,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" @@ -13795,10 +18365,42 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "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/update-notifier": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", - "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.1.0.tgz", + "integrity": "sha512-8SV3rIqVY6EFC1WxH6L0j55s0MO79MFBS1pivmInRJg3pCEDgWHBj1Q6XByTtCLOZIFA0f6zoG9ZWf2Ks9lvTA==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.1.1", @@ -13806,11 +18408,11 @@ "configstore": "^6.0.0", "import-lazy": "^4.0.0", "is-in-ci": "^0.1.0", - "is-installed-globally": "^0.4.0", + "is-installed-globally": "^1.0.0", "is-npm": "^6.0.0", - "latest-version": "^7.0.0", + "latest-version": "^9.0.0", "pupa": "^3.1.0", - "semver": "^7.5.4", + "semver": "^7.6.2", "semver-diff": "^4.0.0", "xdg-basedir": "^5.1.0" }, @@ -13859,6 +18461,13 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -13929,16 +18538,6 @@ "node": ">= 0.8" } }, - "node_modules/version-guard": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.2.tgz", - "integrity": "sha512-D8d+YxCUpoqtCnQzDxm6SF7DLU3gr2535T4khAtMq4osBahsQnmSxuwXFdrbAdDGG8Uokzfis/jvyeFPdmlc7w==", - "dev": true, - "license": "0BSD", - "engines": { - "node": ">=0.10.48" - } - }, "node_modules/walk-up-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", @@ -13949,6 +18548,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { "defaults": "^1.0.3" } @@ -14000,6 +18602,7 @@ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", @@ -14027,6 +18630,7 @@ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -14079,6 +18683,16 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -14101,10 +18715,24 @@ "node": ">=8" } }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, "license": "MIT", "dependencies": { "string-width": "^5.0.1" @@ -14171,6 +18799,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -14186,24 +18823,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -14224,31 +18843,16 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrappy": { @@ -14259,22 +18863,50 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -14322,6 +18954,20 @@ "node": ">= 14" } }, + "node_modules/yaml-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.4.0.tgz", + "integrity": "sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 16", + "npm": ">= 7" + }, + "peerDependencies": { + "yaml": "^2.3.0" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -14349,6 +18995,15 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -14369,10 +19024,22 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "license": "MIT", "engines": { "node": ">=12.20" @@ -14382,9 +19049,10 @@ } }, "node_modules/yoctocolors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.0.2.tgz", - "integrity": "sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -14394,15 +19062,46 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.1.tgz", - "integrity": "sha512-c6T13b6qYcJZvck7QbEFXrFX/Mu2KOjvAGiKHmYMUg96jxNpfP6i+psGW72BOPxOIDUJrORG+Kyu7quMX9CQBQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoga-wasm-web": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", + "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.3.0.tgz", + "integrity": "sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" + } } } } diff --git a/package.json b/package.json index f8f4b64a..0b7918ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socketsecurity/cli", - "version": "0.10.0", + "version": "0.9.3", "description": "CLI tool for Socket.dev", "homepage": "http://github.com/SocketDev/socket-cli-js", "repository": { @@ -14,84 +14,111 @@ "url": "https://socket.dev" }, "license": "MIT", - "type": "module", "bin": { - "socket": "cli.js", - "socket-npm": "lib/shadow/npm-cli.cjs", - "socket-npx": "lib/shadow/npx-cli.cjs" + "socket": "dist/cli.js", + "socket-npm": "dist/npm-cli.js", + "socket-npx": "dist/npx-cli.js" }, "files": [ - "cli.js", - "lib/**/*.js", - "lib/**/*.json", - "lib/**/*.cjs", - "lib/shadow/**" + "bin/**", + "dist/**", + "translations.json" ], "dependencies": { "@apideck/better-ajv-errors": "^0.3.6", - "@cyclonedx/cdxgen": "^10.7.0", - "@inquirer/select": "^2.3.5", + "@cyclonedx/cdxgen": "^10.8.9", + "@inquirer/prompts": "^5.3.2", "@socketsecurity/config": "^2.1.3", "@socketsecurity/sdk": "^1.2.0", - "chalk": "^5.3.0", + "ansi-align": "^3.0.1", "chalk-table": "^1.0.2", - "execa": "^9.1.0", - "globby": "^14.0.1", + "cli-boxes": "^3.0.0", + "cli-spinners": "^2.9.2", + "cross-spawn": "^7.0.3", + "dot-prop": "^6.0.1", + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.3.0", + "fast-glob": "^3.3.2", + "graceful-fs": "^4.2.6", "hpagent": "^1.2.0", "ignore": "^5.3.1", "ignore-by-default": "^2.1.0", - "inquirer": "^9.2.23", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "meow": "^13.2.0", - "open": "^10.1.0", - "ora": "^8.0.1", + "ini": "4.1.1", + "onetime": "^5.1.0", + "pacote": "^18.0.6", "pony-cause": "^2.1.11", - "prompts": "^2.4.2", + "rc": "1.2.8", + "registry-auth-token": "^5.0.2", + "semver": "^7.6.2", + "signal-exit": "^4.1.0", + "supports-hyperlinks": "^2.2.0", "synp": "^1.9.13", - "terminal-link": "^3.0.0", - "update-notifier": "^7.0.0", "which": "^4.0.0", + "write-file-atomic": "^3.0.3", "yargs-parser": "^21.1.1" }, "devDependencies": { + "@babel/core": "^7.24.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-env": "^7.24.8", + "@babel/preset-typescript": "^7.24.7", + "@babel/runtime": "^7.24.8", + "@eslint/compat": "^1.1.1", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.7", + "@rollup/pluginutils": "^5.1.0", "@socketsecurity/eslint-config": "^5.0.1", "@tsconfig/node20": "^20.1.4", - "@types/chai": "^4.3.16", - "@types/chai-as-promised": "^7.1.8", - "@types/inquirer": "^9.0.7", - "@types/micromatch": "^4.0.7", - "@types/mocha": "^10.0.6", + "@types/micromatch": "^4.0.9", + "@types/mocha": "^10.0.7", "@types/mock-fs": "^4.13.4", - "@types/node": "^20.12.13", + "@types/node": "^20.14.12", "@types/npm": "^7.19.3", - "@types/npmcli__arborist": "^5.6.6", - "@types/prompts": "^2.4.9", + "@types/npmcli__arborist": "^5.6.9", "@types/update-notifier": "^6.0.8", "@types/which": "^3.0.4", "@types/yargs-parser": "^21.0.3", "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "7.10.0", "c8": "^10.1.2", - "dependency-check": "^5.0.0-7", + "chalk": "^5.3.0", + "esbuild": "^0.23.0", "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-config-standard-jsx": "^11.0.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.7", "eslint-plugin-n": "^16.6.2", "eslint-plugin-promise": "^6.2.0", - "eslint-plugin-react": "^7.34.2", - "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-unicorn": "^48.0.1", - "husky": "^9.0.11", - "installed-check": "^9.3.0", + "execa": "^9.3.0", + "globby": "^14.0.2", + "husky": "^9.1.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "knip": "^5.27.0", + "magic-string": "^0.30.10", + "meow": "^13.2.0", "mock-fs": "^5.2.0", "nock": "^13.5.4", - "npm-run-all2": "^6.2.0", - "type-coverage": "^2.29.0", - "typescript": "~5.5.2" + "npm-run-all2": "^6.2.2", + "open": "^10.1.0", + "ora": "^8.0.1", + "prettier": "3.3.3", + "read-package-up": "^11.0.0", + "rollup": "4.19.0", + "rollup-plugin-ts": "^3.4.5", + "tap": "^21.0.0", + "terminal-link": "^3.0.0", + "type-coverage": "^2.29.1", + "typescript": "~5.4.5", + "update-notifier": "^7.1.0", + "validate-npm-package-name": "^5.0.1" }, "overrides": { "@cyclonedx/cdxgen": { @@ -99,20 +126,26 @@ } }, "engines": { - "node": "^20.9.0 || >=21.1.0" + "node": "^20.9.0 || >=22.0.0" }, - "scripts": { - "check:dependency-check": "dependency-check '*.js' 'lib/shadow/*.cjs' '*.mjs' 'test/*.js' --no-dev --ignore-module node:* --ignore-module @cyclonedx/* --ignore-module synp", - "check:installed-check": "installed-check -i eslint-plugin-jsdoc", + "//check:knip": "knip", + "build": "npm run build:dist && npm run build:test", + "build:dist": "rollup -c .config/rollup.dist.config.mjs", + "build:test": "rollup -c .config/rollup.test.config.mjs", "check:lint": "eslint --report-unused-disable-directives .", "check:tsc": "tsc", "check:type-coverage": "type-coverage --detail --strict --at-least 95 --ignore-files 'test/*'", "check": "run-p -c --aggregate-output check:*", - "prepare": "husky install", - "test:unit": "c8 --reporter=lcov --reporter text node --test", - "test-ci": "run-s test:*", - "test": "run-s check test:*", + "prepare": "husky", + "test:c8": "c8 --reporter=none node --test \"test/socket-npm.test.cjs\"", + "test:unit": "tap", + "test:coverage": "cp -r .tap/coverage/*.json coverage/tmp && c8 --reporter=lcov --reporter=text --include \"dist/*.js\" --exclude \"dist/vendor.js\" report", + "test-ci": "run-s build:* test:*", + "test": "run-s check build:* test:*", + "lint": "NODE_OPTIONS=--max-old-space-size=10240 eslint --quiet .", + "lint:fix": "npm run lint:fix:fast && NODE_OPTIONS=--max-old-space-size=10240 eslint --quiet --cache --fix .", + "lint:fix:fast": "prettier --cache --log-level warn --write .", "//postinstall": "node ./cli.js wrapper --postinstall" } } diff --git a/scripts/files.js b/scripts/files.js new file mode 100644 index 00000000..6273851e --- /dev/null +++ b/scripts/files.js @@ -0,0 +1,11 @@ +'use strict' + +const { readFileSync } = require('node:fs') + +function loadJSON(filepath) { + return JSON.parse(readFileSync(filepath, 'utf8')) +} + +module.exports = { + loadJSON +} diff --git a/scripts/objects.js b/scripts/objects.js new file mode 100644 index 00000000..34c3f14b --- /dev/null +++ b/scripts/objects.js @@ -0,0 +1,18 @@ +'use strict' + +function hasKeys(obj) { + for (const key in obj) { + if (hasOwn(obj, key)) return true + } + return false +} + +function hasOwn(obj, propKey) { + if (obj === null || obj === undefined) return false + return Object.hasOwn(obj, propKey) +} + +module.exports = { + hasKeys, + hasOwn +} diff --git a/scripts/packages.js b/scripts/packages.js new file mode 100644 index 00000000..cb458d5c --- /dev/null +++ b/scripts/packages.js @@ -0,0 +1,115 @@ +'use strict' + +const fs = require('node:fs') +const Module = require('node:module') +const vm = require('node:vm') + +const validatePackageName = require('validate-npm-package-name') + +const { normalizePath } = require('./paths') + +const { createRequire, isBuiltin } = Module + +// eslint-disable-next-line no-control-regex +const cjsPluginPrefixRegExp = /^\x00/ +const cjsPluginSuffixRegExp = + /\?commonjs-(?:entry|es-import|exports|external|module|proxy|wrapped)$/ + +function getPackageName(string, start = 0) { + const end = getPackageNameEnd(string, start) + return end === string.length ? string : string.slice(0, end) +} + +function getPackageNameEnd(string, start = 0) { + const firstSlashIndex = string.indexOf('/', start) + if (firstSlashIndex === -1) return string.length + if (string.charCodeAt(start) !== 64 /*'@'*/) return firstSlashIndex + const secondSlashIndex = string.indexOf('/', firstSlashIndex + 1) + return secondSlashIndex === -1 ? string.length : secondSlashIndex +} + +function resolveId(id_, req = require) { + const id = normalizeId(id_) + let resolvedId + if (typeof req === 'string') { + try { + req = createRequire(req) + } catch {} + } + if (req !== require) { + try { + resolvedId = req.resolve(id) + } catch {} + } + if (resolvedId === undefined) { + try { + resolvedId = require.resolve(id) + } catch {} + } + if (resolvedId === undefined) { + resolvedId = id + } + if (isPackageName(id)) { + return resolvedId + } + const tsId = `${resolvedId}.ts` + return fs.existsSync(tsId) ? tsId : resolvedId +} + +const memoizeIsPackageName = new Map() + +function isPackageName(id) { + const memResult = memoizeIsPackageName.get(id) + if (memResult !== undefined) return memResult + const result = validatePackageName(id).validForOldPackages + memoizeIsPackageName.set(id, result) + return result +} + +const memoizeIsEsmId = new Map() + +function isEsmId(id_, parentId_) { + if (isBuiltin(id_)) { + return false + } + const parentId = parentId_ ? resolveId(parentId_) : undefined + const resolvedId = resolveId(id_, parentId) + const memKey = `${resolvedId}|${parentId}` + const memResult = memoizeIsEsmId.get(memKey) + if (memResult !== undefined) return memResult + let result = false + if (resolvedId.endsWith('.mjs')) { + result = true + } else if ( + !resolvedId.endsWith('.cjs') && + !resolvedId.endsWith('.json') && + !resolvedId.endsWith('.ts') + ) { + try { + // eslint-disable-next-line no-new + new vm.Script(fs.readFileSync(resolvedId, 'utf8')) + } catch (e) { + if (e instanceof SyntaxError) { + result = true + } + } + } + memoizeIsEsmId.set(memKey, result) + return result +} + +function normalizeId(id) { + return normalizePath(id) + .replace(cjsPluginPrefixRegExp, '') + .replace(cjsPluginSuffixRegExp, '') +} + +module.exports = { + isBuiltin, + isEsmId, + isPackageName, + getPackageName, + getPackageNameEnd, + normalizeId, + resolveId +} diff --git a/scripts/paths.js b/scripts/paths.js new file mode 100644 index 00000000..962dc933 --- /dev/null +++ b/scripts/paths.js @@ -0,0 +1,73 @@ +'use strict' + +const { search } = require('./strings') + +const anySlashRegExp = /[\\/]/ + +function normalizePath(filePath) { + const { length } = filePath + if (length < 2) { + return length === 1 && filePath.charCodeAt(0) === 92 /*'\\'*/ + ? '/' + : filePath + } + + let code = 0 + let collapsed = '' + let start = 0 + + // Ensure win32 namespaces have two leading slashes so they are handled properly + // by path.win32.parse() after being normalized. + // https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#namespaces + let prefix = '' + if (length > 4 && filePath.charCodeAt(3) === 92 /*'\\'*/) { + const code2 = filePath.charCodeAt(2) + // Look for \\?\ or \\.\ + if ( + (code2 === 63 /*'?'*/ || code2 === 46) /*'.'*/ && + filePath.charCodeAt(0) === 92 /*'\\'*/ && + filePath.charCodeAt(1) === 92 /*'\\'*/ + ) { + start = 2 + prefix = '//' + } + } + if (start === 0) { + // Trim leading slashes + while ( + ((code = filePath.charCodeAt(start)), + code === 47 /*'/'*/ || code === 92) /*'\\'*/ + ) { + start += 1 + } + if (start) { + prefix = '/' + } + } + let nextIndex = search(filePath, anySlashRegExp, start) + if (nextIndex === -1) { + return prefix + filePath.slice(start) + } + // Discard any empty string segments by collapsing repeated segment separator slashes. + while (nextIndex !== -1) { + const segment = filePath.slice(start, nextIndex) + collapsed = collapsed + (collapsed.length === 0 ? '' : '/') + segment + start = nextIndex + 1 + while ( + ((code = filePath.charCodeAt(start)), + code === 47 /*'/'*/ || code === 92) /*'\\'*/ + ) { + start += 1 + } + nextIndex = search(filePath, anySlashRegExp, start) + } + const lastSegment = filePath.slice(start) + if (lastSegment.length !== 0) { + collapsed = collapsed + '/' + lastSegment + } + return prefix + collapsed +} + +module.exports = { + normalizePath +} diff --git a/scripts/rollup/socket-modify-plugin.js b/scripts/rollup/socket-modify-plugin.js new file mode 100644 index 00000000..59e38bfd --- /dev/null +++ b/scripts/rollup/socket-modify-plugin.js @@ -0,0 +1,38 @@ +'use strict' + +const { createFilter } = require('@rollup/pluginutils') +const MagicString = require('magic-string') + +function socketModifyPlugin({ + find, + replace, + include, + exclude, + sourcemap = true +}) { + const filter = createFilter(include, exclude) + return { + name: 'socket-modify', + renderChunk: (code, { fileName }) => { + if (!filter(fileName)) return null + const s = new MagicString(code) + find.lastIndex = 0 + let match + while ((match = find.exec(code)) !== null) { + s.overwrite( + match.index, + match.index + match[0].length, + typeof replace === 'function' + ? Reflect.apply(replace, match, match) + : String(replace) + ) + } + return { + code: s.toString(), + map: sourcemap ? s.generateMap() : null + } + } + } +} + +module.exports = socketModifyPlugin diff --git a/scripts/sorts.js b/scripts/sorts.js new file mode 100644 index 00000000..031e92a5 --- /dev/null +++ b/scripts/sorts.js @@ -0,0 +1,15 @@ +'use strict' + +const { compare: localCompare } = new Intl.Collator() + +function toSortedObject(object) { + const entries = Object.entries(object).sort((a, b) => + localCompare(a[0], b[0]) + ) + return Object.fromEntries(entries) +} + +module.exports = { + localCompare, + toSortedObject +} diff --git a/scripts/strings.js b/scripts/strings.js new file mode 100644 index 00000000..36023781 --- /dev/null +++ b/scripts/strings.js @@ -0,0 +1,34 @@ +'use strict' + +const { localCompare, toSortedObject } = require('./sorts') + +// Inlined "escape-string-regexp": +// https://www.npmjs.com/package/escape-string-regexp/v/5.0.0 +// MIT Licenced +// Copyright (c) Sindre Sorhus (https://sindresorhus.com) +function escapeRegExp(str) { + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when + // the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d') +} + +function formatObject(object, space = 2) { + return JSON.stringify(toSortedObject(object), null, space) +} + +function search(str, regexp, fromIndex = 0) { + const { length } = str + if (fromIndex >= length) return -1 + if (fromIndex === 0) return str.search(regexp) + const offset = fromIndex < 0 ? Math.max(length + fromIndex, 0) : fromIndex + const result = str.slice(offset).search(regexp) + return result === -1 ? -1 : result + offset +} + +module.exports = { + escapeRegExp, + formatObject, + localCompare, + search +} diff --git a/src/cli.ts b/src/cli.ts new file mode 100755 index 00000000..28d2bfed --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +import { readFileSync } from 'node:fs' +import path from 'node:path' +import { pathToFileURL } from 'node:url' + +// @ts-ignore +import chalk from 'chalk' +import { messageWithCauses, stackWithCauses } from 'pony-cause' +import updateNotifier from 'update-notifier' + +import * as cliCommands from './commands' +import { logSymbols } from './utils/chalk-markdown' +import { AuthError, InputError } from './utils/errors' +import { meowWithSubcommands } from './utils/meow-with-subcommands' + +const distPath = __dirname +const rootPath = path.resolve(distPath, '..') + +function camelToHyphen(str: string): string { + return str.replace(/[A-Z]+/g, '-$&').toLowerCase() +} + +const formattedCliCommands = Object.fromEntries( + Object.entries(cliCommands).map(entry => { + entry[0] = camelToHyphen(entry[0]) + return entry + }) +) + +// TODO: Add autocompletion using https://www.npmjs.com/package/omelette +;(async () => { + try { + updateNotifier({ + pkg: JSON.parse(readFileSync(path.join(rootPath, 'package.json'), 'utf8')) + }).notify() + } catch {} + + try { + await meowWithSubcommands(formattedCliCommands, { + aliases: { + ci: { + description: 'Alias for "report create --view --strict"', + argv: ['report', 'create', '--view', '--strict'] + } + }, + argv: process.argv.slice(2), + name: 'socket', + importMeta: { url: `${pathToFileURL(__filename)}` } as ImportMeta + }) + } catch (err) { + let errorTitle: string + let errorMessage = '' + let errorBody: string | undefined + + if (err instanceof AuthError) { + errorTitle = 'Authentication error' + errorMessage = err.message + } else if (err instanceof InputError) { + errorTitle = 'Invalid input' + errorMessage = err.message + errorBody = err.body + } else if (err instanceof Error) { + errorTitle = 'Unexpected error' + errorMessage = messageWithCauses(err) + errorBody = stackWithCauses(err) + } else { + errorTitle = 'Unexpected error with no details' + } + + console.error( + `${logSymbols.error} ${chalk.white.bgRed(errorTitle + ':')} ${errorMessage}` + ) + if (errorBody) { + console.error('\n' + errorBody) + } + + process.exit(1) + } +})() diff --git a/src/commands/audit-log.ts b/src/commands/audit-log.ts new file mode 100644 index 00000000..575d7c1f --- /dev/null +++ b/src/commands/audit-log.ts @@ -0,0 +1,181 @@ +import { select, Separator } from '@inquirer/prompts' +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../utils/api-helpers' +import { printFlagList } from '../utils/formatting' +import { FREE_API_KEY, getDefaultKey, setupSdk } from '../utils/sdk' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const auditlog: CliSubcommand = { + description: 'Look up the audit log for an organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' audit-log' + + const input = setupCommand(name, auditlog.description, argv, importMeta) + if (input) { + const spinner = ora(`Looking up audit log for ${input.orgSlug}\n`).start() + await fetchOrgAuditLog(input.orgSlug, input, spinner) + } + } +} + +const auditLogFlags: { [key: string]: any } = { + type: { + type: 'string', + shortFlag: 't', + default: '', + description: 'Type of log event' + }, + perPage: { + type: 'number', + shortFlag: 'pp', + default: 30, + description: 'Results per page - default is 30' + }, + page: { + type: 'number', + shortFlag: 'p', + default: 1, + description: 'Page number - default is 1' + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + type: string + page: number + per_page: number +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...auditLogFlags, + ...outputFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + json: outputJson, + markdown: outputMarkdown, + page, + perPage + } = cli.flags + + const type = cli.flags['type'] + + if (cli.input.length < 1) { + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug \n` + ) + cli.showHelp() + return + } + const [orgSlug = ''] = cli.input + + return { + outputJson, + outputMarkdown, + orgSlug, + type: type && type.charAt(0).toUpperCase() + type.slice(1), + page, + per_page: perPage + } +} + +type AuditLogData = { + data: SocketSdkReturnType<'getAuditLogEvents'>['data'] +} + +type Choice = { + value: Value + name?: string + description?: string + disabled?: boolean | string + type?: never +} + +type AuditChoice = Choice + +type AuditChoices = (Separator | AuditChoice)[] + +async function fetchOrgAuditLog( + orgSlug: string, + input: CommandContext, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey() || FREE_API_KEY) + const result = await handleApiCall( + socketSdk.getAuditLogEvents(orgSlug, input), + `Looking up audit log for ${orgSlug}\n` + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('getAuditLogEvents', result, spinner) + return + } + spinner.stop() + + const data: AuditChoices = [] + const logDetails: { [key: string]: string } = {} + + for (const d of result.data.results) { + const { created_at } = d + if (created_at) { + const name = `${new Date(created_at).toLocaleDateString('en-us', { year: 'numeric', month: 'numeric', day: 'numeric' })} - ${d.user_email} - ${d.type} - ${d.ip_address} - ${d.user_agent}` + data.push({ name }, new Separator()) + logDetails[name] = JSON.stringify(d.payload) + } + } + + console.log( + logDetails[ + (await select({ + message: input.type + ? `\n Audit log for: ${orgSlug} with type: ${input.type} \n` + : `\n Audit log for: ${orgSlug} \n`, + choices: data, + pageSize: 30 + })) as any + ] + ) + + return { + data: result.data + } +} diff --git a/lib/commands/cdxgen/index.js b/src/commands/cdxgen.ts similarity index 81% rename from lib/commands/cdxgen/index.js rename to src/commands/cdxgen.ts index 34e46672..ec54eaeb 100644 --- a/lib/commands/cdxgen/index.js +++ b/src/commands/cdxgen.ts @@ -1,14 +1,14 @@ -/* eslint-disable no-console */ - import { existsSync, promises as fs } from 'node:fs' import path from 'node:path' -import { fileURLToPath } from 'node:url' import chalk from 'chalk' import { $ } from 'execa' import yargsParse from 'yargs-parser' -const __dirname = path.dirname(fileURLToPath(import.meta.url)) +import type { CliSubcommand } from '../utils/meow-with-subcommands' + +const distPath = __dirname +const rootPath = path.resolve(distPath, '..') const { SBOM_SIGN_ALGORITHM, // Algorithm. Example: RS512 @@ -16,12 +16,12 @@ const { SBOM_SIGN_PUBLIC_KEY // Optional. Location to the RSA public key } = process.env -const toLower = (/** @type {string} */ arg) => arg.toLowerCase() -const arrayToLower = (/** @type {string[]} */ arg) => arg.map(toLower) +const toLower = (arg: string) => arg.toLowerCase() +const arrayToLower = (arg: string[]) => arg.map(toLower) const execaConfig = { env: { NODE_ENV: '' }, - localDir: path.join(__dirname, 'node_modules'), + localDir: path.join(rootPath, 'node_modules') } const nodejsPlatformTypes = [ @@ -66,7 +66,7 @@ const yargsConfig = { //'server-host': '127.0.0.1', //'server-port': '9090', //'spec-version': '1.5', - type: 'js', + type: 'js' //validate: true, }, alias: { @@ -76,7 +76,7 @@ const yargsConfig = { recurse: ['r'], 'resolve-class': ['c'], type: ['t'], - version: ['v'], + version: ['v'] }, array: [ { key: 'author', type: 'string' }, @@ -100,7 +100,7 @@ const yargsConfig = { 'required-only', 'server', 'validate', - 'version', + 'version' ], string: [ 'api-key', @@ -114,16 +114,13 @@ const yargsConfig = { 'server-host', 'server-port', 'server-url', - 'spec-version', + 'spec-version' ] } -/** - * - * @param {{ [key: string]: boolean | null | number | string | (string | number)[]}} argv - * @returns {string[]} - */ -function argvToArray (/** @type {any} */ argv) { +function argvToArray(argv: { + [key: string]: boolean | null | number | string | (string | number)[] +}): string[] { if (argv['help']) return ['--help'] const result = [] for (const { 0: key, 1: value } of Object.entries(argv)) { @@ -141,25 +138,25 @@ function argvToArray (/** @type {any} */ argv) { } } if (argv['--']) { - result.push('--', ...argv['--']) + result.push('--', ...(argv as any)['--']) } return result } -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const cdxgen = { +export const cdxgen: CliSubcommand = { description: 'Create an SBOM with CycloneDX generator (cdxgen)', - async run (argv_) { - const /** @type {any} */ yargv = { + async run(argv_) { + const yargv = { __proto__: null, - // @ts-ignore - ...yargsParse(argv_, yargsConfig) + ...yargsParse(argv_, yargsConfig) } - const /** @type {string[]} */ unknown = yargv._ + const unknown: string[] = yargv._ const { length: unknownLength } = unknown if (unknownLength) { - console.error(`Unknown argument${unknownLength > 1 ? 's' : ''}: ${yargv._.join(', ')}`) + console.error( + `Unknown argument${unknownLength > 1 ? 's' : ''}: ${yargv._.join(', ')}` + ) process.exitCode = 1 return } diff --git a/src/commands/dependencies.ts b/src/commands/dependencies.ts new file mode 100644 index 00000000..82b01ff0 --- /dev/null +++ b/src/commands/dependencies.ts @@ -0,0 +1,158 @@ +import chalk from 'chalk' +// @ts-ignore +import chalkTable from 'chalk-table' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../utils/api-helpers' +import { printFlagList } from '../utils/formatting' +import { getDefaultKey, setupSdk } from '../utils/sdk' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const dependencies: CliSubcommand = { + description: + 'Search for any dependency that is being used in your organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' dependencies' + + const input = setupCommand(name, dependencies.description, argv, importMeta) + if (input) { + const spinnerText = 'Searching dependencies...' + const spinner = ora(spinnerText).start() + await searchDeps(input, spinner) + } + } +} + +const dependenciesFlags = { + limit: { + type: 'number', + shortFlag: 'l', + default: 50, + description: 'Maximum number of dependencies returned' + }, + offset: { + type: 'number', + shortFlag: 'o', + default: 0, + description: 'Page number' + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + limit: number + offset: number +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags, + ...dependenciesFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + json: outputJson, + markdown: outputMarkdown, + limit, + offset + } = cli.flags + + return { + outputJson, + outputMarkdown, + limit, + offset + } +} + +type DependenciesData = { + data: SocketSdkReturnType<'searchDependencies'>['data'] +} + +async function searchDeps( + { limit, offset, outputJson }: CommandContext, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.searchDependencies({ limit, offset }), + 'Searching dependencies' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('searchDependencies', result, spinner) + return + } + + spinner.stop() + + console.log('Organization dependencies: \n') + + if (outputJson) { + console.log(result.data) + return + } + + const options = { + columns: [ + { field: 'namespace', name: chalk.cyan('Namespace') }, + { field: 'name', name: chalk.cyan('Name') }, + { field: 'version', name: chalk.cyan('Version') }, + { field: 'repository', name: chalk.cyan('Repository') }, + { field: 'branch', name: chalk.cyan('Branch') }, + { field: 'type', name: chalk.cyan('Type') }, + { field: 'direct', name: chalk.cyan('Direct') } + ] + } + + const formattedResults = result.data.rows.map( + (/** @type {{[key:string]: any}} */ d) => { + return { + ...d + } + } + ) + + const table = chalkTable(options, formattedResults) + + console.log(table, '\n') + + return { + data: result.data + } +} diff --git a/src/commands/index.ts b/src/commands/index.ts new file mode 100644 index 00000000..14189294 --- /dev/null +++ b/src/commands/index.ts @@ -0,0 +1,14 @@ +export * from './cdxgen' +export * from './info' +export * from './login' +export * from './logout' +export * from './npm' +export * from './npx' +export * from './raw-npm' +export * from './raw-npx' +export * from './report' +export * from './wrapper' +export * from './scan' +export * from './audit-log' +export * from './repos' +export * from './dependencies' diff --git a/src/commands/info.ts b/src/commands/info.ts new file mode 100644 index 00000000..247e07d2 --- /dev/null +++ b/src/commands/info.ts @@ -0,0 +1,301 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags, validationFlags } from '../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../utils/api-helpers' +import { ChalkOrMarkdown } from '../utils/chalk-markdown' +import { InputError } from '../utils/errors' +import { getSeverityCount, formatSeverityCount } from '../utils/format-issues' +import { printFlagList } from '../utils/formatting' +import { objectSome } from '../utils/misc' +import { FREE_API_KEY, getDefaultKey, setupSdk } from '../utils/sdk' + +import type { SocketIssue } from '../utils/format-issues' +import type { CliSubcommand } from '../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const info: CliSubcommand = { + description: 'Look up info regarding a package', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' info' + + const input = setupCommand(name, info.description, argv, importMeta) + if (input) { + const spinnerText = + input.pkgVersion === 'latest' + ? `Looking up data for the latest version of ${input.pkgName}\n` + : `Looking up data for version ${input.pkgVersion} of ${input.pkgName}\n` + const spinner = ora(spinnerText).start() + const packageData = await fetchPackageData( + input.pkgName, + input.pkgVersion, + input, + spinner + ) + if (packageData) { + formatPackageDataOutput(packageData, { name, ...input }, spinner) + } + } + } +} + +// Internal functions + +interface CommandContext { + includeAllIssues: boolean + outputJson: boolean + outputMarkdown: boolean + pkgName: string + pkgVersion: string + strict: boolean +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): void | CommandContext { + const flags: { [key: string]: any } = { + ...outputFlags, + ...validationFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} webtorrent + $ ${name} webtorrent@1.9.1 + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + all: includeAllIssues, + json: outputJson, + markdown: outputMarkdown, + strict + } = cli.flags + + if (cli.input.length > 1) { + throw new InputError('Only one package lookup supported at once') + } + + const [rawPkgName = ''] = cli.input + + if (!rawPkgName) { + cli.showHelp() + return + } + + const versionSeparator = rawPkgName.lastIndexOf('@') + + const pkgName = + versionSeparator < 1 ? rawPkgName : rawPkgName.slice(0, versionSeparator) + const pkgVersion = + versionSeparator < 1 ? 'latest' : rawPkgName.slice(versionSeparator + 1) + + return { + includeAllIssues, + outputJson, + outputMarkdown, + pkgName, + pkgVersion, + strict + } as CommandContext +} + +interface PackageData { + data: SocketSdkReturnType<'getIssuesByNPMPackage'>['data'] + severityCount: Record + score: SocketSdkReturnType<'getScoreByNPMPackage'>['data'] +} + +async function fetchPackageData( + pkgName: string, + pkgVersion: string, + { includeAllIssues }: Pick, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey() || FREE_API_KEY) + const result = await handleApiCall( + socketSdk.getIssuesByNPMPackage(pkgName, pkgVersion), + 'looking up package' + ) + const scoreResult = await handleApiCall( + socketSdk.getScoreByNPMPackage(pkgName, pkgVersion), + 'looking up package score' + ) + + if (result.success === false) { + return handleUnsuccessfulApiResponse( + 'getIssuesByNPMPackage', + result, + spinner + ) + } + + if (scoreResult.success === false) { + return handleUnsuccessfulApiResponse( + 'getScoreByNPMPackage', + scoreResult, + spinner + ) + } + + const severityCount = getSeverityCount( + result.data, + includeAllIssues ? undefined : 'high' + ) + + return { + data: result.data, + severityCount, + score: scoreResult.data + } +} + +function formatPackageDataOutput( + { data, severityCount, score }: PackageData, + { + name, + outputJson, + outputMarkdown, + pkgName, + pkgVersion, + strict + }: CommandContext & { name: string }, + spinner: Ora +): void { + if (outputJson) { + console.log(JSON.stringify(data, undefined, 2)) + } else { + console.log('\nPackage report card:') + const scoreResult = { + 'Supply Chain Risk': Math.floor(score.supplyChainRisk.score * 100), + Maintenance: Math.floor(score.maintenance.score * 100), + Quality: Math.floor(score.quality.score * 100), + Vulnerabilities: Math.floor(score.vulnerability.score * 100), + License: Math.floor(score.license.score * 100) + } + Object.entries(scoreResult).map(score => + console.log(`- ${score[0]}: ${formatScore(score[1])}`) + ) + + if (objectSome(severityCount)) { + const issueSummary = formatSeverityCount(severityCount) + console.log('\n') + spinner[strict ? 'fail' : 'succeed']( + `Package has these issues: ${issueSummary}` + ) + formatPackageIssuesDetails(data, outputMarkdown) + } else { + console.log('\n') + spinner.succeed('Package has no issues') + } + + const format = new ChalkOrMarkdown(!!outputMarkdown) + const url = `https://socket.dev/npm/package/${pkgName}/overview/${pkgVersion}` + if (pkgVersion === 'latest') { + console.log( + '\nDetailed info on socket.dev: ' + + format.hyperlink(`${pkgName}`, url, { fallbackToUrl: true }) + ) + } else { + console.log( + '\nDetailed info on socket.dev: ' + + format.hyperlink(`${pkgName} v${pkgVersion}`, url, { + fallbackToUrl: true + }) + ) + } + if (!outputMarkdown) { + console.log( + chalk.dim( + '\nOr rerun', + chalk.italic(name), + 'using the', + chalk.italic('--json'), + 'flag to get full JSON output' + ) + ) + } + } + + if (strict && objectSome(severityCount)) { + process.exit(1) + } +} + +function formatPackageIssuesDetails( + packageData: SocketSdkReturnType<'getIssuesByNPMPackage'>['data'], + outputMarkdown: boolean +) { + const issueDetails = packageData.filter( + d => d.value?.severity === 'high' || d.value?.severity === 'critical' + ) + + const uniqueIssues = issueDetails.reduce( + ( + acc: { [key: string]: { count: number; label: string | undefined } }, + issue + ) => { + const { type } = issue + if (type) { + if (acc[type] === undefined) { + acc[type] = { + label: issue.value?.label, + count: 1 + } + } else { + acc[type]!.count += 1 + } + } + return acc + }, + {} + ) + + const format = new ChalkOrMarkdown(!!outputMarkdown) + for (const issue of Object.keys(uniqueIssues)) { + const issueWithLink = format.hyperlink( + `${uniqueIssues[issue]?.label}`, + `https://socket.dev/npm/issue/${issue}`, + { fallbackToUrl: true } + ) + if (uniqueIssues[issue]?.count === 1) { + console.log(`- ${issueWithLink}`) + } else { + console.log(`- ${issueWithLink}: ${uniqueIssues[issue]?.count}`) + } + } +} + +function formatScore(score: number): string { + const error = chalk.hex('#de7c7b') + const warning = chalk.hex('#e59361') + const success = chalk.hex('#a4cb9d') + + if (score > 80) { + return `${success(score)}` + } else if (score < 80 && score > 60) { + return `${warning(score)}` + } + return `${error(score)}` +} diff --git a/src/commands/login.ts b/src/commands/login.ts new file mode 100644 index 00000000..570d0d84 --- /dev/null +++ b/src/commands/login.ts @@ -0,0 +1,153 @@ +import { confirm, password, select } from '@inquirer/prompts' +import isInteractive from 'is-interactive' +import meow from 'meow' +import ora from 'ora' +import terminalLink from 'terminal-link' + +import { AuthError, InputError } from '../utils/errors' +import { printFlagList } from '../utils/formatting' +import { FREE_API_KEY, setupSdk } from '../utils/sdk' +import { getSetting, updateSetting } from '../utils/settings' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' +import type { Separator } from '@inquirer/prompts' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' + +type Choice = { + value: Value + name?: string + description?: string + disabled?: boolean | string + type?: never +} + +type OrgChoice = Choice + +type OrgChoices = (Separator | OrgChoice)[] + +const description = 'Socket API login' + +export const login: CliSubcommand = { + description, + run: async (argv, importMeta, { parentName }) => { + const flags: { [key: string]: any } = { + apiBaseUrl: { + type: 'string', + description: 'API server to connect to for login' + }, + apiProxy: { + type: 'string', + description: 'Proxy to use when making connection to API server' + } + } + + const name = parentName + ' login' + const cli = meow( + ` + Usage + $ ${name} + + Logs into the Socket API by prompting for an API key + + Options + ${printFlagList( + { + 'api-base-url': flags['apiBaseUrl'].description, + 'api-proxy': flags['apiProxy'].description + }, + 8 + )} + + Examples + $ ${name} + `, + { + argv, + description, + importMeta, + flags + } + ) + + if (cli.input.length) cli.showHelp() + + if (!isInteractive()) { + throw new InputError( + 'cannot prompt for credentials in a non-interactive shell' + ) + } + + const apiKey = + (await password({ + message: `Enter your ${terminalLink( + 'Socket.dev API key', + 'https://docs.socket.dev/docs/api-keys' + )} (leave blank for a public key)` + })) || FREE_API_KEY + + let apiBaseUrl = cli.flags['apiBaseUrl'] as string | null | undefined + apiBaseUrl ??= getSetting('apiBaseUrl') ?? undefined + + let apiProxy = cli.flags['apiProxy'] as string | null | undefined + apiProxy ??= getSetting('apiProxy') ?? undefined + + const spinner = ora('Verifying API key...').start() + + let orgs: SocketSdkReturnType<'getOrganizations'>['data'] + + try { + const sdk = await setupSdk(apiKey, apiBaseUrl, apiProxy) + const result = await sdk.getOrganizations() + if (!result.success) throw new AuthError() + orgs = result.data + spinner.succeed('API key verified\n') + } catch (e) { + spinner.fail('Invalid API key') + return + } + + const nonNullish = (value: T | null | undefined): value is T => + value != null + + const enforcedChoices: OrgChoices = Object.values(orgs.organizations) + .filter(nonNullish) + .filter(org => org.plan === 'enterprise') + .map(org => ({ + name: org.name, + value: org.id + })) + + let enforcedOrgs: string[] = [] + + if (enforcedChoices.length > 1) { + const id = await select({ + message: + "Which organization's policies should Socket enforce system-wide?", + choices: enforcedChoices.concat({ + name: 'None', + value: '', + description: 'Pick "None" if this is a personal device' + }) + }) + if (id) enforcedOrgs = [id] + } else if (enforcedChoices.length) { + const confirmOrg = await confirm({ + message: `Should Socket enforce ${(enforcedChoices[0] as OrgChoice)?.name}'s security policies system-wide?`, + default: true + }) + if (confirmOrg) { + const existing = enforcedChoices[0] + if (existing) { + enforcedOrgs = [existing.value] + } + } + } + + updateSetting('enforcedOrgs', enforcedOrgs) + const oldKey = getSetting('apiKey') + updateSetting('apiKey', apiKey) + updateSetting('apiBaseUrl', apiBaseUrl) + updateSetting('apiProxy', apiProxy) + spinner.succeed(`API credentials ${oldKey ? 'updated' : 'set'}`) + } +} diff --git a/lib/commands/logout/index.js b/src/commands/logout.ts similarity index 66% rename from lib/commands/logout/index.js rename to src/commands/logout.ts index 8bbc69f5..8d7f6b90 100644 --- a/lib/commands/logout/index.js +++ b/src/commands/logout.ts @@ -1,16 +1,20 @@ +// @ts-ignore import meow from 'meow' +// @ts-ignore import ora from 'ora' -import { updateSetting } from '../../utils/settings.js' +import { updateSetting } from '../utils/settings' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' const description = 'Socket API logout' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const logout = { +export const logout: CliSubcommand = { description, run: async (argv, importMeta, { parentName }) => { const name = parentName + ' logout' - const cli = meow(` + const cli = meow( + ` Usage $ ${name} @@ -18,11 +22,13 @@ export const logout = { Examples $ ${name} - `, { - argv, - description, - importMeta, - }) + `, + { + argv, + description, + importMeta + } + ) if (cli.input.length) cli.showHelp() diff --git a/lib/commands/npm/index.js b/src/commands/npm.ts similarity index 65% rename from lib/commands/npm/index.js rename to src/commands/npm.ts index ca4c80fa..1f2975a9 100644 --- a/lib/commands/npm/index.js +++ b/src/commands/npm.ts @@ -1,14 +1,16 @@ -import { spawn, execSync } from 'child_process' -import { fileURLToPath } from 'url' +import { spawn, execSync } from 'node:child_process' +import path from 'node:path' +import type { CliSubcommand } from '../utils/meow-with-subcommands' + +const distPath = __dirname const description = 'npm wrapper functionality' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const npm = { +export const npm: CliSubcommand = { description, run: async (argv, _importMeta, _ctx) => { const npmVersion = execSync('npm -v').toString() - const wrapperPath = fileURLToPath(new URL('../../shadow/npm-cli.cjs', import.meta.url)) + const wrapperPath = path.join(distPath, 'npm-cli.js') process.exitCode = 1 spawn(process.execPath, [wrapperPath, ...argv], { stdio: 'inherit', diff --git a/lib/commands/npx/index.js b/src/commands/npx.ts similarity index 65% rename from lib/commands/npx/index.js rename to src/commands/npx.ts index ad5b784b..714dc60d 100644 --- a/lib/commands/npx/index.js +++ b/src/commands/npx.ts @@ -1,13 +1,15 @@ import { spawn } from 'child_process' -import { fileURLToPath } from 'url' +import path from 'node:path' +import type { CliSubcommand } from '../utils/meow-with-subcommands' + +const distPath = __dirname const description = 'npx wrapper functionality' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const npx = { +export const npx: CliSubcommand = { description, run: async (argv, _importMeta, _ctx) => { - const wrapperPath = fileURLToPath(new URL('../../shadow/npx-cli.cjs', import.meta.url)) + const wrapperPath = path.join(distPath, 'npx-cli.js') process.exitCode = 1 spawn(process.execPath, [wrapperPath, ...argv], { stdio: 'inherit' diff --git a/src/commands/raw-npm.ts b/src/commands/raw-npm.ts new file mode 100644 index 00000000..b4179346 --- /dev/null +++ b/src/commands/raw-npm.ts @@ -0,0 +1,61 @@ +import { spawn } from 'node:child_process' + +import meow from 'meow' + +import { validationFlags } from '../flags' +import { printFlagList } from '../utils/formatting' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' + +export const rawNpm: CliSubcommand = { + description: 'Temporarily disable the Socket npm wrapper', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' raw-npm' + + setupCommand(name, rawNpm.description, argv, importMeta) + } +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): void { + const flags: { [key: string]: any } = validationFlags + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} install + `, + { + argv, + description, + importMeta, + flags + } + ) + + if (!argv[0]) { + cli.showHelp() + return + } + + spawn('npm', [argv.join(' ')], { + stdio: 'inherit', + shell: true + }).on('exit', (code, signal) => { + if (signal) { + process.kill(process.pid, signal) + } else if (code !== null) { + process.exit(code) + } + }) +} diff --git a/lib/commands/raw-npx/index.js b/src/commands/raw-npx.ts similarity index 52% rename from lib/commands/raw-npx/index.js rename to src/commands/raw-npx.ts index 56114573..707ad333 100644 --- a/lib/commands/raw-npx/index.js +++ b/src/commands/raw-npx.ts @@ -1,31 +1,32 @@ import { spawn } from 'child_process' +// @ts-ignore import meow from 'meow' -import { validationFlags } from '../../flags/index.js' -import { printFlagList } from '../../utils/formatting.js' +import { validationFlags } from '../flags' +import { printFlagList } from '../utils/formatting' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const rawNpx = { +import type { CliSubcommand } from '../utils/meow-with-subcommands' + +export const rawNpx: CliSubcommand = { description: 'Temporarily disable the Socket npm/npx wrapper', - async run (argv, importMeta, { parentName }) { + async run(argv, importMeta, { parentName }) { const name = parentName + ' raw-npx' setupCommand(name, rawNpx.description, argv, importMeta) } } -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = validationFlags - - const cli = meow(` +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): void { + const flags: { [key: string]: any } = validationFlags + + const cli = meow( + ` Usage $ ${name} @@ -34,12 +35,14 @@ function setupCommand (name, description, argv, importMeta) { Examples $ ${name} install - `, { - argv, - description, - importMeta, - flags - }) + `, + { + argv, + description, + importMeta, + flags + } + ) if (!argv[0]) { cli.showHelp() diff --git a/src/commands/report/create.ts b/src/commands/report/create.ts new file mode 100644 index 00000000..36d745ae --- /dev/null +++ b/src/commands/report/create.ts @@ -0,0 +1,307 @@ +import path from 'node:path' + +import { betterAjvErrors } from '@apideck/better-ajv-errors' +import { readSocketConfig, SocketValidationError } from '@socketsecurity/config' +// @ts-ignore +import meow from 'meow' +// @ts-ignore +import ora from 'ora' +import { ErrorWithCause } from 'pony-cause' + +import { fetchReportData, formatReportDataOutput } from './view' +import { outputFlags, validationFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { ChalkOrMarkdown, logSymbols } from '../../utils/chalk-markdown' +import { InputError } from '../../utils/errors' +import { printFlagList } from '../../utils/formatting' +import { createDebugLogger } from '../../utils/misc' +import { getPackageFiles } from '../../utils/path-resolve' +import { setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketYml } from '@socketsecurity/config' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' + +export const create: CliSubcommand = { + description: 'Create a project report', + async run( + argv: readonly string[], + importMeta: ImportMeta, + { parentName }: { parentName: string } + ) { + const name = parentName + ' create' + + const input = await setupCommand(name, create.description, argv, importMeta) + + if (input) { + const { + config, + cwd, + debugLog, + dryRun, + includeAllIssues, + outputJson, + outputMarkdown, + packagePaths, + strict, + view + } = input + + const result = + input && + (await createReport(packagePaths, { config, cwd, debugLog, dryRun })) + + if (result && view) { + const reportId = result.data.id + const reportData = + input && + (await fetchReportData(reportId, { includeAllIssues, strict })) + + if (reportData) { + formatReportDataOutput(reportData, { + includeAllIssues, + name, + outputJson, + outputMarkdown, + reportId, + strict + }) + } + } else if (result) { + formatReportCreationOutput(result.data, { outputJson, outputMarkdown }) + } + } + } +} + +// Internal functions + +type CommandContext = { + config: SocketYml | undefined + cwd: string + debugLog: typeof console.error + dryRun: boolean + includeAllIssues: boolean + outputJson: boolean + outputMarkdown: boolean + packagePaths: string[] + strict: boolean + view: boolean +} + +async function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): Promise { + const flags: { [key: string]: any } = { + ...outputFlags, + ...validationFlags, + debug: { + type: 'boolean', + shortFlag: 'd', + default: false, + description: 'Output debug information' + }, + dryRun: { + type: 'boolean', + default: false, + description: 'Only output what will be done without actually doing it' + }, + view: { + type: 'boolean', + shortFlag: 'v', + default: false, + description: 'Will wait for and return the created report' + } + } + + const cli = meow( + ` + Usage + $ ${name} + + Uploads the specified "package.json" and lock files for JavaScript, Python, and Go dependency manifests. + If any folder is specified, the ones found in there recursively are uploaded. + + Supports globbing such as "**/package.json", "**/requirements.txt", "**/pyproject.toml", and "**/go.mod". + + Ignores any file specified in your project's ".gitignore", your project's + "socket.yml" file's "projectIgnorePaths" and also has a sensible set of + default ignores from the "ignore-by-default" module. + + Options + ${printFlagList( + { + all: 'Include all issues', + debug: 'Output debug information', + 'dry-run': 'Only output what will be done without actually doing it', + json: 'Output result as json', + markdown: 'Output result as markdown', + strict: 'Exits with an error code if any matching issues are found', + view: 'Will wait for and return the created report' + }, + 6 + )} + + Examples + $ ${name} . + $ ${name} '**/package.json' + $ ${name} /path/to/a/package.json /path/to/another/package.json + $ ${name} . --view --json + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + all: includeAllIssues, + dryRun, + json: outputJson, + markdown: outputMarkdown, + strict, + view + } = cli.flags + + if (!cli.input[0]) { + cli.showHelp() + return + } + + const debugLog = createDebugLogger(!dryRun || (cli.flags['debug'] as boolean)) + + // TODO: Allow setting a custom cwd and/or configFile path? + const cwd = process.cwd() + const absoluteConfigPath = path.join(cwd, 'socket.yml') + + const config = await readSocketConfig(absoluteConfigPath).catch( + (cause: unknown) => { + if ( + cause && + typeof cause === 'object' && + cause instanceof SocketValidationError + ) { + // Inspired by workbox-build: https://github.com/GoogleChrome/workbox/blob/95f97a207fd51efb3f8a653f6e3e58224183a778/packages/workbox-build/src/lib/validate-options.ts#L68-L71 + const betterErrors = betterAjvErrors({ + basePath: 'config', + data: cause.data, + errors: cause.validationErrors, + schema: cause.schema as Parameters< + typeof betterAjvErrors + >[0]['schema'] + }) + throw new InputError( + 'The socket.yml config is not valid', + betterErrors + .map( + err => + `[${err.path}] ${err.message}.${err.suggestion ? err.suggestion : ''}` + ) + .join('\n') + ) + } else { + throw new ErrorWithCause('Failed to read socket.yml config', { cause }) + } + } + ) + + const socketSdk = await setupSdk() + const supportedFiles = await socketSdk + .getReportSupportedFiles() + .then(res => { + if (!res.success) + handleUnsuccessfulApiResponse('getReportSupportedFiles', res, ora()) + return (res as SocketSdkReturnType<'getReportSupportedFiles'>).data + }) + .catch((cause: Error) => { + throw new ErrorWithCause('Failed getting supported files for report', { + cause + }) + }) + + const packagePaths = await getPackageFiles( + cwd, + cli.input, + config, + supportedFiles, + debugLog + ) + + return { + config, + cwd, + debugLog, + dryRun, + includeAllIssues, + outputJson, + outputMarkdown, + packagePaths, + strict, + view + } as CommandContext +} + +async function createReport( + packagePaths: string[], + { + config, + cwd, + debugLog, + dryRun + }: Pick +): Promise> { + debugLog('Uploading:', packagePaths.join(`\n${logSymbols.info} Uploading: `)) + + if (dryRun) { + return + } + + const socketSdk = await setupSdk() + const spinner = ora( + `Creating report with ${packagePaths.length} package files` + ).start() + const apiCall = socketSdk.createReportFromFilePaths( + packagePaths, + cwd, + config?.issueRules + ) + const result = await handleApiCall(apiCall, 'creating report') + + if (result.success === false) { + return handleUnsuccessfulApiResponse('createReport', result, spinner) + } + + // Conclude the status of the API call + + spinner.succeed() + + return result +} + +function formatReportCreationOutput( + data: SocketSdkReturnType<'createReport'>['data'], + { + outputJson, + outputMarkdown + }: Pick +): void { + if (outputJson) { + console.log(JSON.stringify(data, undefined, 2)) + return + } + + const format = new ChalkOrMarkdown(!!outputMarkdown) + + console.log( + '\nNew report: ' + + format.hyperlink(data.id, data.url, { fallbackToUrl: true }) + ) +} diff --git a/lib/commands/report/index.js b/src/commands/report/index.ts similarity index 58% rename from lib/commands/report/index.js rename to src/commands/report/index.ts index c6a1c20c..c25c7b9a 100644 --- a/lib/commands/report/index.js +++ b/src/commands/report/index.ts @@ -1,23 +1,24 @@ -import { create } from './create.js' -import { view } from './view.js' -import { meowWithSubcommands } from '../../utils/meow-with-subcommands.js' +import { create } from './create' +import { view } from './view' +import { meowWithSubcommands } from '../../utils/meow-with-subcommands' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' const description = 'Project report related commands' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const report = { +export const report: CliSubcommand = { description, run: async (argv, importMeta, { parentName }) => { await meowWithSubcommands( { create, - view, + view }, { argv, description, importMeta, - name: parentName + ' report', + name: parentName + ' report' } ) } diff --git a/src/commands/report/view.ts b/src/commands/report/view.ts new file mode 100644 index 00000000..3825446e --- /dev/null +++ b/src/commands/report/view.ts @@ -0,0 +1,215 @@ +// @ts-ignore +import chalk from 'chalk' +// @ts-ignore +import meow from 'meow' +// @ts-ignore +import ora from 'ora' +import { ErrorWithCause } from 'pony-cause' + +import { outputFlags, validationFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { ChalkOrMarkdown } from '../../utils/chalk-markdown' +import { InputError } from '../../utils/errors' +import { + getSeverityCount, + formatSeverityCount +} from '../../utils/format-issues' +import { printFlagList } from '../../utils/formatting' +import { setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { + SocketSdkResultType, + SocketSdkReturnType +} from '@socketsecurity/sdk' + +export const view: CliSubcommand = { + description: 'View a project report', + async run( + argv: readonly string[], + importMeta: ImportMeta, + { parentName }: { parentName: string } + ) { + const name = parentName + ' view' + + const input = setupCommand(name, view.description, argv, importMeta) + const result = input && (await fetchReportData(input.reportId, input)) + + if (result) { + formatReportDataOutput(result, { name, ...input }) + } + } +} + +// Internal functions + +type CommandContext = { + includeAllIssues: boolean + outputJson: boolean + outputMarkdown: boolean + reportId: string + strict: boolean +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): void | CommandContext { + const flags: { [key: string]: any } = { + ...outputFlags, + ...validationFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} QXU8PmK7LfH608RAwfIKdbcHgwEd_ZeWJ9QEGv05FJUQ + `, + { + argv, + description, + importMeta, + flags + } + ) + + // Extract the input + + const { + all: includeAllIssues, + json: outputJson, + markdown: outputMarkdown, + strict + } = cli.flags + + const [reportId, ...extraInput] = cli.input + + if (!reportId) { + cli.showHelp() + return + } + + // Validate the input + + if (extraInput.length) { + throw new InputError( + `Can only handle a single report ID at a time, but got ${cli.input.length} report ID:s: ${cli.input.join(', ')}` + ) + } + + return { + includeAllIssues, + outputJson, + outputMarkdown, + reportId, + strict + } as CommandContext +} +type ReportData = SocketSdkReturnType<'getReport'>['data'] + +const MAX_TIMEOUT_RETRY = 5 + +export async function fetchReportData( + reportId: string, + { + includeAllIssues, + strict + }: Pick +): Promise { + // Do the API call + + const socketSdk = await setupSdk() + const spinner = ora( + `Fetching report with ID ${reportId} (this could take a while)` + ).start() + + let result: SocketSdkResultType<'getReport'> | undefined + for (let retry = 1; !result; ++retry) { + try { + result = await handleApiCall( + socketSdk.getReport(reportId), + 'fetching report' + ) + } catch (err) { + if ( + retry >= MAX_TIMEOUT_RETRY || + !(err instanceof ErrorWithCause) || + err.cause?.cause?.response?.statusCode !== 524 + ) { + throw err + } + } + } + + if (result.success === false) { + return handleUnsuccessfulApiResponse('getReport', result, spinner) + } + + // Conclude the status of the API call + + if (strict) { + if (result.data.healthy) { + spinner.succeed('Report result is healthy and great!') + } else { + spinner.fail('Report result deemed unhealthy for project') + } + } else if (result.data.healthy === false) { + const severityCount = getSeverityCount( + result.data.issues, + includeAllIssues ? undefined : 'high' + ) + const issueSummary = formatSeverityCount(severityCount) + spinner.succeed(`Report has these issues: ${issueSummary}`) + } else { + spinner.succeed('Report has no issues') + } + + return result.data +} + +export function formatReportDataOutput( + data: ReportData, + { + name, + outputJson, + outputMarkdown, + reportId, + strict + }: { name: string } & CommandContext +): void { + if (outputJson) { + console.log(JSON.stringify(data, undefined, 2)) + } else { + const format = new ChalkOrMarkdown(!!outputMarkdown) + console.log( + '\nDetailed info on socket.dev: ' + + format.hyperlink(reportId, data.url, { fallbackToUrl: true }) + ) + if (!outputMarkdown) { + console.log( + chalk.dim( + '\nOr rerun', + chalk.italic(name), + 'using the', + chalk.italic('--json'), + 'flag to get full JSON output' + ) + ) + } + } + + if (strict && data.healthy === false) { + process.exit(1) + } +} diff --git a/src/commands/repos/create.ts b/src/commands/repos/create.ts new file mode 100644 index 00000000..3c1d2e82 --- /dev/null +++ b/src/commands/repos/create.ts @@ -0,0 +1,174 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const create: CliSubcommand = { + description: 'Create a repository in an organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' create' + + const input = setupCommand(name, create.description, argv, importMeta) + if (input) { + const spinnerText = 'Creating repository... \n' + const spinner = ora(spinnerText).start() + await createRepo(input.orgSlug, input, spinner) + } + } +} + +const repositoryCreationFlags: { [key: string]: any } = { + repoName: { + type: 'string', + shortFlag: 'n', + default: '', + description: 'Repository name' + }, + repoDescription: { + type: 'string', + shortFlag: 'd', + default: '', + description: 'Repository description' + }, + homepage: { + type: 'string', + shortFlag: 'h', + default: '', + description: 'Repository url' + }, + defaultBranch: { + type: 'string', + shortFlag: 'b', + default: 'main', + description: 'Repository default branch' + }, + visibility: { + type: 'string', + shortFlag: 'v', + default: 'private', + description: 'Repository visibility (Default Private)' + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + name: string + description: string + homepage: string + default_branch: string + visibility: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags, + ...repositoryCreationFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg --repoName=test-repo + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + json: outputJson, + markdown: outputMarkdown, + repoName, + repoDescription, + homepage, + defaultBranch, + visibility + } = cli.flags + + const [orgSlug = ''] = cli.input + + if (!orgSlug) { + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug \n` + ) + cli.showHelp() + return + } + + if (!repoName) { + console.error( + `${chalk.bgRed('Input error')}: Repository name is required. \n` + ) + cli.showHelp() + return + } + + return { + outputJson, + outputMarkdown, + orgSlug, + name: repoName, + description: repoDescription, + homepage, + default_branch: defaultBranch, + visibility + } +} + +type RepositoryData = { + data: SocketSdkReturnType<'createOrgRepo'>['data'] +} + +async function createRepo( + orgSlug: string, + input: CommandContext, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.createOrgRepo(orgSlug, input), + 'creating repository' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('createOrgRepo', result, spinner) + return + } + + spinner.stop() + + console.log('\n✅ Repository created successfully \n') + + return { + data: result.data + } +} diff --git a/src/commands/repos/delete.ts b/src/commands/repos/delete.ts new file mode 100644 index 00000000..d301fc22 --- /dev/null +++ b/src/commands/repos/delete.ts @@ -0,0 +1,100 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const del: CliSubcommand = { + description: 'Delete a repository in an organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' del' + + const input = setupCommand(name, del.description, argv, importMeta) + if (input) { + const spinnerText = 'Deleting repository... \n' + const spinner = ora(spinnerText).start() + await deleteRepository(input.orgSlug, input.repoName, spinner) + } + } +} + +// Internal functions + +type CommandContext = { + orgSlug: string + repoName: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const cli = meow( + ` + Usage + $ ${name} + + Examples + $ ${name} FakeOrg test-repo + `, + { + argv, + description, + importMeta + } + ) + + const { 0: orgSlug = '', 1: repoName = '' } = cli.input + + if (!orgSlug || !repoName) { + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug and repository slug \n` + ) + cli.showHelp() + return + } + + return { + orgSlug, + repoName + } +} + +type RepositoryData = { + data: SocketSdkReturnType<'deleteOrgRepo'>['data'] +} + +async function deleteRepository( + orgSlug: string, + repoName: string, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.deleteOrgRepo(orgSlug, repoName), + 'deleting repository' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('deleteOrgRepo', result, spinner) + return + } + + spinner.stop() + + console.log('\n✅ Repository deleted successfully \n') + + return { + data: result.data + } +} diff --git a/lib/commands/repos/index.js b/src/commands/repos/index.ts similarity index 54% rename from lib/commands/repos/index.js rename to src/commands/repos/index.ts index 719b0b6c..cff65c33 100644 --- a/lib/commands/repos/index.js +++ b/src/commands/repos/index.ts @@ -1,14 +1,15 @@ -import { create } from './create.js' -import { del } from './delete.js' -import { list } from './list.js' -import { update } from './update.js' -import { view } from './view.js' -import { meowWithSubcommands } from '../../utils/meow-with-subcommands.js' +import { create } from './create' +import { del } from './delete' +import { list } from './list' +import { update } from './update' +import { view } from './view' +import { meowWithSubcommands } from '../../utils/meow-with-subcommands' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' const description = 'Repositories related commands' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const repo = { +export const repo: CliSubcommand = { description, run: async (argv, importMeta, { parentName }) => { await meowWithSubcommands( @@ -23,7 +24,7 @@ export const repo = { argv, description, importMeta, - name: parentName + ' repo', + name: `${parentName} repo` } ) } diff --git a/lib/commands/repos/list.js b/src/commands/repos/list.ts similarity index 51% rename from lib/commands/repos/list.js rename to src/commands/repos/list.ts index 45f80aa4..ba7239dc 100644 --- a/lib/commands/repos/list.js +++ b/src/commands/repos/list.ts @@ -1,21 +1,24 @@ -/* eslint-disable no-console */ - import chalk from 'chalk' // @ts-ignore import chalkTable from 'chalk-table' import meow from 'meow' import ora from 'ora' -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const list = { +export const list: CliSubcommand = { description: 'List repositories in an organization', - async run (argv, importMeta, { parentName }) { + async run(argv, importMeta, { parentName }) { const name = parentName + ' list' const input = setupCommand(name, list.description, argv, importMeta) @@ -27,17 +30,17 @@ export const list = { } } -const listRepoFlags = prepareFlags({ +const listRepoFlags: { [key: string]: any } = { sort: { type: 'string', shortFlag: 's', default: 'created_at', - description: 'Sorting option', + description: 'Sorting option' }, direction: { type: 'string', default: 'desc', - description: 'Direction option', + description: 'Direction option' }, perPage: { type: 'number', @@ -50,36 +53,34 @@ const listRepoFlags = prepareFlags({ shortFlag: 'p', default: 1, description: 'Page number' - }, -}) + } +} // Internal functions -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} sort - * @property {string} direction - * @property {number} per_page - * @property {number} page - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + sort: string + direction: string + per_page: number + page: number +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { ...outputFlags, ...listRepoFlags } - const cli = meow(` + const cli = meow( + ` Usage $ ${name} @@ -88,12 +89,14 @@ function setupCommand (name, description, argv, importMeta) { Examples $ ${name} FakeOrg - `, { - argv, - description, - importMeta, - flags - }) + `, + { + argv, + description, + importMeta, + flags + } + ) const { json: outputJson, @@ -105,14 +108,16 @@ function setupCommand (name, description, argv, importMeta) { } = cli.flags if (!cli.input[0]) { - console.error(`${chalk.bgRed('Input error')}: Please provide an organization slug \n`) + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug \n` + ) cli.showHelp() return } - const [orgSlug = ''] = cli.input + const { 0: orgSlug = '' } = cli.input - return { + return { outputJson, outputMarkdown, orgSlug, @@ -123,23 +128,24 @@ function setupCommand (name, description, argv, importMeta) { } } -/** - * @typedef RepositoryData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrgRepoList'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {CommandContext} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function listOrgRepos (orgSlug, input, spinner) { +type RepositoryData = { + data: SocketSdkReturnType<'getOrgRepoList'>['data'] +} + +async function listOrgRepos( + orgSlug: string, + input: CommandContext, + spinner: Ora +): Promise { const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.getOrgRepoList(orgSlug, input), 'listing repositories') + const result = await handleApiCall( + socketSdk.getOrgRepoList(orgSlug, input), + 'listing repositories' + ) if (!result.success) { - return handleUnsuccessfulApiResponse('getOrgRepoList', result, spinner) + handleUnsuccessfulApiResponse('getOrgRepoList', result, spinner) + return } spinner.stop() @@ -164,7 +170,7 @@ async function listOrgRepos (orgSlug, input, spinner) { console.log(table, '\n') - return { + return { data: result.data } } diff --git a/src/commands/repos/update.ts b/src/commands/repos/update.ts new file mode 100644 index 00000000..4ea0c637 --- /dev/null +++ b/src/commands/repos/update.ts @@ -0,0 +1,174 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const update: CliSubcommand = { + description: 'Update a repository in an organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' update' + + const input = setupCommand(name, update.description, argv, importMeta) + if (input) { + const spinnerText = 'Updating repository... \n' + const spinner = ora(spinnerText).start() + await updateRepository(input.orgSlug, input, spinner) + } + } +} + +const repositoryUpdateFlags: { [key: string]: any } = { + repoName: { + type: 'string', + shortFlag: 'n', + default: '', + description: 'Repository name' + }, + repoDescription: { + type: 'string', + shortFlag: 'd', + default: '', + description: 'Repository description' + }, + homepage: { + type: 'string', + shortFlag: 'h', + default: '', + description: 'Repository url' + }, + defaultBranch: { + type: 'string', + shortFlag: 'b', + default: 'main', + description: 'Repository default branch' + }, + visibility: { + type: 'string', + shortFlag: 'v', + default: 'private', + description: 'Repository visibility (Default Private)' + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + name: string + description: string + homepage: string + default_branch: string + visibility: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags, + ...repositoryUpdateFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { + json: outputJson, + markdown: outputMarkdown, + repoName, + repoDescription, + homepage, + defaultBranch, + visibility + } = cli.flags + + const [orgSlug = ''] = cli.input + + if (!orgSlug) { + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug and repository name \n` + ) + cli.showHelp() + return + } + + if (!repoName) { + console.error( + `${chalk.bgRed('Input error')}: Repository name is required. \n` + ) + cli.showHelp() + return + } + + return { + outputJson, + outputMarkdown, + orgSlug, + name: repoName, + description: repoDescription, + homepage, + default_branch: defaultBranch, + visibility + } +} + +type RepositoryData = { + data: SocketSdkReturnType<'updateOrgRepo'>['data'] +} + +async function updateRepository( + orgSlug: string, + input: CommandContext, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.updateOrgRepo(orgSlug, input.name, input), + 'updating repository' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('updateOrgRepo', result, spinner) + return + } + + spinner.stop() + + console.log('\n✅ Repository updated successfully \n') + + return { + data: result.data + } +} diff --git a/src/commands/repos/view.ts b/src/commands/repos/view.ts new file mode 100644 index 00000000..8878cd9f --- /dev/null +++ b/src/commands/repos/view.ts @@ -0,0 +1,132 @@ +import chalk from 'chalk' +// @ts-ignore +import chalkTable from 'chalk-table' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const view: CliSubcommand = { + description: 'View repositories in an organization', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' view' + + const input = setupCommand(name, view.description, argv, importMeta) + if (input) { + const spinnerText = 'Fetching repository... \n' + const spinner = ora(spinnerText).start() + await viewRepository(input.orgSlug, input.repositoryName, spinner) + } + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + repositoryName: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { json: outputJson, markdown: outputMarkdown } = cli.flags + + if (!cli.input[0]) { + console.error( + `${chalk.bgRed('Input error')}: Please provide an organization slug and repository name \n` + ) + cli.showHelp() + return + } + + const { 0: orgSlug = '', 1: repositoryName = '' } = cli.input + + return { + outputJson, + outputMarkdown, + orgSlug, + repositoryName + } +} + +type RepositoryData = { + data: SocketSdkReturnType<'getOrgRepo'>['data'] +} + +async function viewRepository( + orgSlug: string, + repoName: string, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.getOrgRepo(orgSlug, repoName), + 'fetching repository' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('getOrgRepo', result, spinner) + return + } + + spinner.stop() + + const options = { + columns: [ + { field: 'id', name: chalk.magenta('ID') }, + { field: 'name', name: chalk.magenta('Name') }, + { field: 'visibility', name: chalk.magenta('Visibility') }, + { field: 'default_branch', name: chalk.magenta('Default branch') }, + { field: 'homepage', name: chalk.magenta('Homepage') }, + { field: 'archived', name: chalk.magenta('Archived') }, + { field: 'created_at', name: chalk.magenta('Created at') } + ] + } + + const table = chalkTable(options, [result.data]) + + console.log(table, '\n') + + return { + data: result.data + } +} diff --git a/lib/commands/scan/create.js b/src/commands/scan/create.ts similarity index 50% rename from lib/commands/scan/create.js rename to src/commands/scan/create.ts index 09093213..a708b355 100644 --- a/lib/commands/scan/create.js +++ b/src/commands/scan/create.ts @@ -1,5 +1,3 @@ -/* eslint-disable no-console */ - import { stdin as inputText, stdout as output } from 'node:process' import * as readline from 'node:readline/promises' @@ -9,17 +7,22 @@ import open from 'open' import ora from 'ora' import { ErrorWithCause } from 'pony-cause' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { createDebugLogger } from '../../utils/misc.js' -import { getPackageFilesFullScans } from '../../utils/path-resolve.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { createDebugLogger } from '../../utils/misc' +import { getPackageFilesFullScans } from '../../utils/path-resolve' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const create = { +export const create: CliSubcommand = { description: 'Create a scan', - async run (argv, importMeta, { parentName }) { + async run(argv, importMeta, { parentName }) { const name = parentName + ' create' const input = await setupCommand(name, create.description, argv, importMeta) @@ -32,92 +35,90 @@ export const create = { } } -const createFullScanFlags = prepareFlags({ +const createFullScanFlags: { [key: string]: any } = { repo: { type: 'string', shortFlag: 'r', default: '', - description: 'Repository name', + description: 'Repository name' }, branch: { type: 'string', shortFlag: 'b', default: '', - description: 'Branch name', + description: 'Branch name' }, commitMessage: { type: 'string', shortFlag: 'm', default: '', - description: 'Commit message', + description: 'Commit message' }, commitHash: { type: 'string', shortFlag: 'ch', default: '', - description: 'Commit hash', + description: 'Commit hash' }, pullRequest: { type: 'number', shortFlag: 'pr', - description: 'Commit hash', + description: 'Commit hash' }, committers: { type: 'string', shortFlag: 'c', default: '', - description: 'Committers', + description: 'Committers' }, defaultBranch: { type: 'boolean', shortFlag: 'db', default: false, - description: 'Make default branch', + description: 'Make default branch' }, pendingHead: { type: 'boolean', shortFlag: 'ph', default: false, - description: 'Set as pending head', + description: 'Set as pending head' }, tmp: { type: 'boolean', shortFlag: 't', default: false, - description: 'Set the visibility (true/false) of the scan in your dashboard', + description: 'Set the visibility (true/false) of the scan in your dashboard' } -}) +} // Internal functions -/** - * @typedef CommandContext - * @property {string} orgSlug - * @property {string} repoName - * @property {string} branchName - * @property {string} committers - * @property {string} commitMessage - * @property {string} commitHash - * @property {number | undefined} pullRequest - * @property {boolean} defaultBranch - * @property {boolean} pendingHead - * @property {boolean} tmp - * @property {string[]} packagePaths - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {Promise} - */ -async function setupCommand (name, description, argv, importMeta) { - const flags = { +type CommandContext = { + orgSlug: string + repoName: string + branchName: string + committers: string + commitMessage: string + commitHash: string + pullRequest: number | undefined + defaultBranch: boolean + pendingHead: boolean + tmp: boolean + packagePaths: string[] +} + +async function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): Promise { + const flags: { [key: string]: any } = { ...createFullScanFlags } - const cli = meow(` + const cli = meow( + ` Usage $ ${name} [...options] @@ -126,12 +127,14 @@ async function setupCommand (name, description, argv, importMeta) { Examples $ ${name} --org=FakeOrg --repo=test-repo --branch=main ./package.json - `, { - argv, - description, - importMeta, - flags - }) + `, + { + argv, + description, + importMeta, + flags + } + ) const { repo: repoName, @@ -150,24 +153,35 @@ async function setupCommand (name, description, argv, importMeta) { return } - const [orgSlug = ''] = cli.input + const { 0: orgSlug = '' } = cli.input const cwd = process.cwd() const socketSdk = await setupSdk() - const supportedFiles = await socketSdk.getReportSupportedFiles() - .then(res => { - if (!res.success) handleUnsuccessfulApiResponse('getReportSupportedFiles', res, ora()) - return res.data - }).catch( - /** @type {(cause: Error) => never} */ - (cause) => { - throw new ErrorWithCause('Failed getting supported files for report', { cause }) + const supportedFiles = await socketSdk + .getReportSupportedFiles() + .then(res => { + if (!res.success) + handleUnsuccessfulApiResponse('getReportSupportedFiles', res, ora()) + return (res as any).data }) + .catch( + /** @type {(cause: Error) => never} */ + cause => { + throw new ErrorWithCause('Failed getting supported files for report', { + cause + }) + } + ) const debugLog = createDebugLogger(false) - const packagePaths = await getPackageFilesFullScans(cwd, cli.input, supportedFiles, debugLog) + const packagePaths = await getPackageFilesFullScans( + cwd, + cli.input, + supportedFiles, + debugLog + ) if (!repoName || !branchName || !packagePaths.length) { - console.error(`${chalk.bgRed('Input error')}: Please provide the required fields: \n + console.error(`${chalk.bgRed('Input error')}: Please provide the required fields: \n - Repository name using --repo, \n - Branch name using --branch \n - At least one file path (e.g. ./package.json) .\n`) @@ -175,7 +189,7 @@ async function setupCommand (name, description, argv, importMeta) { return } - return { + return { orgSlug, repoName, branchName, @@ -190,17 +204,14 @@ async function setupCommand (name, description, argv, importMeta) { } } -/** - * @typedef FullScanData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'CreateOrgFullScan'>["data"]} data - */ - -/** - * @param {CommandContext} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function createFullScan (input, spinner) { +type FullScanData = { + data: SocketSdkReturnType<'CreateOrgFullScan'>['data'] +} + +async function createFullScan( + input: CommandContext, + spinner: Ora +): Promise { const socketSdk = await setupSdk(getDefaultKey()) const { orgSlug, @@ -213,17 +224,25 @@ async function createFullScan (input, spinner) { packagePaths } = input - const result = await handleApiCall(socketSdk.createOrgFullScan(orgSlug, { - repo: repoName, - branch: branchName, - commit_message: commitMessage, - make_default_branch: defaultBranch, - set_as_pending_head: pendingHead, - tmp - }, packagePaths), 'Creating scan') + const result = await handleApiCall( + socketSdk.createOrgFullScan( + orgSlug, + { + repo: repoName, + branch: branchName, + commit_message: commitMessage, + make_default_branch: defaultBranch, + set_as_pending_head: pendingHead, + tmp + }, + packagePaths + ), + 'Creating scan' + ) if (!result.success) { - return handleUnsuccessfulApiResponse('CreateOrgFullScan', result, spinner) + handleUnsuccessfulApiResponse('CreateOrgFullScan', result, spinner) + return } spinner.stop() @@ -233,9 +252,13 @@ async function createFullScan (input, spinner) { const rl = readline.createInterface({ input: inputText, output }) - const answer = await rl.question('Would you like to open it in your browser? (y/n) ') + const answer = await rl.question( + 'Would you like to open it in your browser? (y/n) ' + ) - answer.toLowerCase() === 'y' && open(`${result.data.html_report_url}`) + if (answer.toLowerCase() === 'y') { + await open(`${result.data.html_report_url}`) + } rl.close() diff --git a/src/commands/scan/delete.ts b/src/commands/scan/delete.ts new file mode 100644 index 00000000..9a2aa53b --- /dev/null +++ b/src/commands/scan/delete.ts @@ -0,0 +1,116 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const del: CliSubcommand = { + description: 'Delete a scan', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' del' + + const input = setupCommand(name, del.description, argv, importMeta) + if (input) { + const spinnerText = 'Deleting scan...' + const spinner = ora(spinnerText).start() + await deleteOrgFullScan(input.orgSlug, input.fullScanId, spinner) + } + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + fullScanId: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { json: outputJson, markdown: outputMarkdown } = cli.flags + + if (cli.input.length < 2) { + console.error( + `${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n` + ) + cli.showHelp() + return + } + + const { 0: orgSlug = '', 1: fullScanId = '' } = cli.input + + return { + outputJson, + outputMarkdown, + orgSlug, + fullScanId + } +} + +type FullScanData = { + data: SocketSdkReturnType<'deleteOrgFullScan'>['data'] +} + +async function deleteOrgFullScan( + orgSlug: string, + fullScanId: string, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.deleteOrgFullScan(orgSlug, fullScanId), + 'Deleting scan' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('deleteOrgFullScan', result, spinner) + return + } + + console.log('\n ✅ Scan deleted successfully. \n') + + spinner.stop() + + return { + data: result.data + } +} diff --git a/lib/commands/scan/index.js b/src/commands/scan/index.ts similarity index 54% rename from lib/commands/scan/index.js rename to src/commands/scan/index.ts index 916aac09..8daeebda 100644 --- a/lib/commands/scan/index.js +++ b/src/commands/scan/index.ts @@ -1,14 +1,15 @@ -import { create } from './create.js' -import { del } from './delete.js' -import { list } from './list.js' -import { metadata } from './metadata.js' -import { stream } from './stream.js' -import { meowWithSubcommands } from '../../utils/meow-with-subcommands.js' +import { create } from './create' +import { del } from './delete' +import { list } from './list' +import { metadata } from './metadata' +import { stream } from './stream' +import { meowWithSubcommands } from '../../utils/meow-with-subcommands' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' const description = 'Scans related commands' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const scan = { +export const scan: CliSubcommand = { description, run: async (argv, importMeta, { parentName }) => { await meowWithSubcommands( @@ -23,7 +24,7 @@ export const scan = { argv, description, importMeta, - name: parentName + ' scan', + name: parentName + ' scan' } ) } diff --git a/lib/commands/scan/list.js b/src/commands/scan/list.ts similarity index 50% rename from lib/commands/scan/list.js rename to src/commands/scan/list.ts index 857156e6..0a6c66ca 100644 --- a/lib/commands/scan/list.js +++ b/src/commands/scan/list.ts @@ -1,21 +1,24 @@ -/* eslint-disable no-console */ - import chalk from 'chalk' // @ts-ignore import chalkTable from 'chalk-table' import meow from 'meow' import ora from 'ora' -import { outputFlags } from '../../flags/index.js' -import { handleApiCall, handleUnsuccessfulApiResponse } from '../../utils/api-helpers.js' -import { prepareFlags } from '../../utils/flags.js' -import { printFlagList } from '../../utils/formatting.js' -import { getDefaultKey, setupSdk } from '../../utils/sdk.js' +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const list = { +export const list: CliSubcommand = { description: 'List scans for an organization', - async run (argv, importMeta, { parentName }) { + async run(argv, importMeta, { parentName }) { const name = parentName + ' list' const input = setupCommand(name, list.description, argv, importMeta) @@ -27,74 +30,73 @@ export const list = { } } -const listFullScanFlags = prepareFlags({ +const listFullScanFlags: { [key: string]: any } = { sort: { type: 'string', shortFlag: 's', default: 'created_at', - description: 'Sorting option (`name` or `created_at`) - default is `created_at`', + description: + 'Sorting option (`name` or `created_at`) - default is `created_at`' }, direction: { type: 'string', shortFlag: 'd', default: 'desc', - description: 'Direction option (`desc` or `asc`) - Default is `desc`', + description: 'Direction option (`desc` or `asc`) - Default is `desc`' }, perPage: { type: 'number', shortFlag: 'pp', default: 30, - description: 'Results per page - Default is 30', + description: 'Results per page - Default is 30' }, page: { type: 'number', shortFlag: 'p', default: 1, - description: 'Page number - Default is 1', + description: 'Page number - Default is 1' }, fromTime: { type: 'string', shortFlag: 'f', default: '', - description: 'From time - as a unix timestamp', + description: 'From time - as a unix timestamp' }, untilTime: { type: 'string', shortFlag: 'u', default: '', - description: 'Until time - as a unix timestamp', + description: 'Until time - as a unix timestamp' } -}) +} // Internal functions -/** - * @typedef CommandContext - * @property {boolean} outputJson - * @property {boolean} outputMarkdown - * @property {string} orgSlug - * @property {string} sort - * @property {string} direction - * @property {number} per_page - * @property {number} page - * @property {string} from_time - * @property {string} until_time - */ - -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void|CommandContext} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = { +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + sort: string + direction: string + per_page: number + page: number + from_time: string + until_time: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { ...outputFlags, ...listFullScanFlags } - const cli = meow(` + const cli = meow( + ` Usage $ ${name} @@ -103,12 +105,14 @@ function setupCommand (name, description, argv, importMeta) { Examples $ ${name} FakeOrg - `, { - argv, - description, - importMeta, - flags - }) + `, + { + argv, + description, + importMeta, + flags + } + ) const { json: outputJson, @@ -122,14 +126,16 @@ function setupCommand (name, description, argv, importMeta) { } = cli.flags if (!cli.input[0]) { - console.error(`${chalk.bgRed('Input error')}: Please specify an organization slug.\n`) + console.error( + `${chalk.bgRed('Input error')}: Please specify an organization slug.\n` + ) cli.showHelp() return } - const [orgSlug = ''] = cli.input + const { 0: orgSlug = '' } = cli.input - return { + return { outputJson, outputMarkdown, orgSlug, @@ -142,23 +148,24 @@ function setupCommand (name, description, argv, importMeta) { } } -/** - * @typedef FullScansData - * @property {import('@socketsecurity/sdk').SocketSdkReturnType<'getOrgFullScanList'>["data"]} data - */ - -/** - * @param {string} orgSlug - * @param {CommandContext} input - * @param {import('ora').Ora} spinner - * @returns {Promise} - */ -async function listOrgFullScan (orgSlug, input, spinner) { +type FullScansData = { + data: SocketSdkReturnType<'getOrgFullScanList'>['data'] +} + +async function listOrgFullScan( + orgSlug: string, + input: CommandContext, + spinner: Ora +): Promise { const socketSdk = await setupSdk(getDefaultKey()) - const result = await handleApiCall(socketSdk.getOrgFullScanList(orgSlug, input), 'Listing scans') + const result = await handleApiCall( + socketSdk.getOrgFullScanList(orgSlug, input), + 'Listing scans' + ) if (!result.success) { - return handleUnsuccessfulApiResponse('getOrgFullScanList', result, spinner) + handleUnsuccessfulApiResponse('getOrgFullScanList', result, spinner) + return } spinner.stop() @@ -177,7 +184,13 @@ async function listOrgFullScan (orgSlug, input, spinner) { return { id: d.id, report_url: chalk.underline(`${d.html_report_url}`), - created_at: d.created_at ? new Date(d.created_at).toLocaleDateString('en-us', { year: 'numeric', month: 'numeric', day: 'numeric' }) : '', + created_at: d.created_at + ? new Date(d.created_at).toLocaleDateString('en-us', { + year: 'numeric', + month: 'numeric', + day: 'numeric' + }) + : '', branch: d.branch } }) @@ -186,7 +199,7 @@ async function listOrgFullScan (orgSlug, input, spinner) { console.log(table, '\n') - return { + return { data: result.data } } diff --git a/src/commands/scan/metadata.ts b/src/commands/scan/metadata.ts new file mode 100644 index 00000000..11a828f3 --- /dev/null +++ b/src/commands/scan/metadata.ts @@ -0,0 +1,116 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const metadata: CliSubcommand = { + description: "Get a scan's metadata", + async run(argv, importMeta, { parentName }) { + const name = parentName + ' metadata' + + const input = setupCommand(name, metadata.description, argv, importMeta) + if (input) { + const spinnerText = "Getting scan's metadata... \n" + const spinner = ora(spinnerText).start() + await getOrgScanMetadata(input.orgSlug, input.scanID, spinner) + } + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + scanID: string +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { json: outputJson, markdown: outputMarkdown } = cli.flags + + if (cli.input.length < 2) { + console.error( + `${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n` + ) + cli.showHelp() + return + } + + const { 0: orgSlug = '', 1: scanID = '' } = cli.input + + return { + outputJson, + outputMarkdown, + orgSlug, + scanID + } +} + +type FullScansData = { + data: SocketSdkReturnType<'getOrgFullScanMetadata'>['data'] +} + +async function getOrgScanMetadata( + orgSlug: string, + scanId: string, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.getOrgFullScanMetadata(orgSlug, scanId), + 'Listing scans' + ) + + if (!result.success) { + handleUnsuccessfulApiResponse('getOrgFullScanMetadata', result, spinner) + return + } + spinner.stop() + + console.log('\nScan metadata: \n') + console.log(result.data) + + return { + data: result.data + } +} diff --git a/src/commands/scan/stream.ts b/src/commands/scan/stream.ts new file mode 100644 index 00000000..b77abf80 --- /dev/null +++ b/src/commands/scan/stream.ts @@ -0,0 +1,123 @@ +import chalk from 'chalk' +import meow from 'meow' +import ora from 'ora' + +import { outputFlags } from '../../flags' +import { + handleApiCall, + handleUnsuccessfulApiResponse +} from '../../utils/api-helpers' +import { printFlagList } from '../../utils/formatting' +import { getDefaultKey, setupSdk } from '../../utils/sdk' + +import type { CliSubcommand } from '../../utils/meow-with-subcommands' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export const stream: CliSubcommand = { + description: 'Stream the output of a scan', + async run(argv, importMeta, { parentName }) { + const name = parentName + ' stream' + + const input = setupCommand(name, stream.description, argv, importMeta) + if (input) { + const spinnerText = 'Streaming scan... \n' + const spinner = ora(spinnerText).start() + await getOrgFullScan(input.orgSlug, input.fullScanId, input.file, spinner) + } + } +} + +// Internal functions + +type CommandContext = { + outputJson: boolean + outputMarkdown: boolean + orgSlug: string + fullScanId: string + file: string | undefined +} + +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): CommandContext | undefined { + const flags: { [key: string]: any } = { + ...outputFlags + } + + const cli = meow( + ` + Usage + $ ${name} + + Options + ${printFlagList(flags, 6)} + + Examples + $ ${name} FakeOrg 000aaaa1-0000-0a0a-00a0-00a0000000a0 ./stream.txt + `, + { + argv, + description, + importMeta, + flags + } + ) + + const { json: outputJson, markdown: outputMarkdown } = cli.flags + + if (cli.input.length < 2) { + console.error( + `${chalk.bgRed('Input error')}: Please specify an organization slug and a scan ID.\n` + ) + cli.showHelp() + return + } + + const { 0: orgSlug = '', 1: fullScanId = '', 2: file } = cli.input + + return { + outputJson, + outputMarkdown, + orgSlug, + fullScanId, + file + } +} + +type FullScanData = { + data: SocketSdkReturnType<'getOrgFullScan'>['data'] +} + +async function getOrgFullScan( + orgSlug: string, + fullScanId: string, + file: string | undefined, + spinner: Ora +): Promise { + const socketSdk = await setupSdk(getDefaultKey()) + const result = await handleApiCall( + socketSdk.getOrgFullScan(orgSlug, fullScanId, file), + 'Streaming a scan' + ) + + if (!result?.success) { + handleUnsuccessfulApiResponse('getOrgFullScan', result, spinner) + return + } + + spinner.stop() + + console.log( + file + ? `\nFull scan details written to ${file} \n` + : '\nFull scan details: \n' + ) + + return { + data: result.data + } +} diff --git a/lib/commands/wrapper/index.js b/src/commands/wrapper.ts similarity index 50% rename from lib/commands/wrapper/index.js rename to src/commands/wrapper.ts index 422b7392..78cdd81a 100644 --- a/lib/commands/wrapper/index.js +++ b/src/commands/wrapper.ts @@ -1,37 +1,40 @@ -/* eslint-disable no-console */ -import fs from 'fs' -import homedir from 'os' -import readline from 'readline' +import fs from 'node:fs' +import homedir from 'node:os' +import readline from 'node:readline' import meow from 'meow' -import { commandFlags } from '../../flags/index.js' -import { printFlagList } from '../../utils/formatting.js' +import { commandFlags } from '../flags' +import { printFlagList } from '../utils/formatting' + +import type { CliSubcommand } from '../utils/meow-with-subcommands' const BASH_FILE = `${homedir.homedir()}/.bashrc` const ZSH_BASH_FILE = `${homedir.homedir()}/.zshrc` -/** @type {import('../../utils/meow-with-subcommands.js').CliSubcommand} */ -export const wrapper = { +export const wrapper: CliSubcommand = { description: 'Enable or disable the Socket npm/npx wrapper', - async run (argv, importMeta, { parentName }) { + async run( + argv: readonly string[], + importMeta: ImportMeta, + { parentName }: { parentName: string } + ) { const name = parentName + ' wrapper' setupCommand(name, wrapper.description, argv, importMeta) } } -/** - * @param {string} name - * @param {string} description - * @param {readonly string[]} argv - * @param {ImportMeta} importMeta - * @returns {void} - */ -function setupCommand (name, description, argv, importMeta) { - const flags = commandFlags - - const cli = meow(` +function setupCommand( + name: string, + description: string, + argv: readonly string[], + importMeta: ImportMeta +): void { + const flags: { [key: string]: any } = commandFlags + + const cli = meow( + ` Usage $ ${name} @@ -41,18 +44,22 @@ function setupCommand (name, description, argv, importMeta) { Examples $ ${name} --enable $ ${name} --disable - `, { - argv, - description, - importMeta, - flags - }) + `, + { + argv, + description, + importMeta, + flags + } + ) const { enable, disable } = cli.flags if (argv[0] === '--postinstall') { - // Check if the wrapper is already enabled before showing the postinstall prompt - const socketWrapperEnabled = (fs.existsSync(BASH_FILE) && checkSocketWrapperAlreadySetup(BASH_FILE)) || (fs.existsSync(ZSH_BASH_FILE) && checkSocketWrapperAlreadySetup(ZSH_BASH_FILE)) + const socketWrapperEnabled = + (fs.existsSync(BASH_FILE) && checkSocketWrapperAlreadySetup(BASH_FILE)) || + (fs.existsSync(ZSH_BASH_FILE) && + checkSocketWrapperAlreadySetup(ZSH_BASH_FILE)) if (!socketWrapperEnabled) { installSafeNpm(`The Socket CLI is now successfully installed! 🎉 @@ -71,14 +78,14 @@ function setupCommand (name, description, argv, importMeta) { } if (enable) { - if (fs.existsSync(BASH_FILE)) { - const socketWrapperEnabled = checkSocketWrapperAlreadySetup(BASH_FILE) - !socketWrapperEnabled && addAlias(BASH_FILE) - } - if (fs.existsSync(ZSH_BASH_FILE)) { - const socketWrapperEnabled = checkSocketWrapperAlreadySetup(ZSH_BASH_FILE) - !socketWrapperEnabled && addAlias(ZSH_BASH_FILE) - } + if (fs.existsSync(BASH_FILE)) { + const socketWrapperEnabled = checkSocketWrapperAlreadySetup(BASH_FILE) + !socketWrapperEnabled && addAlias(BASH_FILE) + } + if (fs.existsSync(ZSH_BASH_FILE)) { + const socketWrapperEnabled = checkSocketWrapperAlreadySetup(ZSH_BASH_FILE) + !socketWrapperEnabled && addAlias(ZSH_BASH_FILE) + } } else if (disable) { if (fs.existsSync(BASH_FILE)) { removeAlias(BASH_FILE) @@ -88,16 +95,14 @@ function setupCommand (name, description, argv, importMeta) { } } if (!fs.existsSync(BASH_FILE) && !fs.existsSync(ZSH_BASH_FILE)) { - console.error('There was an issue setting up the alias in your bash profile') + console.error( + 'There was an issue setting up the alias in your bash profile' + ) } return } -/** - * @param {string} query - * @returns {void} - */ -const installSafeNpm = (query) => { +const installSafeNpm = (query: string): void => { console.log(` _____ _ _ | __|___ ___| |_ ___| |_ @@ -108,18 +113,13 @@ const installSafeNpm = (query) => { const rl = readline.createInterface({ input: process.stdin, - output: process.stdout, + output: process.stdout }) return askQuestion(rl, query) } -/** - * @param {any} rl - * @param {string} query - * @returns {void} - */ -const askQuestion = (rl, query) => { - rl.question(query, (/** @type {string} */ ans) => { +const askQuestion = (rl: readline.Interface, query: string): void => { + rl.question(query, (ans: string) => { if (ans.toLowerCase() === 'y') { try { if (fs.existsSync(BASH_FILE)) { @@ -133,40 +133,43 @@ const askQuestion = (rl, query) => { } rl.close() } else if (ans.toLowerCase() !== 'n') { - askQuestion(rl, 'Incorrect input: please enter either y (yes) or n (no): ') + askQuestion( + rl, + 'Incorrect input: please enter either y (yes) or n (no): ' + ) } else { rl.close() } }) } -/** - * @param {string} file - * @returns {void} - */ -const addAlias = (file) => { - return fs.appendFile(file, 'alias npm="socket npm"\nalias npx="socket npx"\n', (err) => { - if (err) { - return new Error(`There was an error setting up the alias: ${err}`) - } - console.log(` +const addAlias = (file: string): void => { + return fs.appendFile( + file, + 'alias npm="socket npm"\nalias npx="socket npx"\n', + err => { + if (err) { + return new Error(`There was an error setting up the alias: ${err}`) + } + console.log(` The alias was added to ${file}. Running 'npm install' will now be wrapped in Socket's "safe npm" 🎉 If you want to disable it at any time, run \`socket wrapper --disable\` `) - }) + } + ) } -/** - * @param {string} file - * @returns {void} - */ -const removeAlias = (file) => { +const removeAlias = (file: string): void => { return fs.readFile(file, 'utf8', function (err, data) { if (err) { console.error(`There was an error removing the alias: ${err}`) return } - const linesWithoutSocketAlias = data.split('\n').filter(l => l !== 'alias npm="socket npm"' && l !== 'alias npx="socket npx"') + const linesWithoutSocketAlias = data + .split('\n') + .filter( + l => l !== 'alias npm="socket npm"' && l !== 'alias npx="socket npx"' + ) const updatedFileContent = linesWithoutSocketAlias.join('\n') @@ -175,7 +178,7 @@ const removeAlias = (file) => { console.log(err) return } else { - console.log(` + console.log(` The alias was removed from ${file}. Running 'npm install' will now run the standard npm command. `) } @@ -183,16 +186,18 @@ The alias was removed from ${file}. Running 'npm install' will now run the stand }) } -/** - * @param {string} file - * @returns {boolean} - */ -const checkSocketWrapperAlreadySetup = (file) => { +const checkSocketWrapperAlreadySetup = (file: string): boolean => { const fileContent = fs.readFileSync(file, 'utf-8') - const linesWithSocketAlias = fileContent.split('\n').filter(l => l === 'alias npm="socket npm"' || l === 'alias npx="socket npx"') + const linesWithSocketAlias = fileContent + .split('\n') + .filter( + l => l === 'alias npm="socket npm"' || l === 'alias npx="socket npx"' + ) if (linesWithSocketAlias.length) { - console.log(`The Socket npm/npx wrapper is set up in your bash profile (${file}).`) + console.log( + `The Socket npm/npx wrapper is set up in your bash profile (${file}).` + ) return true } return false diff --git a/src/flags.ts b/src/flags.ts new file mode 100644 index 00000000..ba9a83e4 --- /dev/null +++ b/src/flags.ts @@ -0,0 +1,40 @@ +export const commandFlags = { + enable: { + type: 'boolean', + default: false, + description: 'Enables the Socket npm/npx wrapper' + }, + disable: { + type: 'boolean', + default: false, + description: 'Disables the Socket npm/npx wrapper' + } +} + +export const outputFlags = { + json: { + type: 'boolean', + shortFlag: 'j', + default: false, + description: 'Output result as json' + }, + markdown: { + type: 'boolean', + shortFlag: 'm', + default: false, + description: 'Output result as markdown' + } +} + +export const validationFlags = { + all: { + type: 'boolean', + default: false, + description: 'Include all issues' + }, + strict: { + type: 'boolean', + default: false, + description: 'Exits with an error code if any matching issues are found' + } +} diff --git a/src/shadow/link.ts b/src/shadow/link.ts new file mode 100644 index 00000000..24b03fb6 --- /dev/null +++ b/src/shadow/link.ts @@ -0,0 +1,38 @@ +import { realpathSync } from 'node:fs' +import path from 'node:path' + +import which from 'which' + +export function installLinks( + realDirname: string, + binName: 'npm' | 'npx' +): string { + const realShadowBinDir = realDirname + // find package manager being shadowed by this process + const bins = which.sync(binName, { + all: true + }) + let shadowIndex = -1 + const binPath = bins.find((binPath, i) => { + if (realpathSync(path.dirname(binPath)) === realShadowBinDir) { + shadowIndex = i + return false + } + return true + }) + const isWin = process.platform === 'win32' + if (isWin && binPath) { + return binPath + } + if (!binPath) { + console.error( + `Socket unable to locate ${binName}; ensure it is available in the PATH environment variable` + ) + process.exit(127) + } + if (shadowIndex === -1) { + const binDir = path.join(realDirname) + process.env['PATH'] = `${binDir}${isWin ? ';' : ':'}${process.env['PATH']}` + } + return binPath +} diff --git a/src/shadow/npm-cli.ts b/src/shadow/npm-cli.ts new file mode 100755 index 00000000..6af702c3 --- /dev/null +++ b/src/shadow/npm-cli.ts @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +import { spawn } from 'node:child_process' +import { realpathSync } from 'node:fs' +import path from 'node:path' + +import { installLinks } from './link' + +const realFilename = realpathSync(__filename) +const realDirname = path.dirname(realFilename) + +const npmPath = installLinks(path.join(realDirname, 'bin'), 'npm') +const injectionPath = path.join(realDirname, 'npm-injection.js') + +process.exitCode = 1 + +spawn( + process.execPath, + ['--require', injectionPath, npmPath, ...process.argv.slice(2)], + { + stdio: 'inherit' + } +).on('exit', (code, signal) => { + if (signal) { + process.kill(process.pid, signal) + } else if (code !== null) { + process.exit(code) + } +}) diff --git a/src/shadow/npm-injection.ts b/src/shadow/npm-injection.ts new file mode 100644 index 00000000..fbf3d5a3 --- /dev/null +++ b/src/shadow/npm-injection.ts @@ -0,0 +1,625 @@ +import events from 'node:events' +import { existsSync, readFileSync, realpathSync } from 'node:fs' +import https from 'node:https' +import path from 'node:path' +import rl from 'node:readline' +import { PassThrough } from 'node:stream' +import { setTimeout as wait } from 'node:timers/promises' + +import config from '@socketsecurity/config' +import chalk from 'chalk' +import isInteractive from 'is-interactive' +import ora, { spinners } from 'ora' + +import { installLinks } from './link' +import { createTTYServer } from './tty-server' +import { ChalkOrMarkdown } from '../utils/chalk-markdown' +import { createIssueUXLookup } from '../utils/issue-rules' +import { getDefaultKey, FREE_API_KEY, setupSdk } from '../utils/sdk' +import { getSetting } from '../utils/settings' +import { isErrnoException } from '../utils/type-helpers' + +import type { + Arborist as BaseArborist, + Diff, + Node, + Options as ArboristOptions +} from '@npmcli/arborist' +import type { Writable } from 'node:stream' +import type { Options as OraOptions } from 'ora' + +type ArboristClass = typeof BaseArborist & { + new (...args: any): any +} + +type InstallEffect = { + action: Diff['action'] + existing: Node['pkgid'] | null + pkgid: Node['pkgid'] + resolved: Node['resolved'] + location: Node['location'] + oldPackage: PURLParts | null + newPackage: PURLParts +} + +type PURLParts = { + type: 'npm' + namespace_and_name: string + version: string + repository_url: URL['href'] +} + +const QUEUE_SENTINEL = 1_000_000 + +const distPath = __dirname +const rootPath = path.resolve(distPath, '..') +const binPath = path.join(rootPath, 'bin') + +const npmEntrypoint = realpathSync(`${process.argv[1]}`) +const npmRootPath = findRoot(path.dirname(npmEntrypoint)) + +const POTENTIALLY_BUG_ERROR_SNIPPET = + 'this is potentially a bug with socket-npm caused by changes to the npm cli' + +const abortController = new AbortController() +const { signal: abortSignal } = abortController + +const translations = require(path.join(rootPath, 'translations.json')) + +if (npmRootPath === undefined) { + console.error( + `Unable to find npm cli install directory, ${POTENTIALLY_BUG_ERROR_SNIPPET}.` + ) + console.error(`Searched parent directories of ${npmEntrypoint}`) + process.exit(127) +} + +const npmDepPath = path.join(npmRootPath, 'node_modules') +const arboristClassPath = path.join( + npmDepPath, + '@npmcli/arborist/lib/arborist/index.js' +) + +const Arborist: ArboristClass = require(arboristClassPath) + +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +let tarball: typeof import('pacote').tarball +try { + tarball = require(path.join(npmDepPath, 'pacote')).tarball +} catch { + tarball = require('pacote').tarball +} + +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +let npmlog: typeof import('npmlog') | undefined +try { + npmlog = require(path.join(npmDepPath, 'proc-log/lib/index.js')).log +} catch {} +if (npmlog === undefined) { + try { + npmlog = require(path.join(npmDepPath, 'npmlog/lib/log.js')) + } catch {} +} +if (npmlog === undefined) { + console.error( + `Unable to integrate with npm cli logging infrastructure, ${POTENTIALLY_BUG_ERROR_SNIPPET}.` + ) + process.exit(127) +} + +const kCtorArgs = Symbol('ctorArgs') +const kRiskyReify = Symbol('riskyReify') + +const formatter = new ChalkOrMarkdown(false) +const pubToken = getDefaultKey() ?? FREE_API_KEY + +type IssueUXLookup = ReturnType +type IssueUXLookupSettings = Parameters[0] +type IssueUXLookupResult = ReturnType + +const ttyServer = createTTYServer( + chalk.level, + isInteractive({ stream: process.stdin }), + npmlog +) + +let _uxLookup: IssueUXLookup | undefined + +async function uxLookup( + settings: IssueUXLookupSettings +): Promise { + // eslint-disable-next-line no-unmodified-loop-condition + while (_uxLookup === undefined) { + await wait(1, { signal: abortSignal }) + } + return _uxLookup(settings) +} + +async function* batchScan( + pkgIds: string[] +): AsyncGenerator< + { eco: string; pkg: string; ver: string } & ( + | { type: 'missing' } + | { type: 'success'; value: { issues: any[] } } + ) +> { + const query = { + packages: pkgIds.map(pkgid => { + const { name, version } = pkgidParts(pkgid) + return { + eco: 'npm', + pkg: name, + ver: version, + top: true + } + }) + } + // TODO: migrate to SDK + const pkgDataReq = https + .request('https://api.socket.dev/v0/scan/batch', { + method: 'POST', + headers: { + Authorization: `Basic ${Buffer.from(`${pubToken}:`).toString('base64url')}` + }, + signal: abortSignal + }) + .end(JSON.stringify(query)) + const { 0: res } = await events.once(pkgDataReq, 'response') + const ok = res.statusCode >= 200 && res.statusCode <= 299 + if (!ok) { + throw new Error(`Socket API Error: ${res.statusCode}`) + } + const rli = rl.createInterface(res) + for await (const line of rli) { + yield JSON.parse(line) + } +} + +function findRoot(filepath: string): string | undefined { + let curPath = filepath + while (true) { + if (path.basename(curPath) === 'npm') { + return curPath + } + const parent = path.dirname(curPath) + if (parent === curPath) { + return undefined + } + curPath = parent + } +} + +function findSocketYML() { + let prevDir = null + let dir = process.cwd() + while (dir !== prevDir) { + let ymlPath = path.join(dir, 'socket.yml') + let yml = maybeReadfileSync(ymlPath) + if (yml === undefined) { + ymlPath = path.join(dir, 'socket.yaml') + yml = maybeReadfileSync(ymlPath) + } + if (typeof yml === 'string') { + try { + return { + path: ymlPath, + parsed: config.parseSocketConfig(yml) + } + } catch { + throw new Error(`Found file but was unable to parse ${ymlPath}`) + } + } + prevDir = dir + dir = path.join(dir, '..') + } + return null +} + +function maybeReadfileSync(filepath: string): string | undefined { + try { + return existsSync(filepath) ? readFileSync(filepath, 'utf8') : undefined + } catch {} + return undefined +} + +async function packagesHaveRiskyIssues( + safeArb: SafeArborist, + _registry: string, + pkgs: InstallEffect[], + output?: Writable +): Promise { + let result = false + let remaining = pkgs.length + if (!remaining) { + ora('').succeed('No changes detected') + return result + } + + const getText = () => `Looking up data for ${remaining} packages` + + const spinner = ora({ + color: 'cyan', + stream: output, + isEnabled: true, + isSilent: false, + hideCursor: true, + discardStdin: true, + spinner: spinners.dots + } as OraOptions).start(getText()) + + try { + for await (const pkgData of batchScan(pkgs.map(pkg => pkg.pkgid))) { + let failures: { block?: boolean; raw?: any; type?: string }[] = [] + let displayWarning = false + + const name = pkgData.pkg + const version = pkgData.ver + const id = `${name}@${version}` + + if (pkgData.type === 'missing') { + result = true + failures.push({ + type: 'missingDependency' + }) + } else { + let blocked = false + for (const failure of pkgData.value.issues) { + const ux = await uxLookup({ + package: { name, version }, + issue: { type: failure.type } + }) + if (ux.display || ux.block) { + failures.push({ raw: failure, block: ux.block }) + // before we ask about problematic issues, check to see if they + // already existed in the old version if they did, be quiet + const pkg = pkgs.find( + pkg => pkg.pkgid === id && pkg.existing?.startsWith(`${name}@`) + ) + if (pkg?.existing) { + for await (const oldPkgData of batchScan([pkg.existing])) { + if (oldPkgData.type === 'success') { + failures = failures.filter( + issue => + oldPkgData.value.issues.find( + oldIssue => oldIssue.type === issue.raw.type + ) == null + ) + } + } + } + } + if (ux.block) { + result = true + blocked = true + } + if (ux.display) { + displayWarning = true + } + } + if (!blocked) { + const pkg = pkgs.find(pkg => pkg.pkgid === id) + if (pkg) { + await tarball.stream( + id, + stream => { + stream.resume() + return (stream as any).promise() + }, + { ...(safeArb as any)[kCtorArgs][0] } + ) + } + } + } + if (displayWarning) { + spinner.stop() + output?.write( + `(socket) ${formatter.hyperlink(id, `https://socket.dev/npm/package/${name}/overview/${version}`)} contains risks:\n` + ) + failures.sort((a, b) => (a.raw.type < b.raw.type ? -1 : 1)) + const lines = new Set() + for (const failure of failures) { + const type = failure.raw.type + if (type) { + // @ts-ignore + const issueTypeTranslation = translations.issues[type] + // TODO: emoji seems to mis-align terminals sometimes + // @ts-ignore + lines.add( + ` ${issueTypeTranslation?.title ?? type}${failure.block ? '' : ' (non-blocking)'} - ${issueTypeTranslation?.description ?? ''}\n` + ) + } + } + for (const line of lines) { + output?.write(line) + } + spinner.start() + } + remaining-- + spinner.text = remaining > 0 ? getText() : '' + } + return result + } finally { + if (spinner.isSpinning) { + spinner.stop() + } + } +} + +function pkgidParts(pkgid: string) { + const delimiter = pkgid.lastIndexOf('@') + const name = pkgid.slice(0, delimiter) + const version = pkgid.slice(delimiter + 1) + return { name, version } +} + +function toPURL(pkgid: string, resolved: string): PURLParts { + const repo = resolved + .replace(/#[\s\S]*$/u, '') + .replace(/\?[\s\S]*$/u, '') + .replace(/\/[^/]*\/-\/[\s\S]*$/u, '') + const { name, version } = pkgidParts(pkgid) + return { + type: 'npm', + namespace_and_name: name, + version, + repository_url: repo + } +} + +function walk( + diff_: Diff | null, + needInfoOn: InstallEffect[] = [] +): InstallEffect[] { + const queue: (Diff | null)[] = [diff_] + let pos = 0 + let { length: queueLength } = queue + while (pos < queueLength && pos < QUEUE_SENTINEL) { + const diff = queue[pos++]! + if (!diff) { + continue + } + if (diff.action) { + const sameVersion = + diff.actual?.package.version === diff.ideal?.package.version + let keep = false + let existing = null + if (diff.action === 'CHANGE') { + if (!sameVersion) { + existing = diff.actual.pkgid + keep = true + } else { + // console.log('SKIPPING META CHANGE ON', diff) + } + } else { + keep = diff.action !== 'REMOVE' + } + if ( + keep && + diff.ideal?.pkgid && + diff.ideal.resolved && + (!diff.actual || diff.actual.resolved) + ) { + needInfoOn.push({ + existing, + action: diff.action, + location: diff.ideal.location, + pkgid: diff.ideal.pkgid, + newPackage: toPURL(diff.ideal.pkgid, diff.ideal.resolved), + oldPackage: + diff.actual && diff.actual.resolved + ? toPURL(diff.actual.pkgid, diff.actual.resolved) + : null, + resolved: diff.ideal.resolved + }) + } + } + if (diff.children) { + for (const child of diff.children) { + queue[queueLength++] = child + } + } + } + return needInfoOn +} + +class SafeArborist extends Arborist { + constructor(...ctorArgs: ConstructorParameters) { + const mutedArguments = [ + { + ...(ctorArgs[0] ?? {}), + audit: true, + dryRun: true, + ignoreScripts: true, + save: false, + saveBundle: false, + // progress: false, + fund: false + }, + ctorArgs.slice(1) + ] + super(...mutedArguments) + ;(this as any)[kCtorArgs] = ctorArgs + } + + async [kRiskyReify]( + ...args: Parameters['reify']> + ): Promise { + // safe arborist has suffered side effects and must be rebuilt from scratch + const arb = new Arborist(...(this as any)[kCtorArgs]) + const ret = await arb.reify(...args) + Object.assign(this, arb) + return ret + } + + async reify( + ...args: Parameters['reify']> + ): Promise { + const options = args[0] ? { ...args[0] } : {} + if (options.dryRun) { + return await this[kRiskyReify](...args) + } + const old = { + ...options, + dryRun: false, + save: Boolean(options['save'] ?? true), + saveBundle: Boolean(options['saveBundle'] ?? false) + } + args[0] = options + options.dryRun = true + options['save'] = false + options['saveBundle'] = false + // TODO: make this deal w/ any refactor to private fields by punching the class itself + await super.reify(...args) + const diff = walk(this['diff']) + options.dryRun = old.dryRun + options['save'] = old.save + options['saveBundle'] = old.saveBundle + // Nothing to check, mmm already installed or all private? + if ( + diff.findIndex( + c => c.newPackage.repository_url === 'https://registry.npmjs.org' + ) === -1 + ) { + return await this[kRiskyReify](...args) + } + const proceed = await ttyServer.captureTTY( + async (colorLevel, input, output) => { + chalk.level = colorLevel + if (input && output) { + const risky = await packagesHaveRiskyIssues( + this, + this['registry'], + diff, + output + ) + if (!risky) { + return true + } + const rlin = new PassThrough() + input.pipe(rlin) + const rlout = new PassThrough() + rlout.pipe(output, { end: false }) + const rli = rl.createInterface(rlin, rlout) + try { + while (true) { + const answer: string = await new Promise(resolve => { + rli.question( + 'Accept risks of installing these packages (y/N)?\n', + { signal: abortSignal }, + resolve + ) + }) + if (/^\s*y(?:es)?\s*$/i.test(answer)) { + return true + } + if (/^(?:\s*no?\s*|)$/i.test(answer)) { + return false + } + } + } finally { + rli.close() + } + } else if ( + await packagesHaveRiskyIssues(this, this['registry'], diff, output) + ) { + throw new Error( + 'Socket npm Unable to prompt to accept risk, need TTY to do so' + ) + } + return true + } + ) + if (proceed) { + return await this[kRiskyReify](...args) + } else { + throw new Error('Socket npm exiting due to risks') + } + } +} + +require.cache[arboristClassPath]!.exports = SafeArborist + +async function main() { + // shadow `npm` and `npx` to mitigate subshells + installLinks(realpathSync(binPath), 'npm') + + const remoteSettings = await (async () => { + try { + const sdk = await setupSdk(pubToken) + const orgResult = await sdk.getOrganizations() + if (!orgResult.success) { + throw new Error( + 'Failed to fetch Socket organization info: ' + orgResult.error.message + ) + } + + const orgs: Exclude< + (typeof orgResult.data.organizations)[string], + undefined + >[] = [] + for (const org of Object.values(orgResult.data.organizations)) { + if (org) { + orgs.push(org) + } + } + const result = await sdk.postSettings( + orgs.map(org => { + return { + organization: org.id + } + }) + ) + if (!result.success) { + throw new Error( + 'Failed to fetch API key settings: ' + result.error.message + ) + } + return { + orgs, + settings: result.data + } + } catch (e: any) { + if (typeof e === 'object' && e !== null && 'cause' in e) { + const { cause } = e + if (isErrnoException(cause)) { + if (cause.code === 'ENOTFOUND' || cause.code === 'ECONNREFUSED') { + throw new Error( + 'Unable to connect to socket.dev, ensure internet connectivity before retrying', + { + cause: e + } + ) + } + } + } + throw e + } + })() + + const { orgs, settings } = remoteSettings + const enforcedOrgs = getSetting('enforcedOrgs') ?? [] + + // remove any organizations not being enforced + for (const { 0: i, 1: org } of orgs.entries()) { + if (!enforcedOrgs.includes(org.id)) { + settings.entries.splice(i, 1) + } + } + + const socketYml = findSocketYML() + if (socketYml) { + settings.entries.push({ + start: socketYml.path, + // @ts-ignore + settings: { + [socketYml.path]: { + deferTo: null, + issueRules: socketYml.parsed.issueRules + } + } + }) + } + + _uxLookup = createIssueUXLookup(settings) +} +void main() diff --git a/src/shadow/npx-cli.ts b/src/shadow/npx-cli.ts new file mode 100755 index 00000000..f538dadd --- /dev/null +++ b/src/shadow/npx-cli.ts @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +import { spawn } from 'node:child_process' +import { realpathSync } from 'node:fs' +import path from 'node:path' + +import { installLinks } from './link' + +const realFilename = realpathSync(__filename) +const realDirname = path.dirname(realFilename) + +const npxPath = installLinks(path.join(realDirname, 'bin'), 'npx') +const injectionPath = path.join(realDirname, 'npm-injection.js') + +process.exitCode = 1 + +spawn( + process.execPath, + ['--require', injectionPath, npxPath, ...process.argv.slice(2)], + { + stdio: 'inherit' + } +).on('exit', (code, signal) => { + if (signal) { + process.kill(process.pid, signal) + } else if (code !== null) { + process.exit(code) + } +}) diff --git a/src/shadow/tty-server.ts b/src/shadow/tty-server.ts new file mode 100644 index 00000000..d4d685bf --- /dev/null +++ b/src/shadow/tty-server.ts @@ -0,0 +1,272 @@ +import { unlinkSync } from 'node:fs' +import net from 'node:net' +import os from 'node:os' +import path from 'node:path' +import readline from 'node:readline' +import { PassThrough } from 'node:stream' + +import { version as ipc_version } from '../../package.json' +import { isErrnoException } from '../utils/type-helpers' + +import type { ColorSupportLevel } from 'chalk' +import type { Server } from 'node:net' +import type { Direction } from 'node:readline' +import type { Readable, Writable } from 'node:stream' + +const NEWLINE_CHAR_CODE = 10 /*'\n'*/ + +const TTY_IPC = process.env['SOCKET_SECURITY_TTY_IPC'] + +type CaptureState = { + captured: boolean + nextCapture: () => void + pendingCaptures: { resolve(): void }[] +} + +type TTYSeverResult = { + captureTTY( + mutexFn: ( + colorLevel: ColorSupportLevel, + input?: Readable | undefined, + output?: Writable | undefined + ) => Promise + ): Promise +} + +const sock = path.join(os.tmpdir(), `socket-security-tty-${process.pid}.sock`) +process.env['SOCKET_SECURITY_TTY_IPC'] = sock + +function createNonStandardTTYServer(): TTYSeverResult { + return { + async captureTTY(mutexFn) { + return await new Promise((resolve, reject) => { + const conn = net + .createConnection({ + path: TTY_IPC! + }) + .on('error', reject) + let captured = false + const buffs: Uint8Array[] = [] + conn.on('data', function awaitCapture(chunk: Uint8Array) { + buffs.push(chunk) + let lineBuff: Buffer | null = Buffer.concat(buffs) + if (captured) return + try { + const eolIndex = lineBuff.indexOf(NEWLINE_CHAR_CODE) + if (eolIndex !== -1) { + conn.removeListener('data', awaitCapture) + conn.push(lineBuff.slice(eolIndex + 1)) + const { + ipc_version: remote_ipc_version, + capabilities: { + input: hasInput, + output: hasOutput, + colorLevel: ipcColorLevel + } + } = JSON.parse(lineBuff.slice(0, eolIndex).toString('utf-8')) + lineBuff = null + captured = true + if (remote_ipc_version !== ipc_version) { + throw new Error( + 'Mismatched STDIO tunnel IPC version, ensure you only have 1 version of socket CLI being called.' + ) + } + const input = hasInput ? new PassThrough() : null + input?.pause() + if (input) conn.pipe(input) + const output = hasOutput ? new PassThrough() : null + if (output) { + output.pipe(conn) + // Make ora happy + ;(output as any).isTTY = true + ;(output as any).cursorTo = function cursorTo( + x: number, + y: number, + callback?: (() => void) | undefined + ) { + readline.cursorTo(this!, x, y, callback) + } + ;(output as any).clearLine = function clearLine( + dir: Direction, + callback?: (() => void) | undefined + ) { + readline.clearLine(this!, dir, callback) + } + } + mutexFn( + ipcColorLevel, + hasInput ? (input as Readable) : undefined, + hasOutput ? (output as Writable) : undefined + ) + .then(resolve, reject) + .finally(() => { + conn.unref() + conn.end() + input?.end() + output?.end() + // process.exit(13) + }) + } + } catch (e: any) { + reject(e as Error) + } + }) + }) + } + } +} + +function createIPCServer( + colorLevel: ColorSupportLevel, + captureState: CaptureState, + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + npmlog: typeof import('npmlog') +): Promise { + const input = process.stdin + const output = process.stderr + return new Promise((resolve, reject) => { + const server = net + // eslint-disable-next-line @typescript-eslint/no-misused-promises + .createServer(async conn => { + if (captureState.captured) { + await new Promise(resolve => { + captureState.pendingCaptures.push({ + resolve() { + resolve() + } + }) + }) + } else { + captureState.captured = true + } + const wasProgressEnabled = (npmlog.progressEnabled) as boolean + npmlog.pause() + if (wasProgressEnabled) { + npmlog.disableProgress() + } + conn.write( + `${JSON.stringify({ + ipc_version, + capabilities: { + input: Boolean(input), + output: true, + colorLevel + } + })}\n` + ) + conn + .on('data', (data: Uint8Array) => { + output.write(data) + }) + .on('error', (e: any) => { + output.write( + `there was an error prompting from a sub shell (${e?.message}), socket npm closing` + ) + process.exit(1) + }) + input + .on('data', (data: string | Uint8Array) => { + conn.write(data) + }) + .on('end', () => { + conn.unref() + conn.end() + if (wasProgressEnabled) { + npmlog.enableProgress() + } + npmlog.resume() + captureState.nextCapture() + }) + }) + .listen(sock, () => resolve(server)) + .on('error', reject) + .unref() + + process.on('exit', () => { + server.close() + tryUnlinkSync(sock) + }) + resolve(server) + }) +} + +function createStandardTTYServer( + colorLevel: ColorSupportLevel, + isInteractive: boolean, + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + npmlog: typeof import('npmlog') +): TTYSeverResult { + const captureState: CaptureState = { + captured: false, + nextCapture: () => { + if (captureState.pendingCaptures.length > 0) { + const pendingCapture = captureState.pendingCaptures.shift() + pendingCapture?.resolve() + } else { + captureState.captured = false + } + }, + pendingCaptures: [] + } + + tryUnlinkSync(sock) + + const input = isInteractive ? process.stdin : undefined + const output = process.stderr + + let ipcServerPromise: Promise | undefined + if (input) { + ipcServerPromise = createIPCServer(colorLevel, captureState, npmlog) + } + return { + async captureTTY(mutexFn) { + await ipcServerPromise + if (captureState.captured) { + const captured = new Promise(resolve => { + captureState.pendingCaptures.push({ + resolve() { + resolve() + } + }) + }) + await captured + } else { + captureState.captured = true + } + const wasProgressEnabled = (npmlog.progressEnabled) as boolean + try { + npmlog.pause() + if (wasProgressEnabled) { + npmlog.disableProgress() + } + return await mutexFn(colorLevel, input, output) + } finally { + if (wasProgressEnabled) { + npmlog.enableProgress() + } + npmlog.resume() + captureState.nextCapture() + } + } + } +} + +function tryUnlinkSync(filepath: string) { + try { + unlinkSync(filepath) + } catch (e: any) { + if (isErrnoException(e) && e.code !== 'ENOENT') { + throw e + } + } +} + +export function createTTYServer( + colorLevel: ColorSupportLevel, + isInteractive: boolean, + npmlog: any +): TTYSeverResult { + return !isInteractive && TTY_IPC + ? createNonStandardTTYServer() + : createStandardTTYServer(colorLevel, isInteractive, npmlog) +} diff --git a/src/utils/api-helpers.ts b/src/utils/api-helpers.ts new file mode 100644 index 00000000..be100f79 --- /dev/null +++ b/src/utils/api-helpers.ts @@ -0,0 +1,48 @@ +// @ts-ignore +import chalk from 'chalk' +import { ErrorWithCause } from 'pony-cause' + +import { AuthError } from './errors' + +import type { + SocketSdkOperations, + SocketSdkErrorType +} from '@socketsecurity/sdk' +import type { Ora } from 'ora' + +export function handleUnsuccessfulApiResponse( + _name: T, + result: SocketSdkErrorType, + spinner: Ora +) { + const resultError = + 'error' in result && result.error && typeof result.error === 'object' + ? result.error + : {} + const message = + 'message' in resultError && typeof resultError.message === 'string' + ? resultError.message + : 'No error message returned' + + if (result.status === 401 || result.status === 403) { + spinner.stop() + throw new AuthError(message) + } + spinner.fail(chalk.white.bgRed('API returned an error:') + ' ' + message) + process.exit(1) +} + +export async function handleApiCall( + value: T, + description: string +): Promise { + let result: T + + try { + result = await value + } catch (cause) { + throw new ErrorWithCause(`Failed ${description}`, { cause }) + } + + return result +} diff --git a/lib/utils/chalk-markdown.js b/src/utils/chalk-markdown.ts similarity index 51% rename from lib/utils/chalk-markdown.js rename to src/utils/chalk-markdown.ts index 3dbd7fae..622de923 100644 --- a/lib/utils/chalk-markdown.js +++ b/src/utils/chalk-markdown.ts @@ -1,5 +1,8 @@ +// @ts-ignore import chalk from 'chalk' +// @ts-ignore import isUnicodeSupported from 'is-unicode-supported' +// @ts-ignore import terminalLink from 'terminal-link' // From the 'log-symbols' module @@ -7,7 +10,7 @@ const unicodeLogSymbols = { info: chalk.blue('ℹ'), success: chalk.green('✔'), warning: chalk.yellow('⚠'), - error: chalk.red('✖'), + error: chalk.red('✖') } // From the 'log-symbols' module @@ -15,109 +18,78 @@ const fallbackLogSymbols = { info: chalk.blue('i'), success: chalk.green('√'), warning: chalk.yellow('‼'), - error: chalk.red('×'), + error: chalk.red('×') } // From the 'log-symbols' module -export const logSymbols = isUnicodeSupported() ? unicodeLogSymbols : fallbackLogSymbols +export const logSymbols = isUnicodeSupported() + ? unicodeLogSymbols + : fallbackLogSymbols const markdownLogSymbols = { info: ':information_source:', error: ':stop_sign:', success: ':white_check_mark:', - warning: ':warning:', + warning: ':warning:' } export class ChalkOrMarkdown { - /** @type {boolean} */ - useMarkdown + public useMarkdown: boolean - /** - * @param {boolean} useMarkdown - */ - constructor (useMarkdown) { + constructor(useMarkdown: boolean) { this.useMarkdown = !!useMarkdown } - /** - * @param {string} text - * @param {number} [level] - * @returns {string} - */ - header (text, level = 1) { + header(text: string, level = 1): string { return this.useMarkdown ? `\n${''.padStart(level, '#')} ${text}\n` : chalk.underline(`\n${level === 1 ? chalk.bold(text) : text}\n`) } - /** - * @param {string} text - * @returns {string} - */ - bold (text) { - return this.useMarkdown - ? `**${text}**` - : chalk.bold(`${text}`) + bold(text: string): string { + return this.useMarkdown ? `**${text}**` : chalk.bold(`${text}`) } - /** - * @param {string} text - * @returns {string} - */ - italic (text) { - return this.useMarkdown - ? `_${text}_` - : chalk.italic(`${text}`) + italic(text: string): string { + return this.useMarkdown ? `_${text}_` : chalk.italic(`${text}`) } - /** - * @param {string} text - * @param {string|undefined} url - * @param {{ fallback?: boolean, fallbackToUrl?: boolean }} options - * @returns {string} - */ - hyperlink (text, url, { fallback = true, fallbackToUrl } = {}) { + hyperlink( + text: string, + url: string | undefined, + { + fallback = true, + fallbackToUrl + }: { + fallback?: boolean + fallbackToUrl?: boolean + } = {} + ) { if (!url) return text return this.useMarkdown ? `[${text}](${url})` : terminalLink(text, url, { - fallback: fallbackToUrl ? (_text, url) => url : fallback - }) + fallback: fallbackToUrl ? (_text, url) => url : fallback + }) } - /** - * @param {string[]} items - * @returns {string} - */ - list (items) { + list(items: string[]): string { const indentedContent = items.map(item => this.indent(item).trimStart()) return this.useMarkdown ? '* ' + indentedContent.join('\n* ') + '\n' : indentedContent.join('\n') + '\n' } - /** - * @returns {typeof logSymbols} - */ - get logSymbols () { + get logSymbols(): typeof logSymbols { return this.useMarkdown ? markdownLogSymbols : logSymbols } - /** - * @param {string} text - * @param {number} [level] - * @returns {string} - */ - indent (text, level = 1) { + indent(text: string, level = 1): string { const indent = ''.padStart(level * 2, ' ') return indent + text.split('\n').join('\n' + indent) } - /** - * @param {unknown} value - * @returns {string} - */ - json (value) { + json(value: unknown): string { return this.useMarkdown ? '```json\n' + JSON.stringify(value) + '\n```' : JSON.stringify(value) diff --git a/src/utils/errors.ts b/src/utils/errors.ts new file mode 100644 index 00000000..e74c2294 --- /dev/null +++ b/src/utils/errors.ts @@ -0,0 +1,11 @@ +export class AuthError extends Error {} + +export class InputError extends Error { + public body: string | undefined + + constructor(message: string, body?: string) { + super(message) + + this.body = body + } +} diff --git a/src/utils/format-issues.ts b/src/utils/format-issues.ts new file mode 100644 index 00000000..343a00ff --- /dev/null +++ b/src/utils/format-issues.ts @@ -0,0 +1,71 @@ +import { pick, stringJoinWithSeparateFinalSeparator } from './misc' + +import type { SocketSdkReturnType } from '@socketsecurity/sdk' + +type SocketIssueList = SocketSdkReturnType<'getIssuesByNPMPackage'>['data'] + +export type SocketIssue = SocketIssueList[number]['value'] extends + | infer U + | undefined + ? U + : never + +const SEVERITIES_BY_ORDER: SocketIssue['severity'][] = [ + 'critical', + 'high', + 'middle', + 'low' +] + +function getDesiredSeverities( + lowestToInclude: SocketIssue['severity'] | undefined +): SocketIssue['severity'][] { + const result: SocketIssue['severity'][] = [] + + for (const severity of SEVERITIES_BY_ORDER) { + result.push(severity) + if (severity === lowestToInclude) { + break + } + } + + return result +} + +export function getSeverityCount( + issues: SocketIssueList, + lowestToInclude: SocketIssue['severity'] | undefined +): Record { + const severityCount = pick( + { low: 0, middle: 0, high: 0, critical: 0 }, + getDesiredSeverities(lowestToInclude) + ) as Record + + for (const issue of issues) { + const value = issue.value + + if (!value) { + continue + } + + if (severityCount[value.severity] !== undefined) { + severityCount[value.severity] += 1 + } + } + + return severityCount +} + +export function formatSeverityCount( + severityCount: Record +): string { + const summary: string[] = [] + + for (const severity of SEVERITIES_BY_ORDER) { + if (severityCount[severity]) { + summary.push(`${severityCount[severity]} ${severity}`) + } + } + + return stringJoinWithSeparateFinalSeparator(summary) +} diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts new file mode 100644 index 00000000..240d3be4 --- /dev/null +++ b/src/utils/formatting.ts @@ -0,0 +1,53 @@ +type ListDescription = string | { description: string } +type HelpListOptions = { + keyPrefix: string + padName: number +} + +/** + * @param {} list + * @param {number} indent + * @param {HelpListOptions} options + * @returns {string} + */ +export function printHelpList( + list: Record, + indent: number, + { keyPrefix = '', padName = 18 } = {} as HelpListOptions +) { + const names = Object.keys(list).sort() + + let result = '' + + for (const name of names) { + const rawDescription = list[name] + const description = + (typeof rawDescription === 'object' + ? rawDescription.description + : rawDescription) || '' + + result += + ''.padEnd(indent) + + (keyPrefix + name).padEnd(padName) + + description + + '\n' + } + + return result.trim() +} + +export function printFlagList( + list: Record, + indent: number, + { keyPrefix = '--', padName } = {} as HelpListOptions +): string { + return printHelpList( + { + help: 'Print this help and exits.', + version: 'Prints current version and exits.', + ...list + }, + indent, + { keyPrefix, padName } + ) +} diff --git a/src/utils/issue-rules.ts b/src/utils/issue-rules.ts new file mode 100644 index 00000000..32983714 --- /dev/null +++ b/src/utils/issue-rules.ts @@ -0,0 +1,180 @@ +import type { SocketSdkResultType } from '@socketsecurity/sdk' + +//#region UX Constants +type RuleActionUX = { block: boolean; display: boolean } + +const IGNORE_UX: RuleActionUX = { + block: false, + display: false +} + +const WARN_UX: RuleActionUX = { + block: false, + display: true +} + +const ERROR_UX: RuleActionUX = { + block: true, + display: true +} +//#endregion +//#region utils +type NonNormalizedIssueRule = + | NonNullable< + NonNullable< + NonNullable< + (SocketSdkResultType<'postSettings'> & { + success: true + })['data']['entries'][number]['settings'][string] + >['issueRules'] + > + >[string] + | boolean +type NonNormalizedResolvedIssueRule = + | (NonNullable< + NonNullable< + (SocketSdkResultType<'postSettings'> & { + success: true + })['data']['defaults']['issueRules'] + >[string] + > & { action: string }) + | boolean + +/** + * Iterates over all entries with ordered issue rule for deferral + * Iterates over all issue rules and finds the first defined value that does not defer otherwise uses the defaultValue + * Takes the value and converts into a UX workflow + * + * @param {Iterable>} entriesOrderedIssueRules + * @param {NonNormalizedResolvedIssueRule} defaultValue + * @returns {RuleActionUX} + */ +function resolveIssueRuleUX( + entriesOrderedIssueRules: Iterable>, + defaultValue: NonNormalizedResolvedIssueRule +): RuleActionUX { + if (defaultValue === true || defaultValue == null) { + defaultValue = { action: 'error' } + } else if (defaultValue === false) { + defaultValue = { action: 'ignore' } + } + + let block = false + let display = false + let needDefault = true + + iterate_entries: for (const issueRuleArr of entriesOrderedIssueRules) { + for (const rule of issueRuleArr) { + if (issueRuleValueDoesNotDefer(rule)) { + needDefault = false + const narrowingFilter = uxForDefinedNonDeferValue(rule) + block = block || narrowingFilter.block + display = display || narrowingFilter.display + continue iterate_entries + } + } + const narrowingFilter = uxForDefinedNonDeferValue(defaultValue) + block = block || narrowingFilter.block + display = display || narrowingFilter.display + } + + if (needDefault) { + const narrowingFilter = uxForDefinedNonDeferValue(defaultValue) + block = block || narrowingFilter.block + display = display || narrowingFilter.display + } + + return { block, display } +} + +/** + * Negative form because it is narrowing the type + */ +function issueRuleValueDoesNotDefer( + issueRule: NonNormalizedIssueRule +): issueRule is NonNormalizedResolvedIssueRule { + if (issueRule === undefined) { + return false + } else if (typeof issueRule === 'object' && issueRule) { + const { action } = issueRule + if (action === undefined || action === 'defer') { + return false + } + } + return true +} + +/** + * Handles booleans for backwards compatibility + + */ +function uxForDefinedNonDeferValue( + issueRuleValue: NonNormalizedResolvedIssueRule +): RuleActionUX { + if (typeof issueRuleValue === 'boolean') { + return issueRuleValue ? ERROR_UX : IGNORE_UX + } + const { action } = issueRuleValue + if (action === 'warn') { + return WARN_UX + } else if (action === 'ignore') { + return IGNORE_UX + } + return ERROR_UX +} +//#endregion + +//#region exports +type SettingsType = (SocketSdkResultType<'postSettings'> & { + success: true +})['data'] + +export function createIssueUXLookup( + settings: SettingsType +): (context: { + package: { name: string; version: string } + issue: { type: string } +}) => RuleActionUX { + const cachedUX: Map = + new Map() + return context => { + const key = context.issue.type + let ux = cachedUX.get(key) + if (ux) { + return ux + } + const entriesOrderedIssueRules: Array> = [] + for (const settingsEntry of settings.entries) { + const orderedIssueRules: Array = [] + let target = settingsEntry.start + while (target !== null) { + const resolvedTarget = settingsEntry.settings[target] + if (!resolvedTarget) { + break + } + const issueRuleValue = resolvedTarget.issueRules?.[key] + if (typeof issueRuleValue !== 'undefined') { + orderedIssueRules.push(issueRuleValue) + } + target = resolvedTarget.deferTo ?? null + } + entriesOrderedIssueRules.push(orderedIssueRules) + } + const defaultValue = settings.defaults.issueRules[key] as + | { action: 'error' | 'ignore' | 'warn' } + | boolean + | undefined + let resolvedDefaultValue: NonNormalizedResolvedIssueRule = { + action: 'error' + } + if (defaultValue === false) { + resolvedDefaultValue = { action: 'ignore' } + } else if (defaultValue && defaultValue !== true) { + resolvedDefaultValue = { action: defaultValue.action ?? 'error' } + } + ux = resolveIssueRuleUX(entriesOrderedIssueRules, resolvedDefaultValue) + cachedUX.set(key, ux) + return ux + } +} +//#endregion diff --git a/src/utils/meow-with-subcommands.ts b/src/utils/meow-with-subcommands.ts new file mode 100644 index 00000000..98850ffb --- /dev/null +++ b/src/utils/meow-with-subcommands.ts @@ -0,0 +1,82 @@ +import meow from 'meow' + +import { printFlagList, printHelpList } from './formatting' + +import type { Options } from 'meow' + +interface CliAlias { + description: string + argv: readonly string[] +} + +type CliAliases = Record + +type CliSubcommandRun = ( + argv: readonly string[], + importMeta: ImportMeta, + context: { parentName: string } +) => Promise | void + +export interface CliSubcommand { + description: string + run: CliSubcommandRun +} + +interface MeowOptions extends Options { + aliases?: CliAliases + argv: readonly string[] + name: string +} + +export async function meowWithSubcommands( + subcommands: Record, + options: MeowOptions +): Promise { + const { aliases = {}, argv, name, importMeta, ...additionalOptions } = options + + const [commandOrAliasName, ...rawCommandArgv] = argv + + // If we got at least some args, then lets find out if we can find a command + if (commandOrAliasName) { + const alias = aliases[commandOrAliasName] + + // First: Resolve argv data from alias if its an alias that's been given + const [commandName, ...commandArgv] = alias + ? [...alias.argv, ...rawCommandArgv] + : [commandOrAliasName, ...rawCommandArgv] + + // Second: Find a command definition using that data + const commandDefinition = commandName ? subcommands[commandName] : undefined + + // Third: If a valid command has been found, then we run it... + if (commandDefinition) { + return await commandDefinition.run(commandArgv, importMeta, { + parentName: name + }) + } + } + + // ...else we provide basic instructions and help + const cli = meow( + ` + Usage + $ ${name} + + Commands + ${printHelpList({ ...subcommands, ...aliases }, 6)} + + Options + ${printFlagList({}, 6)} + + Examples + $ ${name} --help + `, + { + argv, + importMeta, + ...additionalOptions + } + ) + + cli.showHelp() +} diff --git a/src/utils/misc.ts b/src/utils/misc.ts new file mode 100644 index 00000000..0599735c --- /dev/null +++ b/src/utils/misc.ts @@ -0,0 +1,46 @@ +import { logSymbols } from './chalk-markdown' + +export function createDebugLogger( + printDebugLogs?: boolean +): typeof console.error { + return printDebugLogs + ? (...params: unknown[]): void => console.error(logSymbols.info, ...params) + : () => {} +} + +export function stringJoinWithSeparateFinalSeparator( + list: (string | undefined)[], + separator: string = ' and ' +): string { + const values = list.filter(value => !!value) + + if (values.length < 2) { + return values[0] || '' + } + + const finalValue = values.pop() + + return values.join(', ') + separator + finalValue +} + +export function pick, K extends keyof T>( + input: T, + keys: K[] | ReadonlyArray +): Pick { + const result: Partial> = {} + + for (const key of keys) { + result[key] = input[key] + } + + return result as Pick +} + +export function objectSome(obj: Record): boolean { + for (const key in obj) { + if (obj[key]) { + return true + } + } + return false +} diff --git a/src/utils/path-resolve.ts b/src/utils/path-resolve.ts new file mode 100644 index 00000000..f0e43678 --- /dev/null +++ b/src/utils/path-resolve.ts @@ -0,0 +1,137 @@ +import { stat } from 'node:fs/promises' +import path from 'node:path' + +// @ts-ignore +import { globby } from 'globby' +import ignore from 'ignore' +// @ts-ignore This package provides no types +import { directories } from 'ignore-by-default' + +import type { SocketYml } from '@socketsecurity/config' +import type { SocketSdkReturnType } from '@socketsecurity/sdk' +import type { Options as GlobbyOptions } from 'globby' + +// There are a lot of possible folders that we should not be looking in and "ignore-by-default" helps us with defining those +const ignoreByDefault: readonly string[] = directories() + +const BASE_GLOBBY_OPTS: GlobbyOptions = { + absolute: true, + expandDirectories: false, + gitignore: true, + ignore: [...ignoreByDefault.map(item => '**/' + item)], + markDirectories: true, + unique: true +} + +export async function getPackageFiles( + cwd: string, + inputPaths: string[], + config: SocketYml | undefined, + supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'], + debugLog: typeof console.error +): Promise { + debugLog(`Globbed resolving ${inputPaths.length} paths:`, inputPaths) + + // TODO: Does not support `~/` paths + const entries = await globby(inputPaths, { + ...BASE_GLOBBY_OPTS, + cwd, + onlyFiles: false + }) + + debugLog( + `Globbed resolved ${inputPaths.length} paths to ${entries.length} paths:`, + entries + ) + + const packageFiles = await mapGlobResultToFiles(entries, supportedFiles) + + debugLog( + `Mapped ${entries.length} entries to ${packageFiles.length} files:`, + packageFiles + ) + + const includedPackageFiles = config?.projectIgnorePaths?.length + ? ignore() + .add(config.projectIgnorePaths) + .filter(packageFiles.map(item => path.relative(cwd, item))) + .map((item: string) => path.resolve(cwd, item)) + : packageFiles + + return includedPackageFiles +} + +export async function getPackageFilesFullScans( + cwd: string, + inputPaths: string[], + supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'], + debugLog: typeof console.error +): Promise { + debugLog(`Globbed resolving ${inputPaths.length} paths:`, inputPaths) + + // TODO: Does not support `~/` paths + const entries = await globby(inputPaths, { + ...BASE_GLOBBY_OPTS, + cwd, + onlyFiles: false + }) + + debugLog( + `Globbed resolved ${inputPaths.length} paths to ${entries.length} paths:`, + entries + ) + + const packageFiles = await mapGlobResultToFiles(entries, supportedFiles) + + debugLog( + `Mapped ${entries.length} entries to ${packageFiles.length} files:`, + packageFiles + ) + + return packageFiles +} + +export async function mapGlobResultToFiles( + entries: string[], + supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'] +): Promise { + const packageFiles = await Promise.all( + entries.map(entry => mapGlobEntryToFiles(entry, supportedFiles)) + ) + + const uniquePackageFiles = [...new Set(packageFiles.flat())] + + return uniquePackageFiles +} + +export async function mapGlobEntryToFiles( + entry: string, + supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'] +): Promise { + const jsSupported = supportedFiles['npm'] ?? {} + const jsLockFilePatterns = Object.values(jsSupported).map( + p => `**/${(p as { pattern: string }).pattern}` + ) + + const pyFilePatterns = Object.values(supportedFiles['pypi'] ?? {}).map( + p => `**/${(p as { pattern: string }).pattern}` + ) + + const goSupported = supportedFiles['golang'] ?? {} + const goSupplementalPatterns = Object.values(goSupported).map( + p => `**/${(p as { pattern: string }).pattern}` + ) + + const files = await globby( + [...jsLockFilePatterns, ...pyFilePatterns, ...goSupplementalPatterns], + { + ...BASE_GLOBBY_OPTS, + onlyFiles: true, + cwd: path.resolve( + (await stat(entry)).isDirectory() ? entry : path.dirname(entry) + ) + } + ) + + return files +} diff --git a/src/utils/sdk.ts b/src/utils/sdk.ts new file mode 100644 index 00000000..566d7f5d --- /dev/null +++ b/src/utils/sdk.ts @@ -0,0 +1,86 @@ +import fs from 'node:fs/promises' +import path from 'node:path' + +import { password } from '@inquirer/prompts' +import { SocketSdk, createUserAgentFromPkgJson } from '@socketsecurity/sdk' +import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent' +import isInteractive from 'is-interactive' + +import { AuthError } from './errors' +import { getSetting } from './settings' + +import type { SocketSdkOptions } from '@socketsecurity/sdk' + +const distPath = __dirname +const rootPath = path.resolve(distPath, '..') + +export const FREE_API_KEY = + 'sktsec_t_--RAN5U4ivauy4w37-6aoKyYPDt5ZbaT5JBVMqiwKo_api' + +// This API key should be stored globally for the duration of the CLI execution +let defaultKey: string | undefined + +export function getDefaultKey(): string | undefined { + defaultKey = + process.env['SOCKET_SECURITY_API_KEY'] || getSetting('apiKey') || defaultKey + return defaultKey +} + +// The API server that should be used for operations +let defaultAPIBaseUrl: string | undefined + +function getDefaultAPIBaseUrl(): string | undefined { + defaultAPIBaseUrl = + process.env['SOCKET_SECURITY_API_BASE_URL'] || + getSetting('apiBaseUrl') || + undefined + return defaultAPIBaseUrl +} + +// The API server that should be used for operations +let defaultApiProxy: string | undefined + +function getDefaultHTTPProxy(): string | undefined { + defaultApiProxy = + process.env['SOCKET_SECURITY_API_PROXY'] || + getSetting('apiProxy') || + undefined + return defaultApiProxy +} + +export async function setupSdk( + apiKey: string | undefined = getDefaultKey(), + apiBaseUrl: string | undefined = getDefaultAPIBaseUrl(), + proxy: string | undefined = getDefaultHTTPProxy() +): Promise { + if (typeof apiKey !== 'string' && isInteractive()) { + apiKey = await password({ + message: + 'Enter your Socket.dev API key (not saved, use socket login to persist)' + }) + defaultKey = apiKey + } + + if (!apiKey) { + throw new AuthError('You need to provide an API key') + } + + let agent: SocketSdkOptions['agent'] | undefined + + if (proxy) { + agent = { + http: new HttpProxyAgent({ proxy }), + https: new HttpsProxyAgent({ proxy }) + } + } + const packageJsonPath = path.join(rootPath, 'package.json') + const packageJson = await fs.readFile(packageJsonPath, 'utf8') + + const sdkOptions: SocketSdkOptions = { + agent, + baseUrl: apiBaseUrl, + userAgent: createUserAgentFromPkgJson(JSON.parse(packageJson)) + } + + return new SocketSdk(apiKey || '', sdkOptions) +} diff --git a/src/utils/settings.ts b/src/utils/settings.ts new file mode 100644 index 00000000..c3484c02 --- /dev/null +++ b/src/utils/settings.ts @@ -0,0 +1,68 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import * as os from 'node:os' +import * as path from 'node:path' + +import ora from 'ora' + +let dataHome: string | undefined = + process.platform === 'win32' + ? process.env['LOCALAPPDATA'] + : process.env['XDG_DATA_HOME'] + +if (!dataHome) { + if (process.platform === 'win32') throw new Error('missing %LOCALAPPDATA%') + const home = os.homedir() + dataHome = path.join( + home, + ...(process.platform === 'darwin' + ? ['Library', 'Application Support'] + : ['.local', 'share']) + ) +} + +const settingsPath = path.join(dataHome, 'socket', 'settings') + +interface Settings { + apiKey?: string | null + enforcedOrgs?: string[] | null + apiBaseUrl?: string | null + apiProxy?: string | null +} + +let settings: Settings = {} + +if (existsSync(settingsPath)) { + const raw = readFileSync(settingsPath, 'utf-8') + try { + settings = JSON.parse(Buffer.from(raw, 'base64').toString()) + } catch { + ora(`Failed to parse settings at ${settingsPath}`).warn() + } +} else { + mkdirSync(path.dirname(settingsPath), { recursive: true }) +} + +export function getSetting( + key: Key +): Settings[Key] { + return settings[key] +} + +let pendingSave = false + +export function updateSetting( + key: Key, + value: Settings[Key] +): void { + settings[key] = value + if (!pendingSave) { + pendingSave = true + process.nextTick(() => { + pendingSave = false + writeFileSync( + settingsPath, + Buffer.from(JSON.stringify(settings)).toString('base64') + ) + }) + } +} diff --git a/src/utils/type-helpers.ts b/src/utils/type-helpers.ts new file mode 100644 index 00000000..e802b2c8 --- /dev/null +++ b/src/utils/type-helpers.ts @@ -0,0 +1,8 @@ +export function isErrnoException( + value: unknown +): value is NodeJS.ErrnoException { + if (!(value instanceof Error)) { + return false + } + return (value as NodeJS.ErrnoException).code !== undefined +} diff --git a/test/.eslintrc b/test/.eslintrc index e9fbadb5..e2d0460b 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,8 +1,7 @@ { - "env": { - "mocha": true - }, "rules": { + "@typescript-eslint/no-floating-promises": 0, + "@typescript-eslint/no-misused-promises": 0, "@typescript-eslint/no-unused-expressions": 0, "node/no-unpublished-require": 0, "promise/prefer-await-to-then": 0 diff --git a/test/issue-rule-ux.test.js b/test/issue-rule-ux.test.js deleted file mode 100644 index f32cec50..00000000 --- a/test/issue-rule-ux.test.js +++ /dev/null @@ -1,317 +0,0 @@ -import assert from 'node:assert/strict' -import { describe, it } from 'node:test' - -import * as ux from '../lib/utils/issue-rules.cjs' - -describe('Issue Rule UX', () => { - it('should properly defer', () => { - const noEntriesLookup = ux.createIssueUXLookup({ - defaults: { - issueRules: { - fromDeferString: { - action: 'warn' - }, - fromUndefinedAction: { - action: 'warn' - }, - fromUndefinedIssueRule: { - action: 'warn' - }, - willError: { - action: 'error' - }, - willIgnore: { - action: 'ignore' - }, - willWarn: { - action: 'warn' - } - } - }, - entries: [{ - start: 'organization', - settings: { - organization: { - deferTo: 'repository', - issueRules: { - fromDeferString: { action: 'defer' }, - // @ts-ignore paranoia - fromUndefinedAction: { } - } - }, - repository: { - deferTo: null, - issueRules: { - fromMiddleConfig: { - action: 'warn' - } - } - } - } - }] - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'willError' } - }), { - block: true, - display: true, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'willIgnore' } - }), { - block: false, - display: false, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'willWarn' } - }), { - block: false, - display: true, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'fromDeferString' } - }), { - block: false, - display: true, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'fromUndefinedAction' } - }), { - block: false, - display: true, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'fromUndefinedIssueRule' } - }), { - block: false, - display: true, - }) - assert.deepEqual(noEntriesLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'fromMiddleConfig' } - }), { - block: false, - display: true, - }) - }) - it('should use error UX when missing keys', () => { - const emptyLookup = ux.createIssueUXLookup({ - defaults: { - issueRules: { - } - }, - entries: [] - }) - assert.deepEqual(emptyLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: '404' } - }), { - block: true, - display: true, - }) - }) - it('should use error/ignore UX when having boolean values instead of config', () => { - const booleanLookup = ux.createIssueUXLookup({ - defaults: { - issueRules: { - // @ts-ignore backcompat - defaultTrue: true, - // @ts-ignore backcompat - defaultFalse: false - } - }, - entries: [{ - start: 'organization', - settings: { - organization: { - issueRules: { - // @ts-ignore backcompat - orgTrue: true, - // @ts-ignore backcompat - orgFalse: false - } - } - } - }] - }) - assert.deepEqual(booleanLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'defaultTrue' } - }), { - block: true, - display: true, - }) - assert.deepEqual(booleanLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'orgTrue' } - }), { - block: true, - display: true, - }) - assert.deepEqual(booleanLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'defaultFalse' } - }), { - block: false, - display: false, - }) - assert.deepEqual(booleanLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'orgFalse' } - }), { - block: false, - display: false, - }) - }) - it('should use the maximal strength on multiple settings entries', () => { - const multiSettings = ux.createIssueUXLookup({ - defaults: { - issueRules: { - } - }, - entries: [ - { - start: 'start', - settings: { - start: { - deferTo: null, - issueRules: { - warn_then_error: { - action: 'warn' - }, - ignore_then_missing: { - action: 'ignore' - }, - ignore_then_defer: { - action: 'ignore' - } - } - } - } - }, - { - start: 'start', - settings: { - start: { - deferTo: null, - issueRules: { - warn_then_error: { - action: 'error' - }, - ignore_then_defer: { - action: 'defer' - } - } - } - } - } - ] - }) - assert.deepEqual(multiSettings({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'warn_then_error' } - }), { - block: true, - display: true, - }) - assert.deepEqual(multiSettings({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'ignore_then_missing' } - }), { - block: true, - display: true, - }) - assert.deepEqual(multiSettings({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'ignore_then_defer' } - }), { - block: true, - display: true, - }) - }) - it('should shadow defaults', () => { - const shadowedLookup = ux.createIssueUXLookup({ - defaults: { - issueRules: { - willWarn: { - action: 'warn' - } - } - }, - entries: [{ - start: 'organization', - settings: { - organization: { - deferTo: null, - issueRules: { - willWarn: { - action: 'ignore' - } - } - } - } - }] - }) - assert.deepEqual(shadowedLookup({ - package: { - name: 'bar', - version: '0.0.0' - }, - issue: { type: 'willWarn' } - }), { - block: false, - display: false, - }) - }) -}) diff --git a/test/issue-rule-ux.test.ts b/test/issue-rule-ux.test.ts new file mode 100644 index 00000000..66c62e55 --- /dev/null +++ b/test/issue-rule-ux.test.ts @@ -0,0 +1,369 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import * as ux from '../src/utils/issue-rules' + +describe('Issue Rule UX', () => { + it('should properly defer', () => { + const noEntriesLookup = ux.createIssueUXLookup({ + defaults: { + issueRules: { + fromDeferString: { + action: 'warn' + }, + fromUndefinedAction: { + action: 'warn' + }, + fromUndefinedIssueRule: { + action: 'warn' + }, + willError: { + action: 'error' + }, + willIgnore: { + action: 'ignore' + }, + willWarn: { + action: 'warn' + } + } + }, + entries: [ + { + start: 'organization', + settings: { + organization: { + deferTo: 'repository', + issueRules: { + fromDeferString: { action: 'defer' }, + // @ts-ignore paranoia + fromUndefinedAction: {} + } + }, + repository: { + deferTo: null, + issueRules: { + fromMiddleConfig: { + action: 'warn' + } + } + } + } + } + ] + }) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'willError' } + }), + { + block: true, + display: true + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'willIgnore' } + }), + { + block: false, + display: false + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'willWarn' } + }), + { + block: false, + display: true + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'fromDeferString' } + }), + { + block: false, + display: true + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'fromUndefinedAction' } + }), + { + block: false, + display: true + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'fromUndefinedIssueRule' } + }), + { + block: false, + display: true + } + ) + assert.deepEqual( + noEntriesLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'fromMiddleConfig' } + }), + { + block: false, + display: true + } + ) + }) + it('should use error UX when missing keys', () => { + const emptyLookup = ux.createIssueUXLookup({ + defaults: { + issueRules: {} + }, + entries: [] + }) + assert.deepEqual( + emptyLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: '404' } + }), + { + block: true, + display: true + } + ) + }) + it('should use error/ignore UX when having boolean values instead of config', () => { + const booleanLookup = ux.createIssueUXLookup({ + defaults: { + issueRules: { + // @ts-ignore backcompat + defaultTrue: true, + // @ts-ignore backcompat + defaultFalse: false + } + }, + entries: [ + { + start: 'organization', + settings: { + organization: { + issueRules: { + // @ts-ignore backcompat + orgTrue: true, + // @ts-ignore backcompat + orgFalse: false + } + } + } + } + ] + }) + assert.deepEqual( + booleanLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'defaultTrue' } + }), + { + block: true, + display: true + } + ) + assert.deepEqual( + booleanLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'orgTrue' } + }), + { + block: true, + display: true + } + ) + assert.deepEqual( + booleanLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'defaultFalse' } + }), + { + block: false, + display: false + } + ) + assert.deepEqual( + booleanLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'orgFalse' } + }), + { + block: false, + display: false + } + ) + }) + it('should use the maximal strength on multiple settings entries', () => { + const multiSettings = ux.createIssueUXLookup({ + defaults: { + issueRules: {} + }, + entries: [ + { + start: 'start', + settings: { + start: { + deferTo: null, + issueRules: { + warn_then_error: { + action: 'warn' + }, + ignore_then_missing: { + action: 'ignore' + }, + ignore_then_defer: { + action: 'ignore' + } + } + } + } + }, + { + start: 'start', + settings: { + start: { + deferTo: null, + issueRules: { + warn_then_error: { + action: 'error' + }, + ignore_then_defer: { + action: 'defer' + } + } + } + } + } + ] + }) + assert.deepEqual( + multiSettings({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'warn_then_error' } + }), + { + block: true, + display: true + } + ) + assert.deepEqual( + multiSettings({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'ignore_then_missing' } + }), + { + block: true, + display: true + } + ) + assert.deepEqual( + multiSettings({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'ignore_then_defer' } + }), + { + block: true, + display: true + } + ) + }) + it('should shadow defaults', () => { + const shadowedLookup = ux.createIssueUXLookup({ + defaults: { + issueRules: { + willWarn: { + action: 'warn' + } + } + }, + entries: [ + { + start: 'organization', + settings: { + organization: { + deferTo: null, + issueRules: { + willWarn: { + action: 'ignore' + } + } + } + } + } + ] + }) + assert.deepEqual( + shadowedLookup({ + package: { + name: 'bar', + version: '0.0.0' + }, + issue: { type: 'willWarn' } + }), + { + block: false, + display: false + } + ) + }) +}) diff --git a/test/path-resolve.test.js b/test/path-resolve.test.ts similarity index 58% rename from test/path-resolve.test.js rename to test/path-resolve.test.ts index 134995ab..862a0d3a 100644 --- a/test/path-resolve.test.js +++ b/test/path-resolve.test.ts @@ -4,13 +4,11 @@ import { afterEach, beforeEach, describe, it } from 'node:test' import mockFs from 'mock-fs' import nock from 'nock' -import { InputError } from '../lib/utils/errors.js' import { - fileExists, getPackageFiles, mapGlobEntryToFiles, - mapGlobResultToFiles, -} from '../lib/utils/path-resolve.js' + mapGlobResultToFiles +} from './dist/path-resolve' const globPatterns = { general: { @@ -61,17 +59,14 @@ const globPatterns = { } } -/** - * @template {any[]} A - * @template R - * @template {(...args: A) => Promise} Fn - * @param {Fn} fn - * @returns {Fn} - */ -const sortedPromise = (fn) => /** @type {Fn} */ (async (...args) => { - const result = await fn(...args) - return result.sort() -}) +type Fn = (...args: any[]) => Promise + +const sortedPromise = + (fn: Fn) => + async (...args: any[]) => { + const result = await fn(...args) + return result.sort() + } const sortedMapGlobEntry = sortedPromise(mapGlobEntryToFiles) @@ -92,41 +87,20 @@ describe('Path Resolve', () => { } }) - describe('fileExists()', () => { - beforeEach(() => { - mockFs({ - 'foo.txt': 'some content', - 'some-dir': { /* Empty directory */ }, - }) - }) - - it('should handle found files', async () => { - assert.equal(await fileExists('foo.txt'), true) - }) - - it('should handle missing files', async () => { - assert.equal(await fileExists('missing.txt'), false) - }) - - it('should throw when finding a folder', async () => { - await assert.rejects(fileExists('some-dir'), (e) => { - return e instanceof InputError && e.message.includes('Expected \'some-dir\' to be a file') - }) - }) - }) - describe('mapGlobEntryToFiles()', () => { describe('basic', () => { it('should skip irrelevant input', async () => { mockFs({ - '/foo.txt': 'some content', + '/foo.txt': 'some content' }) assert.deepEqual(await sortedMapGlobEntry('/foo.txt', globPatterns), []) }) it('should be lenient on oddities', async () => { mockFs({ - '/package.json': { /* Empty directory */ }, + '/package.json': { + /* Empty directory */ + } }) await assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), []) }) @@ -136,7 +110,7 @@ describe('Path Resolve', () => { it('should resolve package and lock file', async () => { mockFs({ '/package-lock.json': '{}', - '/package.json': '{}', + '/package.json': '{}' }) assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), [ '/package-lock.json', @@ -146,22 +120,26 @@ describe('Path Resolve', () => { it('should resolve package without lock file', async () => { mockFs({ - '/package.json': '{}', + '/package.json': '{}' }) - assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), ['/package.json']) + assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), [ + '/package.json' + ]) }) it('should not resolve lock file without package', async () => { mockFs({ - '/package-lock.json': '{}', + '/package-lock.json': '{}' }) - assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), ['/package-lock.json']) + assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), [ + '/package-lock.json' + ]) }) it('should support alternative lock files', async () => { mockFs({ '/yarn.lock': '{}', - '/package.json': '{}', + '/package.json': '{}' }) assert.deepEqual(await sortedMapGlobEntry('/', globPatterns), [ '/package.json', @@ -174,37 +152,41 @@ describe('Path Resolve', () => { it('should resolve package and lock file', async () => { mockFs({ '/package-lock.json': '{}', - '/package.json': '{}', + '/package.json': '{}' }) - assert.deepEqual(await sortedMapGlobEntry('/package.json', globPatterns), [ - '/package-lock.json', - '/package.json' - ]) + assert.deepEqual( + await sortedMapGlobEntry('/package.json', globPatterns), + ['/package-lock.json', '/package.json'] + ) }) it('should resolve package without lock file', async () => { mockFs({ - '/package.json': '{}', + '/package.json': '{}' }) - assert.strict.deepEqual(await sortedMapGlobEntry('/package.json', globPatterns), ['/package.json']) + assert.strict.deepEqual( + await sortedMapGlobEntry('/package.json', globPatterns), + ['/package.json'] + ) }) it('should validate the input file', async () => { mockFs({}) - return assert.rejects(sortedMapGlobEntry('/package.json', globPatterns), (err) => { - return err instanceof Error && err.message.includes('ENOENT') - }) + return await (assert.rejects( + sortedMapGlobEntry('/package.json', globPatterns), + (e: any) => e instanceof Error && e.message.includes('ENOENT') + ) as Promise) }) it('should support alternative lock files', async () => { mockFs({ '/yarn.lock': '{}', - '/package.json': '{}', + '/package.json': '{}' }) - assert.deepEqual(await sortedMapGlobEntry('/package.json', globPatterns), [ - '/package.json', - '/yarn.lock' - ]) + assert.deepEqual( + await sortedMapGlobEntry('/package.json', globPatterns), + ['/package.json', '/yarn.lock'] + ) }) }) @@ -212,18 +194,18 @@ describe('Path Resolve', () => { it('should resolve package and lock file', async () => { mockFs({ '/package-lock.json': '{}', - '/package.json': '{}', + '/package.json': '{}' }) - assert.deepEqual(await sortedMapGlobEntry('/package-lock.json', globPatterns), [ - '/package-lock.json', - '/package.json' - ]) + assert.deepEqual( + await sortedMapGlobEntry('/package-lock.json', globPatterns), + ['/package-lock.json', '/package.json'] + ) }) it('should support alternative lock files', async () => { mockFs({ '/yarn.lock': '{}', - '/package.json': '{}', + '/package.json': '{}' }) assert.deepEqual(await sortedMapGlobEntry('/yarn.lock', globPatterns), [ '/package.json', @@ -242,24 +224,30 @@ describe('Path Resolve', () => { '/foo/package.json': '{}', '/bar/yarn.lock': '{}', '/bar/package.json': '{}', - '/abc/package.json': '{}', + '/abc/package.json': '{}' }) - assert.deepEqual(await sortedMapGlobResult([ - '/', - '/foo/package-lock.json', - '/bar/package.json', - '/abc/', - '/abc/package.json' - ], globPatterns), [ - '/abc/package.json', - '/bar/package.json', - '/bar/yarn.lock', - '/foo/package-lock.json', - '/foo/package.json', - '/package-lock.json', - '/package.json' - ]) + assert.deepEqual( + await sortedMapGlobResult( + [ + '/', + '/foo/package-lock.json', + '/bar/package.json', + '/abc/', + '/abc/package.json' + ], + globPatterns + ), + [ + '/abc/package.json', + '/bar/package.json', + '/bar/yarn.lock', + '/foo/package-lock.json', + '/foo/package.json', + '/package-lock.json', + '/package.json' + ] + ) }) }) @@ -272,40 +260,44 @@ describe('Path Resolve', () => { '/foo/package.json': '{}', '/bar/yarn.lock': '{}', '/bar/package.json': '{}', - '/abc/package.json': '{}', + '/abc/package.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['**/*'], - undefined, - globPatterns, - () => {} - ), [ - '/abc/package.json', - '/bar/package.json', - '/bar/yarn.lock', - '/foo/package-lock.json', - '/foo/package.json', - '/package-lock.json', - '/package.json', - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['**/*'], + undefined, + globPatterns, + () => {} + ), + [ + '/abc/package.json', + '/bar/package.json', + '/bar/yarn.lock', + '/foo/package-lock.json', + '/foo/package.json', + '/package-lock.json', + '/package.json' + ] + ) }) it('should handle a "." inputPath', async () => { mockFs({ - '/package.json': '{}', + '/package.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['.'], - undefined, - globPatterns, - () => {} - ), [ - '/package.json', - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['.'], + undefined, + globPatterns, + () => {} + ), + ['/package.json'] + ) }) it('should respect ignores from socket config', async () => { @@ -313,28 +305,24 @@ describe('Path Resolve', () => { '/bar/package-lock.json': '{}', '/bar/package.json': '{}', '/foo/package-lock.json': '{}', - '/foo/package.json': '{}', + '/foo/package.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['**/*'], - { - version: 2, - projectIgnorePaths: [ - '/bar/*', - '!/bar/package.json', - ], - issueRules: {}, - githubApp: {} - }, - globPatterns, - () => {} - ), [ - '/bar/package.json', - '/foo/package-lock.json', - '/foo/package.json' - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['**/*'], + { + version: 2, + projectIgnorePaths: ['/bar/*', '!/bar/package.json'], + issueRules: {}, + githubApp: {} + }, + globPatterns, + () => {} + ), + ['/bar/package.json', '/foo/package-lock.json', '/foo/package.json'] + ) }) it('should respect .gitignore', async () => { @@ -343,19 +331,19 @@ describe('Path Resolve', () => { '/bar/package-lock.json': '{}', '/bar/package.json': '{}', '/foo/package-lock.json': '{}', - '/foo/package.json': '{}', + '/foo/package.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['**/*'], - undefined, - globPatterns, - () => {} - ), [ - '/foo/package-lock.json', - '/foo/package.json' - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['**/*'], + undefined, + globPatterns, + () => {} + ), + ['/foo/package-lock.json', '/foo/package.json'] + ) }) it('should always ignore some paths', async () => { @@ -370,19 +358,19 @@ describe('Path Resolve', () => { '/coverage/some/dir/package.json': {}, '/node_modules/@socketsecurity/cli/package.json': '{}', '/foo/package-lock.json': '{}', - '/foo/package.json': '{}', + '/foo/package.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['**/*'], - undefined, - globPatterns, - () => {} - ), [ - '/foo/package-lock.json', - '/foo/package.json' - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['**/*'], + undefined, + globPatterns, + () => {} + ), + ['/foo/package-lock.json', '/foo/package.json'] + ) }) it('should ignore irrelevant matches', async () => { @@ -390,19 +378,19 @@ describe('Path Resolve', () => { '/foo/package-foo.json': '{}', '/foo/package-lock.json': '{}', '/foo/package.json': '{}', - '/foo/random.json': '{}', + '/foo/random.json': '{}' }) - assert.deepEqual(await sortedGetPackageFiles( - '/', - ['**/*'], - undefined, - globPatterns, - () => {} - ), [ - '/foo/package-lock.json', - '/foo/package.json' - ]) + assert.deepEqual( + await sortedGetPackageFiles( + '/', + ['**/*'], + undefined, + globPatterns, + () => {} + ), + ['/foo/package-lock.json', '/foo/package.json'] + ) }) }) }) diff --git a/test/socket-cdxgen.test.js b/test/socket-cdxgen.test.ts similarity index 52% rename from test/socket-cdxgen.test.js rename to test/socket-cdxgen.test.ts index e2293494..91645dd1 100644 --- a/test/socket-cdxgen.test.js +++ b/test/socket-cdxgen.test.ts @@ -1,27 +1,35 @@ import assert from 'node:assert/strict' +import { spawnSync } from 'node:child_process' import path from 'node:path' import { describe, it } from 'node:test' -import { fileURLToPath } from 'node:url' -import { $ } from 'execa' +import type { SpawnSyncOptionsWithStringEncoding } from 'node:child_process' -const cwd = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') -// Use `node: true` instead of `preferLocal: true` to make Ubuntu CI tests happy. -const localOpts = { cwd, node: true, reject: false } +const testPath = __dirname +const rootPath = path.resolve(testPath, '..') +const distPath = path.join(rootPath, 'dist') +const spawnOpts: SpawnSyncOptionsWithStringEncoding = { + cwd: distPath, + encoding: 'utf8' +} describe('Socket cdxgen command', async () => { it('should forwards known commands to cdxgen', async () => { for (const command of ['-h', '--help']) { - const ret = await $(localOpts)`cli.js cdxgen ${command}` + const ret = spawnSync('./cli.js', ['cdxgen', command], spawnOpts) assert(ret.stdout.startsWith('cdxgen'), 'forwards commands to cdxgen') } }) it('should not forward unknown commands to cdxgen', async () => { for (const command of ['-u', '--unknown']) { - const ret = await $(localOpts)`cli.js cdxgen ${command}` + const ret = spawnSync('./cli.js', ['cdxgen', command], spawnOpts) assert(ret.stderr.startsWith(`Unknown argument: ${command}`), 'singular') } - const ret = await $(localOpts)`cli.js cdxgen -u -h --unknown` + const ret = spawnSync( + './cli.js', + ['cdxgen', '-u', '-h', '--unknown'], + spawnOpts + ) assert(ret.stderr.startsWith('Unknown arguments: -u, --unknown'), 'plural') }) }) diff --git a/test/socket-npm-fixtures/lacking-typosquat/package.json b/test/socket-npm-fixtures/lacking-typosquat/package.json index 9664f260..18a1e415 100644 --- a/test/socket-npm-fixtures/lacking-typosquat/package.json +++ b/test/socket-npm-fixtures/lacking-typosquat/package.json @@ -1,4 +1,3 @@ { - "dependencies": { - } + "dependencies": {} } diff --git a/test/socket-npm.test.cjs b/test/socket-npm.test.cjs new file mode 100644 index 00000000..65b57815 --- /dev/null +++ b/test/socket-npm.test.cjs @@ -0,0 +1,43 @@ +'use strict' + +const assert = require('node:assert/strict') +const { spawnSync } = require('node:child_process') +const path = require('node:path') +const { describe, it } = require('node:test') + +const testPath = __dirname +const entryPath = path.resolve(testPath, '../dist/cli.js') + +function spawnNPM({ cwd, installDir, args = [] }) { + return spawnSync(process.execPath, [entryPath, 'npm', ...args], { + cwd: path.join(testPath, cwd), + encoding: 'utf8', + env: { + // make sure we don't borrow TTY from parent + SOCKET_SECURITY_TTY_IPC: undefined, + PATH: `${path.join(installDir, 'node_modules', '.bin')}:${process.env.PATH}` + }, + stdio: ['pipe', 'pipe', 'pipe'] + }) +} + +// these aliases are defined in package.json +for (const npm of ['npm8', 'npm10']) { + const installDir = path.join(testPath, `/socket-npm-fixtures/${npm}`) + spawnSync('npm', ['install'], { + cwd: installDir, + stdio: 'ignore' + }) + + describe(`Socket npm wrapper for ${npm}`, () => { + it('should bail on new typosquat', () => { + const ret = spawnNPM({ + cwd: './socket-npm-fixtures/lacking-typosquat', + installDir, + args: ['i', 'bowserify'] + }) + assert.equal(ret.status, 1) + assert.ok(ret.stderr.includes('Unable to prompt')) + }) + }) +} diff --git a/test/socket-npm.test.js b/test/socket-npm.test.js deleted file mode 100644 index 289e8691..00000000 --- a/test/socket-npm.test.js +++ /dev/null @@ -1,52 +0,0 @@ -import assert from 'node:assert/strict' -import { spawnSync } from 'node:child_process' -import path from 'node:path' -import { describe, it } from 'node:test' -import { fileURLToPath } from 'node:url' - -// these aliases are defined in package.json -const npms = ['npm8', 'npm10'] - -const cli = fileURLToPath(new URL('../cli.js', import.meta.url)) - -for (const npm of npms) { - const installDir = fileURLToPath(new URL(`./socket-npm-fixtures/${npm}`, import.meta.url)) - spawnSync('npm', ['install'], { - cwd: installDir, - stdio: 'inherit' - }) - console.error(process.execPath) - describe(`Socket npm wrapper for ${npm}`, () => { - /** - * Run relative to current file - * @param {object} param0 - * @param {string} param0.cwd - * @param {string[]} [param0.args] - * @param {import('node:child_process').ProcessEnvOptions['env'] | undefined} [param0.env] - * @returns {import('node:child_process').SpawnSyncReturns} - */ - function spawnNPM ({ cwd, args = [], env }) { - const pwd = fileURLToPath(new URL(cwd, import.meta.url)) - return spawnSync(process.execPath, [cli, 'npm', ...args], { - cwd: pwd, - encoding: 'utf-8', - env: { - ...(env ?? process.env), - // make sure we don't borrow TTY from parent - SOCKET_SECURITY_TTY_IPC: undefined, - // @ts-ignore - PATH: `${path.join(installDir, 'node_modules', '.bin')}:${process.env.PATH}` - }, - stdio: ['pipe', 'pipe', 'pipe'] - }) - } - it('should bail on new typosquat', () => { - const ret = spawnNPM({ - cwd: fileURLToPath(new URL('./socket-npm-fixtures/lacking-typosquat', import.meta.url)), - args: ['i', 'bowserify'] - }) - assert.equal(ret.status, 1) - assert.match(ret.stderr, /Unable to prompt/) - }) - }) -} diff --git a/test/test-helpers.test.js b/test/test-helpers.test.ts similarity index 69% rename from test/test-helpers.test.js rename to test/test-helpers.test.ts index c54e16d2..5d0d18ec 100644 --- a/test/test-helpers.test.js +++ b/test/test-helpers.test.ts @@ -1,13 +1,16 @@ import assert from 'node:assert/strict' -import fs from 'node:fs' +import { readFileSync } from 'node:fs' +import path from 'node:path' import { describe, it } from 'node:test' -import * as helpers from '../lib/utils/type-helpers.cjs' +import * as helpers from '../src/utils/type-helpers' + +const testPath = __dirname describe('Error Narrowing', () => { it('should properly detect node errors', () => { try { - fs.readFileSync(new URL('./enoent', import.meta.url)) + readFileSync(path.join(testPath, './enoent')) } catch (e) { assert.equal(helpers.isErrnoException(e), true) } diff --git a/lib/shadow/translations.json b/translations.json similarity index 96% rename from lib/shadow/translations.json rename to translations.json index 6119cafb..d7672fd0 100644 --- a/lib/shadow/translations.json +++ b/translations.json @@ -177,11 +177,11 @@ "emoji": "⚠️" }, "extraneousDependency": { - "description": "Package optionally loads a dependency which is not specified within any of the package.json dependency fields. It may inadvertently be importing dependencies specified by other packages.", + "description": "Package optionally loads a dependency which is not specified within any of the package.tson dependency fields. It may inadvertently be importing dependencies specified by other packages.", "props": { "name": "Name" }, - "suggestion": "Specify all optionally loaded dependencies in optionalDependencies within package.json.", + "suggestion": "Specify all optionally loaded dependencies in optionalDependencies within package.tson.", "title": "Extraneous dependency", "emoji": "⚠️" }, @@ -191,7 +191,7 @@ "filePath": "File path", "packageName": "Package name" }, - "suggestion": "Remove the dependency specified by a file resolution string from package.json and update any bare name imports that referenced it before to use relative path strings.", + "suggestion": "Remove the dependency specified by a file resolution string from package.tson and update any bare name imports that referenced it before to use relative path strings.", "title": "File dependency", "emoji": "⚠️" }, @@ -274,9 +274,9 @@ "emoji": "🤖" }, "invalidPackageJSON": { - "description": "Package has an invalid package.json and can cause installation problems if you try to use it.", - "suggestion": "Fix syntax errors in the invalid package.json and publish a new version with a valid package.json. Consumers can use npm overrides to force a version that does not have this problem if one exists.", - "title": "Invalid package.json", + "description": "Package has an invalid package.tson and can cause installation problems if you try to use it.", + "suggestion": "Fix syntax errors in the invalid package.tson and publish a new version with a valid package.tson. Consumers can use npm overrides to force a version that does not have this problem if one exists.", + "title": "Invalid package.tson", "emoji": "🤒" }, "invisibleChars": { @@ -367,17 +367,17 @@ "emoji": "🫥" }, "missingDependency": { - "description": "A required dependency is not declared in package.json and may prevent the package from working.", + "description": "A required dependency is not declared in package.tson and may prevent the package from working.", "props": { "name": "Name" }, - "suggestion": "The package should define the missing dependency inside of package.json and publish a new version. Consumers may have to install the missing dependency themselves as long as the dependency remains missing. If the dependency is optional, add it to optionalDependencies and handle the missing case.", + "suggestion": "The package should define the missing dependency inside of package.tson and publish a new version. Consumers may have to install the missing dependency themselves as long as the dependency remains missing. If the dependency is optional, add it to optionalDependencies and handle the missing case.", "title": "Missing dependency", "emoji": "⚠️" }, "missingLicense": { "description": "Package does not have a license and consumption legal status is unknown.", - "suggestion": "A new version of the package should be published that includes a valid SPDX license in a license file, pacakge.json license field or mentioned in the README.", + "suggestion": "A new version of the package should be published that includes a valid SPDX license in a license file, pacakge.tson license field or mentioned in the README.", "title": "Missing license", "emoji": "⚠️" }, @@ -386,7 +386,7 @@ "props": { "licenseId": "License Id" }, - "suggestion": "A new version of the package should be published that includes a single license. Consumers may seek clarification from the package author. Ensure that the license details are consistent across the LICENSE file, package.json license field and license details mentioned in the README.", + "suggestion": "A new version of the package should be published that includes a single license. Consumers may seek clarification from the package author. Ensure that the license details are consistent across the LICENSE file, package.tson license field and license details mentioned in the README.", "title": "Mixed license", "emoji": "⚠️" }, @@ -431,14 +431,14 @@ "emoji": "⚠️" }, "noAuthorData": { - "description": "Package does not specify a list of contributors or an author in package.json.", - "suggestion": "Add a author field or contributors array to package.json.", + "description": "Package does not specify a list of contributors or an author in package.tson.", + "suggestion": "Add a author field or contributors array to package.tson.", "title": "No contributors or author data", "emoji": "⚠️" }, "noBugTracker": { - "description": "Package does not have a linked bug tracker in package.json.", - "suggestion": "Add a bugs field to package.json. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#bugs", + "description": "Package does not have a linked bug tracker in package.tson.", + "suggestion": "Add a bugs field to package.tson. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#bugs", "title": "No bug tracker", "emoji": "⚠️" }, @@ -450,7 +450,7 @@ }, "noRepository": { "description": "Package does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.", - "suggestion": "Add a repository field to package.json. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#repository", + "suggestion": "Add a repository field to package.tson. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#repository", "title": "No repository", "emoji": "⚠️" }, @@ -468,7 +468,7 @@ }, "noWebsite": { "description": "Package does not have a website.", - "suggestion": "Add a homepage field to package.json. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#homepage", + "suggestion": "Add a homepage field to package.tson. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#homepage", "title": "No website", "emoji": "⚠️" }, @@ -490,7 +490,7 @@ }, "nonSPDXLicense": { "description": "Package contains a non-standard license somewhere. Please read carefully before using.", - "suggestion": "Package should adopt a standard SPDX license consistently across all license locations (LICENSE files, package.json license fields, and READMEs).", + "suggestion": "Package should adopt a standard SPDX license consistently across all license locations (LICENSE files, package.tson license fields, and READMEs).", "title": "Non SPDX license", "emoji": "⚠️" }, @@ -515,7 +515,7 @@ "emoji": "⚠️" }, "peerDependency": { - "description": "Package specifies peer dependencies in package.json.", + "description": "Package specifies peer dependencies in package.tson.", "props": { "name": "Name" }, @@ -608,7 +608,7 @@ "props": { "possibleLicenseId": "Possible license id" }, - "suggestion": "Add a LICENSE file that matches the license field in package.json. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#license", + "suggestion": "Add a LICENSE file that matches the license field in package.tson. https://docs.npmjs.com/cli/v8/configuring-npm/package-json#license", "title": "Unclear license", "emoji": "⚠️" }, @@ -638,7 +638,7 @@ }, "unsafeCopyright": { "description": "Package contains a copyright but no license. Using this package may expose you to legal risk.", - "suggestion": "Clarify the license type by adding a license field to package.json and a LICENSE file.", + "suggestion": "Clarify the license type by adding a license field to package.tson and a LICENSE file.", "title": "Unsafe copyright", "emoji": "⚠️" }, diff --git a/tsconfig.json b/tsconfig.json index 2a001917..f9fd6ce2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,37 +1,4 @@ { - "extends": "@tsconfig/node20/tsconfig.json", - "files": [ - "cli.js" - ], - "include": [ - "lib/utils/issue-rules.cjs", - "lib/**/*", - "test/**/*" - ], - "exclude": [ - "lib/shadow/**" - ], - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "noEmit": true, - "resolveJsonModule": true, - "module": "NodeNext", - "moduleResolution": "nodenext", - "lib": ["ES2022"], - "target": "es2022", - "types": ["node"], - - /* New checks being tried out */ - "exactOptionalPropertyTypes": true, - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noUncheckedIndexedAccess": true, - - /* Additional checks */ - "forceConsistentCasingInFileNames": true, - "noUnusedLocals": true, - "noUnusedParameters": true - } + "extends": "./.config/tsconfig.rollup.json", + "include": ["src/**/*.ts"] }