diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d5ddb0ea..7fa2543b 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -31,8 +31,4 @@ jobs: run: npm install - name: benchmark - run: node benchmark/index.js - env: - RIMRAF_TEST_START_CHAR: a - RIMRAF_TEST_END_CHAR: f - RIMRAF_TEST_DEPTH: 5 + run: node benchmark/index.js --start-char=a --end-char=f --depth=5 diff --git a/.gitignore b/.gitignore index 5ae2c2bf..78c72add 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ !/typedoc.json !/tsconfig-*.json !/.prettierignore +/benchmark-*.json +!eslint.config.mjs diff --git a/.prettierignore b/.prettierignore index d289a030..47415c69 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,4 +8,4 @@ /tap-snapshots /.nyc_output /coverage -/benchmark +/benchmark/old-rimraf diff --git a/benchmark/create-fixture.js b/benchmark/create-fixture.js index 99e7348a..3ce172ef 100644 --- a/benchmark/create-fixture.js +++ b/benchmark/create-fixture.js @@ -1,24 +1,25 @@ -const { writeFile: writeFile_ } = require('fs') -const writeFile = async (path, data) => new Promise((res, rej) => - writeFile_(path, data, er => er ? rej(er) : res())) -const { mkdirp } = require('mkdirp') -const { resolve } = require('path') +import { writeFile as writeFile_ } from 'fs' +const writeFile = async (path, data) => + new Promise((res, rej) => + writeFile_(path, data, er => (er ? rej(er) : res())), + ) +import { mkdirp } from 'mkdirp' +import { resolve } from 'path' const create = async (path, start, end, maxDepth, depth = 0) => { await mkdirp(path) const promises = [] for (let i = start; i <= end; i++) { const c = String.fromCharCode(i) - if (depth < maxDepth && (i-start >= depth)) + if (depth < maxDepth && i - start >= depth) await create(resolve(path, c), start, end, maxDepth, depth + 1) - else - promises.push(writeFile(resolve(path, c), c)) + else promises.push(writeFile(resolve(path, c), c)) } await Promise.all(promises) return path } -module.exports = async ({ start, end, depth, name }) => { - const path = resolve(__dirname, 'fixtures', name, 'test') +export default async ({ start, end, depth, name }) => { + const path = resolve(import.meta.dirname, 'fixtures', name, 'test') return await create(path, start.charCodeAt(0), end.charCodeAt(0), depth) } diff --git a/benchmark/index.js b/benchmark/index.js index 90928a20..acf1c85a 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -1,18 +1,132 @@ -const cases = require('./rimrafs.js') -const runTest = require('./run-test.js') -const print = require('./print-results.js') +import rimrafs, { names as rimrafNames } from './rimrafs.js' +import runTest, { names as runTestNames } from './run-test.js' +import parse from './parse-results.js' +import { sync as rimrafSync } from '../dist/esm/index.js' +import { parseArgs } from 'util' +import assert from 'assert' +import { readFileSync, writeFileSync } from 'fs' + +const parseOptions = () => { + const { values } = parseArgs({ + options: { + cases: { + type: 'string', + short: 'c', + multiple: true, + }, + 'omit-cases': { + type: 'string', + short: 'o', + multiple: true, + }, + 'start-char': { + type: 'string', + default: 'a', + }, + 'end-char': { + type: 'string', + default: 'f', + }, + depth: { + type: 'string', + default: '5', + }, + iterations: { + type: 'string', + default: '7', + }, + compare: { + type: 'string', + }, + save: { + type: 'boolean', + }, + }, + }) + + if (values.compare) { + const { results, options } = JSON.parse( + readFileSync(values.compare, 'utf8'), + ) + return { + ...options, + save: false, + compare: results, + } + } + + const allNames = new Set([...rimrafNames, ...runTestNames]) + const partition = (name, defaults = [new Set(), new Set()]) => { + const options = values[name] ?? [] + assert( + options.every(c => allNames.has(c)), + new TypeError(`invalid ${name}`, { + cause: { + found: options, + wanted: [...allNames], + }, + }), + ) + const found = options.reduce( + (acc, k) => { + acc[rimrafNames.has(k) ? 0 : 1].add(k) + return acc + }, + [new Set(), new Set()], + ) + return [ + found[0].size ? found[0] : defaults[0], + found[1].size ? found[1] : defaults[1], + ] + } + + const cases = partition('cases', [rimrafNames, runTestNames]) + for (const [i, omitCase] of Object.entries(partition('omit-cases'))) { + for (const o of omitCase) { + cases[i].delete(o) + } + } + + return { + rimraf: [...cases[0]], + runTest: [...cases[1]], + start: values['start-char'], + end: values['end-char'], + depth: +values.depth, + iterations: +values.iterations, + save: values.save, + compare: null, + } +} -const rimraf = require('../') const main = async () => { // cleanup first. since the windows impl works on all platforms, // use that. it's only relevant if the folder exists anyway. - rimraf.sync(__dirname + '/fixtures') - const results = {} - for (const name of Object.keys(cases)) { - results[name] = await runTest(name) + rimrafSync(import.meta.dirname + '/fixtures') + const data = {} + const { save, compare, ...options } = parseOptions() + for (const [name, rimraf] of Object.entries(rimrafs)) { + if (options.rimraf.includes(name)) { + data[name] = await runTest(name, rimraf, options) + } + } + rimrafSync(import.meta.dirname + '/fixtures') + const { results, entries } = parse(data, compare) + if (save) { + const f = `benchmark-${Date.now()}.json` + writeFileSync(f, JSON.stringify({ options, results }, 0, 2)) + console.log(`results saved to ${f}`) + } else { + console.log(JSON.stringify(results, null, 2)) } - rimraf.sync(__dirname + '/fixtures') - return results + console.table( + entries + .sort(([, { mean: a }], [, { mean: b }]) => a - b) + .reduce((set, [key, val]) => { + set[key] = val + return set + }, {}), + ) } -main().then(print) +main() diff --git a/benchmark/parse-results.js b/benchmark/parse-results.js new file mode 100644 index 00000000..12d39dbf --- /dev/null +++ b/benchmark/parse-results.js @@ -0,0 +1,64 @@ +const sum = list => list.reduce((a, b) => a + b) +const mean = list => sum(list) / list.length +const median = list => list.sort()[Math.floor(list.length / 2)] +const max = list => list.sort()[list.length - 1] +const min = list => list.sort()[0] +const sqrt = n => Math.pow(n, 0.5) +const variance = list => { + const m = mean(list) + return mean(list.map(n => Math.pow(n - m, 2))) +} +const stddev = list => { + const v = variance(list) + if (isNaN(v)) { + throw new Error('wat?', { cause: { list, v } }) + } + return sqrt(variance(list)) +} +const comp = (v1, v2) => { + if (v1 === undefined) { + return {} + } + return { + 'old mean': v1.mean, + '% +/-': round(((v2.mean - v1.mean) / v1.mean) * 100), + } +} + +const round = n => Math.round(n * 1e3) / 1e3 + +const nums = list => ({ + mean: round(mean(list)), + median: round(median(list)), + stddev: round(stddev(list)), + max: round(max(list)), + min: round(min(list)), +}) + +const printEr = er => `${er.code ? er.code + ': ' : ''}${er.message}` + +const parseResults = (data, compare) => { + const results = {} + const table = {} + + for (const [rimrafName, rimrafData] of Object.entries(data)) { + results[rimrafName] = {} + for (const [runTestName, { times, fails }] of Object.entries(rimrafData)) { + const result = nums(times) + const failures = fails.map(printEr) + results[rimrafName][runTestName] = { ...result, times, failures } + table[`${rimrafName} ${runTestName}`] = { + ...result, + ...comp(compare?.[rimrafName]?.[runTestName], result), + ...(failures.length ? { failures: failures.join('\n') } : {}), + } + } + } + + return { + results, + entries: Object.entries(table), + } +} + +export default parseResults diff --git a/benchmark/print-results.js b/benchmark/print-results.js deleted file mode 100644 index 831e3309..00000000 --- a/benchmark/print-results.js +++ /dev/null @@ -1,65 +0,0 @@ -const sum = list => list.reduce((a, b) => a + b) -const mean = list => sum(list) / list.length -const median = list => list.sort()[Math.floor(list.length / 2)] -const max = list => list.sort()[list.length - 1] -const min = list => list.sort()[0] -const sqrt = n => Math.pow(n, 0.5) -const variance = list => { - const m = mean(list) - return mean(list.map(n => Math.pow(n - m, 2))) -} -const stddev = list => { - const v = variance(list) - if (isNaN(v)) { - console.error({list, v}) - throw new Error('wat?') - } - return sqrt(variance(list)) -} - -const round = n => Math.round(n * 1e3) / 1e3 - -const nums = list => ({ - mean: round(mean(list)), - median: round(median(list)), - stddev: round(stddev(list)), - max: round(max(list)), - min: round(min(list)), -}) - -const printEr = er => `${er.code ? er.code + ': ' : ''}${er.message}` -const failures = list => list.length === 0 ? {} - : { failures: list.map(er => printEr(er)).join('\n') } - -const table = results => { - const table = {} - for (const [type, data] of Object.entries(results)) { - table[`${type} sync`] = { - ...nums(data.syncTimes), - ...failures(data.syncFails), - } - table[`${type} async`] = { - ...nums(data.asyncTimes), - ...failures(data.asyncFails), - } - table[`${type} parallel`] = { - ...nums(data.paraTimes), - ...failures(data.paraFails), - } - } - // sort by mean time - return Object.entries(table) - .sort(([, {mean:a}], [, {mean:b}]) => a - b) - .reduce((set, [key, val]) => { - set[key] = val - return set - }, {}) -} - -const print = results => { - console.log(JSON.stringify(results, 0, 2)) - console.log('Results sorted by fastest mean value') - console.table(table(results)) -} - -module.exports = print diff --git a/benchmark/rimrafs.js b/benchmark/rimrafs.js index aefbabfe..8de19cea 100644 --- a/benchmark/rimrafs.js +++ b/benchmark/rimrafs.js @@ -1,24 +1,25 @@ // just disable the glob option, and promisify it, for apples-to-apples comp +import { promisify } from 'util' +import { createRequire } from 'module' const oldRimraf = () => { - const {promisify} = require('util') - const oldRimraf = require('./old-rimraf') + const oldRimraf = createRequire(import.meta.filename)('./old-rimraf') const pOldRimraf = promisify(oldRimraf) const rimraf = path => pOldRimraf(path, { disableGlob: true }) const sync = path => oldRimraf.sync(path, { disableGlob: true }) return Object.assign(rimraf, { sync }) } -const { spawn, spawnSync } = require('child_process') +import { spawn, spawnSync } from 'child_process' const systemRmRf = () => { - const rimraf = path => new Promise((res, rej) => { - const proc = spawn('rm', ['-rf', path]) - proc.on('close', (code, signal) => { - if (code || signal) - rej(Object.assign(new Error('command failed'), { code, signal })) - else - res() + const rimraf = path => + new Promise((res, rej) => { + const proc = spawn('rm', ['-rf', path]) + proc.on('close', (code, signal) => { + if (code || signal) + rej(Object.assign(new Error('command failed'), { code, signal })) + else res() + }) }) - }) rimraf.sync = path => { const result = spawnSync('rm', ['-rf', path]) if (result.status || result.signal) { @@ -31,10 +32,13 @@ const systemRmRf = () => { return rimraf } -module.exports = { - native: require('../').native, - posix: require('../').posix, - windows: require('../').windows, +import { native, posix, windows } from 'rimraf' +const cases = { + native, + posix, + windows, old: oldRimraf(), system: systemRmRf(), } +export const names = new Set(Object.keys(cases)) +export default cases diff --git a/benchmark/run-test.js b/benchmark/run-test.js index a9fe6da4..f64a74ee 100644 --- a/benchmark/run-test.js +++ b/benchmark/run-test.js @@ -1,100 +1,135 @@ -const START = process.env.RIMRAF_TEST_START_CHAR || 'a' -const END = process.env.RIMRAF_TEST_END_CHAR || 'f' -const DEPTH = +process.env.RIMRAF_TEST_DEPTH || 5 -const N = +process.env.RIMRAF_TEST_ITERATIONS || 7 +import create from './create-fixture.js' -const cases = require('./rimrafs.js') - -const create = require('./create-fixture.js') - -const hrToMS = hr => Math.round(hr[0]*1e9 + hr[1]) / 1e6 +const TESTS = { + sync: 'sync', + async: 'async', + parallel: 'parallel', +} -const runTest = async (type) => { - const rimraf = cases[type] - if (!rimraf) - throw new Error('unknown rimraf type: ' + type) +const hrToMS = hr => Math.round(hr[0] * 1e9 + hr[1]) / 1e6 - const opt = { - start: START, - end: END, - depth: DEPTH, - } - console.error(`\nrunning test for ${type}, iterations=${N} %j...`, opt) +const runTest = async ( + type, + rimraf, + { runTest: cases, start, end, depth, iterations }, +) => { + console.error(`\nrunning test for ${type}, %j`, { + start, + end, + depth, + iterations, + }) // first, create all fixtures const syncPaths = [] const asyncPaths = [] const paraPaths = [] - process.stderr.write('creating fixtures...') - for (let i = 0; i < N; i++) { + process.stderr.write('creating fixtures') + for (let i = 0; i < iterations; i++) { const [syncPath, asyncPath, paraPath] = await Promise.all([ - create({ name: `${type}/sync/${i}`, ...opt }), - create({ name: `${type}/async/${i}`, ...opt }), - create({ name: `${type}/para/${i}`, ...opt }), + cases.includes(TESTS.sync) ? + create({ name: `${type}/sync/${i}`, start, end, depth }) + : null, + cases.includes(TESTS.async) ? + create({ name: `${type}/async/${i}`, start, end, depth }) + : null, + cases.includes(TESTS.parallel) ? + create({ name: `${type}/para/${i}`, start, end, depth }) + : null, ]) - syncPaths.push(syncPath) - asyncPaths.push(asyncPath) - paraPaths.push(paraPath) + syncPath && syncPaths.push(syncPath) + asyncPath && asyncPaths.push(asyncPath) + paraPath && paraPaths.push(paraPath) process.stderr.write('.') } - console.error('done!') + process.stderr.write('done!\n') const syncTimes = [] const syncFails = [] - process.stderr.write('running sync tests...') - const startSync = process.hrtime() - for (const path of syncPaths) { - const start = process.hrtime() - try { - rimraf.sync(path) - syncTimes.push(hrToMS(process.hrtime(start))) - } catch (er) { - syncFails.push(er) + if (syncPaths.length) { + process.stderr.write('running sync tests') + const startSync = process.hrtime() + for (const path of syncPaths) { + const start = process.hrtime() + try { + rimraf.sync(path) + syncTimes.push(hrToMS(process.hrtime(start))) + } catch (er) { + syncFails.push(er) + } + process.stderr.write('.') } - process.stderr.write('.') + const syncTotal = hrToMS(process.hrtime(startSync)) + console.error('done! (%j ms, %j failed)', syncTotal, syncFails.length) } - const syncTotal = hrToMS(process.hrtime(startSync)) - console.error('done! (%j ms, %j failed)', syncTotal, syncFails.length) const asyncTimes = [] const asyncFails = [] - process.stderr.write('running async tests...') - const startAsync = process.hrtime() - for (const path of asyncPaths) { - const start = process.hrtime() - await rimraf(path).then( - () => asyncTimes.push(hrToMS(process.hrtime(start))), - er => asyncFails.push(er) - ).then(() => process.stderr.write('.')) + if (asyncPaths.length) { + process.stderr.write('running async tests') + const startAsync = process.hrtime() + for (const path of asyncPaths) { + const start = process.hrtime() + await rimraf(path).then( + () => asyncTimes.push(hrToMS(process.hrtime(start))), + er => asyncFails.push(er), + ) + process.stderr.write('.') + } + const asyncTotal = hrToMS(process.hrtime(startAsync)) + console.error('done! (%j ms, %j failed)', asyncTotal, asyncFails.length) } - const asyncTotal = hrToMS(process.hrtime(startAsync)) - console.error('done! (%j ms, %j failed)', asyncTotal, asyncFails.length) const paraTimes = [] const paraFails = [] - process.stderr.write('running parallel tests...') - const startPara = process.hrtime() - const paraRuns = [] - for (const path of paraPaths) { - const start = process.hrtime() - paraRuns.push(rimraf(path).then( - () => paraTimes.push(hrToMS(process.hrtime(start))), - er => paraFails.push(er) - ).then(() => process.stderr.write('.'))) + if (paraPaths.length) { + process.stderr.write('running parallel tests') + const startPara = process.hrtime() + const paraRuns = [] + for (const path of paraPaths) { + process.stderr.write('.') + const start = process.hrtime() + paraRuns.push( + rimraf(path).then( + () => paraTimes.push(hrToMS(process.hrtime(start))), + er => paraFails.push(er), + ), + ) + } + await Promise.all(paraRuns) + const paraTotal = hrToMS(process.hrtime(startPara)) + console.error('done! (%j ms, %j failed)', paraTotal, paraFails.length) } - await Promise.all(paraRuns) - const paraTotal = hrToMS(process.hrtime(startPara)) - console.error('done! (%j ms, %j failed)', paraTotal, paraFails.length) + process.stderr.write('\n') // wait a tick to let stderr to clear return Promise.resolve().then(() => ({ - syncTimes, - syncFails, - asyncTimes, - asyncFails, - paraTimes, - paraFails, + ...(syncPaths.length ? + { + sync: { + times: syncTimes, + fails: syncFails, + }, + } + : {}), + ...(asyncPaths.length ? + { + async: { + times: asyncTimes, + fails: asyncFails, + }, + } + : {}), + ...(paraPaths.length ? + { + parallel: { + times: paraTimes, + fails: paraFails, + }, + } + : {}), })) } -module.exports = runTest +export const names = new Set(Object.values(TESTS)) +export default runTest diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..308e9d4a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,55 @@ +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { + ignores: [ + '.tap/', + 'tap-snapshots/', + 'dist/', + 'benchmark/', + 'eslint.config.mjs', + 'map.js', + ], + }, + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + { + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/test/**/*.ts'], + rules: { + 'no-empty': 'off', + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/ban-ts-comment': [ + 'error', + { + minimumDescriptionLength: 0, + }, + ], + '@typescript-eslint/no-floating-promises': [ + 'error', + { + allowForKnownSafeCalls: [ + 'test', + 'rejects', + 'resolveMatch', + 'resolves', + ].map(name => ({ + name, + from: 'package', + package: 'tap', + })), + }, + ], + }, + }, +) diff --git a/libtap-settings.js b/libtap-settings.js deleted file mode 100644 index 5dba8c20..00000000 --- a/libtap-settings.js +++ /dev/null @@ -1,9 +0,0 @@ -// use this module for tap's recursive directory removal, so that -// the windows tests don't fail with EBUSY. -const { rimraf } = require('./') -module.exports = { - rmdirRecursiveSync: path => rimraf.sync(path), - rmdirRecursive(path, cb) { - rimraf(path, {}).then(() => cb(), cb) - }, -} diff --git a/map.js b/map.js index a08c7876..3881ff35 100644 --- a/map.js +++ b/map.js @@ -1 +1,7 @@ -module.exports = test => test.replace(/^test/, 'lib') +export default test => + test.startsWith('/test/integration/') ? null : ( + (test.endsWith('/bin.ts') ? test.replace(/\.ts$/, '.mts') : test).replace( + /^test/, + 'src', + ) + ) diff --git a/package-lock.json b/package-lock.json index a9dfa573..eafd0c49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,18 +10,23 @@ "license": "ISC", "dependencies": { "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" + "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" }, "devDependencies": { - "@types/node": "^20.14.10", + "@eslint/js": "^9.12.0", + "@types/eslint__js": "^8.42.3", + "@types/node": "^22.7.5", + "eslint": "^9.12.0", "mkdirp": "^3.0.1", - "prettier": "^3.3.2", - "tap": "^20.0.3", - "tshy": "^2.0.1", - "typedoc": "^0.26.3" + "prettier": "^3.3.3", + "tap": "^21.0.1", + "tshy": "^3.0.2", + "typedoc": "^0.26.8", + "typescript": "^5.6.3", + "typescript-eslint": "^8.8.1" }, "engines": { "node": "20 || >=22" @@ -35,6 +40,7 @@ "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" @@ -47,19 +53,22 @@ "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 + "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 + "dev": true, + "license": "MIT" }, "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" }, @@ -67,6 +76,227 @@ "node": ">=12" } }, + "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/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/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/@eslint/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/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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/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/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -88,6 +318,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": "*", @@ -128,6 +359,7 @@ "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" } @@ -137,6 +369,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -146,31 +379,73 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.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==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "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/@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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "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==", "dev": true, + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -187,6 +462,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -195,12 +471,14 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -218,6 +496,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -227,6 +506,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -242,6 +522,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, + "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -258,15 +539,17 @@ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, + "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==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", + "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", @@ -281,10 +564,11 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -296,8 +580,38 @@ "bin": { "glob": "dist/esm/bin.mjs" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -308,6 +622,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, + "license": "ISC", "dependencies": { "which": "^4.0.0" }, @@ -320,6 +635,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -329,6 +645,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -344,6 +661,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", "dev": true, + "license": "ISC", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -353,6 +671,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", @@ -370,6 +689,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -379,6 +699,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -393,25 +714,75 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", + "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", + "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", + "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", + "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", "dev": true, + "license": "MIT", "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "dev": true, + "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==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -424,6 +795,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -433,6 +805,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -442,6 +815,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", @@ -459,6 +833,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^2.2.1" @@ -472,6 +847,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", @@ -482,250 +858,264 @@ } }, "node_modules/@tapjs/after": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-2.0.3.tgz", - "integrity": "sha512-I5H3lFvevFF2hDykvNKGXyUNrzg9qL001an1AzUKxe/LtL9m6qcxa1tCm9LLjvJcacZHPsQZHPX2QyVqFkoeLQ==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/after-each": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-3.0.3.tgz", - "integrity": "sha512-gg+TwlnnNhXkyWMLW9iF7O2U01RYLBwzvsLM2ZwP8f8yS/sH6rjTxYxik6v+mQFvvsoawWrZ5X594pVJUQp80A==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/asserts": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-3.0.3.tgz", - "integrity": "sha512-Jfb+Fdq6nIbBDi4qPDPrptG3kkPd1C3ia+6Uw3foIbHvWARfJek+HkmZAy72Hv9QPlkMDjl37i7w2p64Xr0Fyg==", + "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": "3.0.0", + "@tapjs/stack": "4.0.0", "is-actual-promise": "^1.0.1", - "tcompare": "8.0.0", + "tcompare": "9.0.0", "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/before": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-3.0.3.tgz", - "integrity": "sha512-F8tKS3hezg/t0C/sz92/a+Hil5YbOpDSrVTBAv4jyxX4e1Bni7gsniwJ/MwI5BMhZI6UWl8/xReFYBrfGHRXpg==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/before-each": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-3.0.3.tgz", - "integrity": "sha512-da1l+rh29x/E+HS6lJBSaHtiuwatFHaHgIBE4/8osU7yTFTZRaA2MjDEfb6gT3/bVZEAae1sVzDkyFhGoMCBkg==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/chdir": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-2.0.3.tgz", - "integrity": "sha512-WromiRwubX4K941tGWK0WBOPSu5tRd6JLSUo73ZPDPT48HIypjFG+TBKEiDAjsCcPQ/DUE0fefqVIeJPy+RVIQ==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/config": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-4.0.3.tgz", - "integrity": "sha512-9az/JQ3pqcutanbUPcBNdV0UAZJtajA7r+m6YQ66IPriUM9TUa68+p3iwK5OP0wkEVaY3dS811DiVtkZ4m63bg==", + "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": "3.0.3", - "@tapjs/test": "3.0.3", + "@tapjs/core": "4.0.0", + "@tapjs/test": "4.0.0", "chalk": "^5.2.0", - "jackspeak": "^3.4.0", + "jackspeak": "^4.0.1", "polite-json": "^5.0.0", - "tap-yaml": "3.0.0", - "walk-up-path": "^3.0.1" + "tap-yaml": "4.0.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3", - "@tapjs/test": "3.0.3" + "@tapjs/core": "4.0.0", + "@tapjs/test": "4.0.0" } }, "node_modules/@tapjs/core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-3.0.3.tgz", - "integrity": "sha512-Vgg1UpE+pNTylXKoxK7k+LOYVLGis14wxzH7+vTMT5H57aF9NAyGJN1kenHyOFA/ML45TofgKsQY2e6EM8whzA==", + "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": "3.0.0", - "@tapjs/test": "3.0.3", + "@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": "17.0.0", - "tap-yaml": "3.0.0", - "tcompare": "8.0.0", + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0", "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" } }, "node_modules/@tapjs/error-serdes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-3.0.0.tgz", - "integrity": "sha512-+dVgpnD412aKGhu0w6ND2nSRHytClNR68jdeO7ww2NXv0bCroqEF+1uGLsiqnocwlAL2yheaF04zY+bthTfOgA==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tapjs/filter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-3.0.3.tgz", - "integrity": "sha512-7qcFmsR906AgC71APjpOXnwVCqWsaACCnkTClaprP1owrVmoeCOIRqSH6qkfp5sE1cbNwr5tamaPUBFwqH6xWw==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/fixture": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-3.0.3.tgz", - "integrity": "sha512-wnVqaduQiERRQS7bqKEvBEwhAITOfj8rKjYuEsuNFCRpgTFwXopp8u3c7YONSmJljXCU6lMSXBV3+4zjBlXlJA==", + "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": "^5.0.5" + "rimraf": "^6.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/intercept": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-3.0.3.tgz", - "integrity": "sha512-axAkkf3Cc5dsC5cGVvlU5gjV63uSEjUv3WpctDeqPDof1Ryx50sXMWazu7s58kevAvtu3CBQXmbBR6hqpls74g==", + "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": "2.0.3", - "@tapjs/stack": "3.0.0" + "@tapjs/after": "3.0.0", + "@tapjs/stack": "4.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-3.0.3.tgz", - "integrity": "sha512-Uyopi0mWivBvPvKlrH1n6GxCtJrq38wwuGH78EaHPOocsC/hmMlJYqzvtjXE3R/cJXSrgAxHjaD4JshsmEPN6Q==", + "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": "2.0.3", - "@tapjs/stack": "3.0.0", - "resolve-import": "^1.4.5", - "walk-up-path": "^3.0.1" + "@tapjs/after": "3.0.0", + "@tapjs/stack": "4.0.0", + "resolve-import": "^2.0.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/node-serialize": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-3.0.3.tgz", - "integrity": "sha512-pOKGzdly9fe4PT5ztrouuLLliB5RPOdrmsIJi7OwE0jlBXigkGxqv4PgTX4nAv7QbcDlyCX6AKKLRoqEQVyPXA==", + "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": "3.0.0", - "@tapjs/stack": "3.0.0", - "tap-parser": "17.0.0" + "@tapjs/error-serdes": "4.0.0", + "@tapjs/stack": "4.0.0", + "tap-parser": "18.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/processinfo": { @@ -733,6 +1123,7 @@ "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", @@ -744,13 +1135,14 @@ } }, "node_modules/@tapjs/reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-3.0.3.tgz", - "integrity": "sha512-7Hy7KOzFodcVstMbh7IdaRbeukMSFJsimlTIisdv/Fm+N3ljWhi1OvOZgZVtspO506rw+ZCPZ0/Y8ynYZUo7QA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.0.1.tgz", + "integrity": "sha512-bS7pOGV99GAhYY/LxNxL4Qq0Ldi4k8DZDC25gonVQrNUW2zYpSBerhrnsz1KDXdaD2OKDtSR8oW2FxUyL6n83A==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/config": "4.0.3", - "@tapjs/stack": "3.0.0", + "@tapjs/config": "5.0.0", + "@tapjs/stack": "4.0.0", "chalk": "^5.2.0", "ink": "^5.0.1", "minipass": "^7.0.4", @@ -759,50 +1151,52 @@ "prismjs-terminal": "^1.2.3", "react": "^18.2.0", "string-length": "^6.0.0", - "tap-parser": "17.0.0", - "tap-yaml": "3.0.0", - "tcompare": "8.0.0" + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/run": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-3.0.3.tgz", - "integrity": "sha512-Xcci3PNf8mmRc+3ULglduB2utJ+tGeKRXOze0FkzSYVj7ZX5Kv2nSTqIXzy/de3BeCtDY09g/H0qeGvcgHPb4w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.0.1.tgz", + "integrity": "sha512-jll1tiMhxFajfHIGBF/eK+Ob0uEqXBnQq/ONNc9heqcCtcXhC4iYGzhoK+sw03MxwrbRtNomQ7dRqiT0IOjS6w==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "2.0.3", - "@tapjs/before": "3.0.3", - "@tapjs/config": "4.0.3", + "@tapjs/after": "3.0.0", + "@tapjs/before": "4.0.0", + "@tapjs/config": "5.0.0", "@tapjs/processinfo": "^3.1.8", - "@tapjs/reporter": "3.0.3", - "@tapjs/spawn": "3.0.3", - "@tapjs/stdin": "3.0.3", - "@tapjs/test": "3.0.3", + "@tapjs/reporter": "4.0.1", + "@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": "^10.3.16", + "glob": "^11.0.0", "minipass": "^7.0.4", "mkdirp": "^3.0.1", "opener": "^1.5.2", "pacote": "^18.0.6", - "resolve-import": "^1.4.5", - "rimraf": "^5.0.5", + "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": "17.0.0", - "tap-yaml": "3.0.0", - "tcompare": "8.0.0", + "tap-parser": "18.0.0", + "tap-yaml": "4.0.0", + "tcompare": "9.0.0", "trivial-deferred": "^2.0.0", "which": "^4.0.0" }, @@ -810,36 +1204,13 @@ "tap-run": "dist/esm/index.js" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" - } - }, - "node_modules/@tapjs/run/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/run/node_modules/isexe": { @@ -847,6 +1218,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -856,6 +1228,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -867,210 +1240,188 @@ } }, "node_modules/@tapjs/snapshot": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-3.0.3.tgz", - "integrity": "sha512-3Z5sgNnb2kX+evjHwlcOew8r+Z9yJfN4kxs0N6EQpW6FxpD6/sE9oVgHMEIFAw4HzezL3DlBjlJF1VLpZmuogg==", + "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": "8.0.0", + "tcompare": "9.0.0", "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/spawn": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-3.0.3.tgz", - "integrity": "sha512-PbOzjxqSP/H9SY5HmM2NN0s8YxcG3xTXUBIpCN31LxVvVGj/B/R1R8ard8AUxwJVb8kS1nqKEwEotvNIm4CGVA==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/stack": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-3.0.0.tgz", - "integrity": "sha512-TrwR50bVb5Q6Vzc2XSoGwpkTchqcL3RU146jyEIG6GMfcg0WVNCtZaNu4e6wGFBnXvbRXbQ994bSpcBBSy3OBw==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tapjs/stdin": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-3.0.3.tgz", - "integrity": "sha512-ETyKj7twhxIdJky0SDpjA2niy1LIvPU/tr3tgw30IV+9LXC7pinCwbLLIoNDHSODfKSDQ0+QwRQLmlgugL3fUg==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/test": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-3.0.3.tgz", - "integrity": "sha512-RB0Ca6MG4PEUUkGofYz0HWAaGoqgTFsfpRd15g/ax3+GaA2umZL3iHjhcpTt2TM1uUdN8bzUyOUlk6r1k/P3fQ==", + "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": "2.0.3", - "@tapjs/after-each": "3.0.3", - "@tapjs/asserts": "3.0.3", - "@tapjs/before": "3.0.3", - "@tapjs/before-each": "3.0.3", - "@tapjs/chdir": "2.0.3", - "@tapjs/filter": "3.0.3", - "@tapjs/fixture": "3.0.3", - "@tapjs/intercept": "3.0.3", - "@tapjs/mock": "3.0.3", - "@tapjs/node-serialize": "3.0.3", - "@tapjs/snapshot": "3.0.3", - "@tapjs/spawn": "3.0.3", - "@tapjs/stdin": "3.0.3", - "@tapjs/typescript": "2.0.3", - "@tapjs/worker": "3.0.3", - "glob": "^10.3.16", - "jackspeak": "^3.4.0", + "@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": "^1.4.5", - "rimraf": "^5.0.5", - "sync-content": "^1.0.1", - "tap-parser": "17.0.0", - "tshy": "^1.16.1", + "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": "^3.0.1" + "walk-up-path": "^4.0.0" }, "bin": { "generate-tap-test-class": "dist/esm/build.mjs" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" - } - }, - "node_modules/@tapjs/test/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@tapjs/core": "4.0.0" } }, - "node_modules/@tapjs/test/node_modules/tshy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-1.18.0.tgz", - "integrity": "sha512-FQudIujBazHRu7CVPHKQE9/Xq1Wc7lezxD/FCnTXx2PTcnoSN32DVpb/ZXvzV2NJBTDB3XKjqX8Cdm+2UK1DlQ==", + "node_modules/@tapjs/test/node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, - "dependencies": { - "chalk": "^5.3.0", - "chokidar": "^3.6.0", - "foreground-child": "^3.1.1", - "minimatch": "^9.0.4", - "mkdirp": "^3.0.1", - "polite-json": "^5.0.0", - "resolve-import": "^1.4.5", - "rimraf": "^5.0.1", - "sync-content": "^1.0.2", - "typescript": "5", - "walk-up-path": "^3.0.1" - }, + "license": "Apache-2.0", "bin": { - "tshy": "dist/esm/index.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "16 >=16.17 || 18 >=18.15.0 || >=20.6.1" + "node": ">=14.17" } }, "node_modules/@tapjs/typescript": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-2.0.3.tgz", - "integrity": "sha512-rakQwZtAcfOIrRxLV4H2ugseKLTHbjJfVwkMXQbhgmAHiwRazJwVyZTdAdL+IX9+SN1vimtWw/JImufMdgBTPg==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "node_modules/@tapjs/worker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-3.0.3.tgz", - "integrity": "sha512-Or8B0yyMRd8A6cvckTXitc9Dvw6um15sGCv2ICR4QZzTdahjlL2uiG+FUfIOd1oSSOM0E3aCVk53sGVVViEjuQ==", + "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": ">= 18.6.0" + "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "3.0.3" + "@tapjs/core": "4.0.0" } }, "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 + "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 + "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 + "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 + "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==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -1080,6 +1431,7 @@ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.4" @@ -1088,11 +1440,40 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -1101,28 +1482,259 @@ "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 + "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" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", + "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", + "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", + "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", + "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", + "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", + "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", + "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", + "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -1139,11 +1751,22 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -1156,6 +1779,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -1168,6 +1792,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1181,15 +1806,34 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "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/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": { "environment": "^1.0.0" }, @@ -1239,7 +1883,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", @@ -1252,6 +1897,7 @@ "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" } @@ -1261,6 +1907,7 @@ "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" }, @@ -1312,6 +1959,7 @@ "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", "dev": true, + "license": "ISC", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.3", @@ -1341,10 +1989,11 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -1364,10 +2013,11 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -1379,13 +2029,64 @@ "bin": { "glob": "dist/esm/bin.mjs" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/cacache/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -1398,6 +2099,28 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1427,6 +2150,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -1436,6 +2160,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1445,6 +2170,7 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1457,6 +2183,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -1472,6 +2199,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -1484,16 +2212,18 @@ } }, "node_modules/cli-truncate/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==", - "dev": true + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" }, "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": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -1510,6 +2240,7 @@ "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", "get-east-asian-width": "^1.0.0", @@ -1527,6 +2258,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1541,6 +2273,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1550,6 +2283,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1564,13 +2298,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1580,6 +2316,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1594,6 +2331,7 @@ "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" }, @@ -1606,6 +2344,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1623,6 +2362,7 @@ "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, + "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -1646,17 +2386,37 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "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 + "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.20.0 || ^14.13.1 || >=16.0.0" } @@ -1697,11 +2457,43 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -1721,6 +2513,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -1743,6 +2536,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1752,6 +2546,7 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -1763,13 +2558,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1779,15 +2576,255 @@ "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/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "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/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "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" } @@ -1796,7 +2833,69 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/fill-range": { "version": "7.1.1", @@ -1826,6 +2925,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -1859,13 +2979,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -1891,13 +3013,15 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1907,6 +3031,7 @@ "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" }, @@ -1967,31 +3092,6 @@ "node": ">= 18" } }, - "node_modules/glob/node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", - "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/glob/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==", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/glob/node_modules/minimatch": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.0.tgz", @@ -2006,26 +3106,32 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/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==", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", @@ -2036,11 +3142,50 @@ "node": ">=8" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -2052,19 +3197,33 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -2078,6 +3237,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -2091,6 +3251,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2099,11 +3260,22 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/ignore-walk": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -2111,6 +3283,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2125,6 +3314,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2132,11 +3322,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "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": { "@alcalzone/ansi-tokenize": "^0.1.3", "ansi-escapes": "^7.0.0", @@ -2181,22 +3382,25 @@ } }, "node_modules/ink/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==", - "dev": true + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" }, "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==", - "dev": true + "dev": true, + "license": "ISC" }, "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": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -2214,6 +3418,7 @@ "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", @@ -2231,6 +3436,7 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -2243,7 +3449,8 @@ "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 + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -2271,6 +3478,7 @@ "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" }, @@ -2295,6 +3503,7 @@ "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" }, @@ -2309,7 +3518,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", @@ -2325,6 +3535,7 @@ "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" } @@ -2339,6 +3550,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -2348,6 +3560,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -2362,6 +3575,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -2371,52 +3585,111 @@ } }, "node_modules/jackspeak": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz", - "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==", - "dev": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || >=18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "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/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, - "engines": [ - "node >= 0.2.0" - ] + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } }, "node_modules/linkify-it": { "version": "5.0.0", @@ -2446,13 +3719,22 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "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", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2461,13 +3743,11 @@ } }, "node_modules/lru-cache": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.1.tgz", - "integrity": "sha512-8h/JsUc/2+Dm9RPJnBAmObGnUqTMmsIKThxixMLOkrebSihRhTV0wLD/8BSk6OU6Pbj8hiDTbsI3fLjBJSlhDg==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "engines": { - "node": "14 >= 14.21 || 16 >= 16.20 || 18 >=18.20 || 20 || >=22" - } + "license": "ISC" }, "node_modules/lunr": { "version": "2.3.9", @@ -2480,6 +3760,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -2494,13 +3775,15 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "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", "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", @@ -2536,17 +3819,158 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2579,6 +4003,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -2591,6 +4016,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -2608,6 +4034,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2620,6 +4047,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2632,6 +4060,7 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2644,6 +4073,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2656,6 +4086,7 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2668,6 +4099,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2680,6 +4112,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -2693,6 +4126,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2719,22 +4153,32 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -2742,9 +4186,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -2755,10 +4199,11 @@ } }, "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -2770,9 +4215,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -2782,17 +4224,42 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/node-gyp/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/node-gyp/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/node-gyp/node_modules/which": { @@ -2800,6 +4267,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -2815,6 +4283,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, @@ -2830,6 +4299,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -2853,6 +4323,7 @@ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -2865,6 +4336,7 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -2877,15 +4349,17 @@ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -2901,6 +4375,7 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, + "license": "ISC", "dependencies": { "ignore-walk": "^6.0.4" }, @@ -2909,10 +4384,11 @@ } }, "node_modules/npm-pick-manifest": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz", - "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", "dev": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -2928,6 +4404,7 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/redact": "^2.0.0", "jsonparse": "^1.3.1", @@ -2947,6 +4424,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -2957,15 +4435,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "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", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3001,6 +4511,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -3012,15 +4523,17 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" }, "node_modules/pacote": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -3047,11 +4560,25 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "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" } @@ -3074,21 +4601,30 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, + "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": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -3106,6 +4642,7 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -3122,11 +4659,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "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" }, @@ -3142,6 +4690,7 @@ "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" } @@ -3151,6 +4700,7 @@ "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", @@ -3168,6 +4718,7 @@ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3177,6 +4728,7 @@ "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" }, @@ -3188,13 +4740,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -3203,6 +4757,27 @@ "node": ">=10" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -3212,11 +4787,33 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/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" }, @@ -3229,6 +4826,7 @@ "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", @@ -3243,6 +4841,7 @@ "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", @@ -3257,13 +4856,15 @@ "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "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" @@ -3287,49 +4888,45 @@ "node": ">=8.10.0" } }, + "node_modules/regex": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", + "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", + "dev": true, + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve-import": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-1.4.5.tgz", - "integrity": "sha512-HXb4YqODuuXT7Icq1Z++0g2JmhgbUHSs3VT2xR83gqvAPUikYT2Xk+562KHQgiaNkbBOlPddYrDLsC44qQggzw==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "glob": "^10.3.3", - "walk-up-path": "^3.0.1" - }, + "license": "MIT", "engines": { - "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/resolve-import/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", + "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": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "glob": "^11.0.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3340,6 +4937,7 @@ "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", "signal-exit": "^3.0.2" @@ -3355,63 +4953,80 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/rimraf": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", - "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, + "license": "MIT", "engines": { - "node": "14 >=14.20 || 16 >=16.20 || >=18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "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": { - "glob": "dist/esm/bin.mjs" + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/scheduler": { @@ -3419,6 +5034,7 @@ "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" } @@ -3455,12 +5071,17 @@ } }, "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", + "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/core": "1.10.3", + "@shikijs/core": "1.22.0", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, @@ -3480,6 +5101,7 @@ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", @@ -3497,6 +5119,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -3513,6 +5136,7 @@ "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": { "get-east-asian-width": "^1.0.0" }, @@ -3528,6 +5152,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -3538,6 +5163,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -3552,6 +5178,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -3561,11 +5188,23 @@ "node": ">= 14" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3575,35 +5214,40 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -3616,6 +5260,7 @@ "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" }, @@ -3628,6 +5273,7 @@ "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" }, @@ -3700,6 +5346,21 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -3734,6 +5395,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3747,113 +5421,95 @@ } }, "node_modules/sync-content": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-1.0.2.tgz", - "integrity": "sha512-znd3rYiiSxU3WteWyS9a6FXkTA/Wjk8WQsOyzHbineeL837dLn3DA4MRhsIX3qGcxDMH6+uuFV4axztssk7wEQ==", + "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": "^10.2.6", + "glob": "^11.0.0", "mkdirp": "^3.0.1", - "path-scurry": "^1.9.2", - "rimraf": "^5.0.1" - }, - "bin": { - "sync-content": "dist/mjs/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sync-content/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0", + "rimraf": "^6.0.0", + "tshy": "^3.0.0" }, "bin": { - "glob": "dist/esm/bin.mjs" + "sync-content": "dist/esm/bin.mjs" }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/tap/-/tap-20.0.3.tgz", - "integrity": "sha512-1D9pFte9MvmBsDxtCMYaWF7qtJj848lyFkhtLef945c1MEK8i8o/pwaU1cZzhK5DCfQihhDaCPahyBwnCAEMJQ==", - "dev": true, - "dependencies": { - "@tapjs/after": "2.0.3", - "@tapjs/after-each": "3.0.3", - "@tapjs/asserts": "3.0.3", - "@tapjs/before": "3.0.3", - "@tapjs/before-each": "3.0.3", - "@tapjs/chdir": "2.0.3", - "@tapjs/core": "3.0.3", - "@tapjs/filter": "3.0.3", - "@tapjs/fixture": "3.0.3", - "@tapjs/intercept": "3.0.3", - "@tapjs/mock": "3.0.3", - "@tapjs/node-serialize": "3.0.3", - "@tapjs/run": "3.0.3", - "@tapjs/snapshot": "3.0.3", - "@tapjs/spawn": "3.0.3", - "@tapjs/stdin": "3.0.3", - "@tapjs/test": "3.0.3", - "@tapjs/typescript": "2.0.3", - "@tapjs/worker": "3.0.3", - "resolve-import": "^1.4.5" + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.0.1.tgz", + "integrity": "sha512-FE8H5Nt2mKU96DX4XgjqBkKzMcxvVkmbKhaNWOk2lUNRpqJNKqBOO5R6q7shr7JoUh1DHwdNWmppg8vWXQh2lQ==", + "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.1", + "@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": ">= 18.6.0" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap-parser": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-17.0.0.tgz", - "integrity": "sha512-Na7kB4ML7T77abJtYIlXh/aJcz54Azv0iAtOaDnLqsL4uWjU40uNFIFnZ5IvnGTuCIk5M6vjx7ZsceNGc1mcag==", + "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": "3.0.0" + "tap-yaml": "4.0.0" }, "bin": { "tap-parser": "bin/cmd.cjs" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" } }, "node_modules/tap-yaml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-3.0.0.tgz", - "integrity": "sha512-qtbgXJqE9xdWqlE520y+vG4c1lgqWrDHN7Y2YcrV1XudLuc2Y5aMXhAyPBGl57h8MNoprvL/mAJiISUIadvS9w==", + "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.3.0" + "yaml-types": "^0.4.0" }, "engines": { - "node": ">= 18.6.0" + "node": "20 || >=22" } }, "node_modules/tar": { @@ -3861,6 +5517,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3878,6 +5535,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3890,6 +5548,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3902,6 +5561,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } @@ -3911,6 +5571,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -3919,16 +5580,17 @@ } }, "node_modules/tcompare": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-8.0.0.tgz", - "integrity": "sha512-sKu3LKg6WM6/pVmhPL/kTlXZKksQkKAhoqQ6JEtJ3FNY0BJ0H37M5zPcU5QcMkRUm4im9vppda0PyWzSCfgCig==", + "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": ">= 18.6.0" + "node": "20 || >=22" } }, "node_modules/test-exclude": { @@ -3936,6 +5598,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", @@ -3946,10 +5609,11 @@ } }, "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.4.tgz", - "integrity": "sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -3961,13 +5625,50 @@ "bin": { "glob": "dist/esm/bin.mjs" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3980,38 +5681,80 @@ "node": ">=8.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "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": "ISC", "engines": { "node": ">= 8" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tshy": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-2.0.1.tgz", - "integrity": "sha512-U5fC+3pMaGfmULhPTVpxKMd62AcX13yfsFrjhAP/daTLG6LFRLIuxqYOmkejJ4MT/s5bEa29+1Jy/9mXkMiMfA==", + "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": "^9.0.4", + "minimatch": "^10.0.0", "mkdirp": "^3.0.1", "polite-json": "^5.0.0", - "resolve-import": "^1.4.5", - "rimraf": "^5.0.1", - "sync-content": "^1.0.2", - "typescript": "5", - "walk-up-path": "^3.0.1" + "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": "16 >=16.17 || 18 >=18.15.0 || >=20.6.1" + "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/tuf-js": { @@ -4019,6 +5762,7 @@ "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/models": "2.0.1", "debug": "^4.3.4", @@ -4028,11 +5772,25 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "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==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -4041,16 +5799,17 @@ } }, "node_modules/typedoc": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.3.tgz", - "integrity": "sha512-6d2Sw9disvvpdk4K7VNjKr5/3hzijtfQVHRthhDqJgnhMHy1wQz4yPMJVKXElvnZhFr0nkzo+GzjXDTRV5yLpg==", + "version": "0.26.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.8.tgz", + "integrity": "sha512-QBF0BMbnNeUc6U7pRHY7Jb8pjhmiNWZNQT8LU6uk9qP9t3goP9bJptdlNqMC0wBB2w9sQrxjZt835bpRSSq1LA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", - "shiki": "^1.9.1", - "yaml": "^2.4.5" + "shiki": "^1.16.2", + "yaml": "^2.5.1" }, "bin": { "typedoc": "bin/typedoc" @@ -4059,14 +5818,15 @@ "node": ">= 18" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4075,6 +5835,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz", + "integrity": "sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.8.1", + "@typescript-eslint/parser": "8.8.1", + "@typescript-eslint/utils": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -4082,16 +5866,18 @@ "dev": true }, "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==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "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", "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, + "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -4104,6 +5890,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -4111,11 +5898,95 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "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" } @@ -4124,13 +5995,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -4145,6 +6018,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4155,6 +6029,7 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -4165,15 +6040,50 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true + "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/which": { "version": "2.0.2", @@ -4194,6 +6104,7 @@ "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": { "string-width": "^7.0.0" }, @@ -4205,16 +6116,18 @@ } }, "node_modules/widest-line/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==", - "dev": true + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" }, "node_modules/widest-line/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": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -4227,6 +6140,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -4324,6 +6247,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -4345,6 +6269,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -4353,13 +6278,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -4368,10 +6295,11 @@ } }, "node_modules/yaml-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.3.0.tgz", - "integrity": "sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==", + "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" @@ -4385,6 +6313,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4403,6 +6332,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -4412,6 +6342,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4420,13 +6351,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4436,6 +6369,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4450,6 +6384,7 @@ "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" }, @@ -4473,7 +6408,19 @@ "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 + "dev": true, + "license": "MIT" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 68b06e17..466be474 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "test": "tap", "snap": "tap", "format": "prettier --write . --log-level warn", + "lint": "eslint", "benchmark": "node benchmark/index.js", "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" }, @@ -58,12 +59,17 @@ "endOfLine": "lf" }, "devDependencies": { - "@types/node": "^20.14.10", + "@eslint/js": "^9.12.0", + "@types/eslint__js": "^8.42.3", + "@types/node": "^22.7.5", + "eslint": "^9.12.0", "mkdirp": "^3.0.1", - "prettier": "^3.3.2", - "tap": "^20.0.3", - "tshy": "^2.0.1", - "typedoc": "^0.26.3" + "prettier": "^3.3.3", + "tap": "^21.0.1", + "tshy": "^3.0.2", + "typedoc": "^0.26.8", + "typescript": "^5.6.3", + "typescript-eslint": "^8.8.1" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -73,7 +79,7 @@ }, "dependencies": { "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" + "package-json-from-dist": "^1.0.1" }, "keywords": [ "rm", @@ -85,5 +91,8 @@ "rmdir", "recursive" ], - "module": "./dist/esm/index.js" + "module": "./dist/esm/index.js", + "tap": { + "coverage-map": "map.js" + } } diff --git a/src/bin.mts b/src/bin.mts index 3727ecf7..2e5e45a5 100755 --- a/src/bin.mts +++ b/src/bin.mts @@ -1,15 +1,16 @@ #!/usr/bin/env node import type { RimrafAsyncOptions } from './index.js' import { rimraf } from './index.js' - import { loadPackageJson } from 'package-json-from-dist' -const { version } = loadPackageJson(import.meta.url, '../package.json') +const { version } = loadPackageJson(import.meta.url, '../package.json') as { + version: string +} const runHelpForUsage = () => console.error('run `rimraf --help` for usage information') -export const help = `rimraf version ${version} +const help = `rimraf version ${version} Usage: rimraf [ ...] Deletes all files and folders at "path", recursively. @@ -84,7 +85,7 @@ const interactiveRimraf = async ( return result }) }) - processQueue() + void processQueue() return p } const rl = createInterface({ @@ -127,10 +128,6 @@ const main = async (...args: string[]) => { return true } - if (process.env.__RIMRAF_TESTING_BIN_FAIL__ === '1') { - throw new Error('simulated rimraf failure') - } - const opt: RimrafAsyncOptions = {} const paths: string[] = [] let dashdash = false @@ -257,18 +254,11 @@ const main = async (...args: string[]) => { return 0 } -main.help = help -main.version = version -export default main - -if (process.env.__TESTING_RIMRAF_BIN__ !== '1') { - const args = process.argv.slice(2) - main(...args).then( - code => process.exit(code), - er => { - console.error(er) - process.exit(1) - }, - ) -} +main(...process.argv.slice(2)).then( + code => process.exit(code), + er => { + console.error(er) + process.exit(1) + }, +) diff --git a/src/default-tmp.ts b/src/default-tmp.ts index 6e7bb22e..7a91388d 100644 --- a/src/default-tmp.ts +++ b/src/default-tmp.ts @@ -11,13 +11,12 @@ import { tmpdir } from 'os' import { parse, resolve } from 'path' import { promises, statSync } from './fs.js' -import platform from './platform.js' const { stat } = promises const isDirSync = (path: string) => { try { return statSync(path).isDirectory() - } catch (er) { + } catch { return false } } @@ -60,10 +59,11 @@ const win32DefaultTmpSync = (path: string) => { return root } +// eslint-disable-next-line @typescript-eslint/require-await const posixDefaultTmp = async () => tmpdir() const posixDefaultTmpSync = () => tmpdir() export const defaultTmp = - platform === 'win32' ? win32DefaultTmp : posixDefaultTmp + process.platform === 'win32' ? win32DefaultTmp : posixDefaultTmp export const defaultTmpSync = - platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync + process.platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync diff --git a/src/error.ts b/src/error.ts new file mode 100644 index 00000000..f9686133 --- /dev/null +++ b/src/error.ts @@ -0,0 +1,15 @@ +const isRecord = (o: unknown): o is Record => + !!o && typeof o === 'object' + +const hasString = (o: Record, key: string) => + key in o && typeof o[key] === 'string' + +export const isFsError = ( + o: unknown, +): o is NodeJS.ErrnoException & { + code: string + path: string +} => isRecord(o) && hasString(o, 'code') && hasString(o, 'path') + +export const errorCode = (er: unknown) => + isRecord(er) && hasString(er, 'code') ? er.code : null diff --git a/src/fix-eperm.ts b/src/fix-eperm.ts index 5e7d5fed..85ed6aab 100644 --- a/src/fix-eperm.ts +++ b/src/fix-eperm.ts @@ -1,51 +1,41 @@ +import { errorCode } from './error.js' import { chmodSync, promises } from './fs.js' +import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js' const { chmod } = promises export const fixEPERM = - (fn: (path: string) => Promise) => async (path: string) => { + (fn: (path: string) => Promise) => + async (path: string): Promise => { try { - return await fn(path) + return void (await ignoreENOENT(fn(path))) } catch (er) { - const fer = er as NodeJS.ErrnoException - if (fer?.code === 'ENOENT') { - return - } - if (fer?.code === 'EPERM') { - try { - await chmod(path, 0o666) - } catch (er2) { - const fer2 = er2 as NodeJS.ErrnoException - if (fer2?.code === 'ENOENT') { - return - } - throw er + if (errorCode(er) === 'EPERM') { + if ( + !(await ignoreENOENT( + chmod(path, 0o666).then(() => true), + er, + )) + ) { + return } - return await fn(path) + return void (await fn(path)) } throw er } } -export const fixEPERMSync = (fn: (path: string) => any) => (path: string) => { - try { - return fn(path) - } catch (er) { - const fer = er as NodeJS.ErrnoException - if (fer?.code === 'ENOENT') { - return - } - if (fer?.code === 'EPERM') { - try { - chmodSync(path, 0o666) - } catch (er2) { - const fer2 = er2 as NodeJS.ErrnoException - if (fer2?.code === 'ENOENT') { +export const fixEPERMSync = + (fn: (path: string) => unknown) => + (path: string): void => { + try { + return void ignoreENOENTSync(() => fn(path)) + } catch (er) { + if (errorCode(er) === 'EPERM') { + if (!ignoreENOENTSync(() => (chmodSync(path, 0o666), true), er)) { return } - throw er + return void fn(path) } - return fn(path) + throw er } - throw er } -} diff --git a/src/fs.ts b/src/fs.ts index 12ff2077..45abbcb2 100644 --- a/src/fs.ts +++ b/src/fs.ts @@ -1,6 +1,7 @@ // promisify ourselves, because older nodes don't have fs.promises import fs, { Dirent } from 'fs' +import { readdirSync as rdSync } from 'fs' // sync ones just take the sync version from node export { @@ -14,7 +15,6 @@ export { unlinkSync, } from 'fs' -import { readdirSync as rdSync } from 'fs' export const readdirSync = (path: fs.PathLike): Dirent[] => rdSync(path, { withFileTypes: true }) @@ -24,16 +24,13 @@ export const readdirSync = (path: fs.PathLike): Dirent[] => // which would be a bit cleaner. const chmod = (path: fs.PathLike, mode: fs.Mode): Promise => - new Promise((res, rej) => - fs.chmod(path, mode, (er, ...d: any[]) => (er ? rej(er) : res(...d))), - ) + new Promise((res, rej) => fs.chmod(path, mode, er => (er ? rej(er) : res()))) const mkdir = ( path: fs.PathLike, options?: | fs.Mode | (fs.MakeDirectoryOptions & { recursive?: boolean | null }) - | undefined | null, ): Promise => new Promise((res, rej) => @@ -49,20 +46,14 @@ const readdir = (path: fs.PathLike): Promise => const rename = (oldPath: fs.PathLike, newPath: fs.PathLike): Promise => new Promise((res, rej) => - fs.rename(oldPath, newPath, (er, ...d: any[]) => - er ? rej(er) : res(...d), - ), + fs.rename(oldPath, newPath, er => (er ? rej(er) : res())), ) const rm = (path: fs.PathLike, options: fs.RmOptions): Promise => - new Promise((res, rej) => - fs.rm(path, options, (er, ...d: any[]) => (er ? rej(er) : res(...d))), - ) + new Promise((res, rej) => fs.rm(path, options, er => (er ? rej(er) : res()))) const rmdir = (path: fs.PathLike): Promise => - new Promise((res, rej) => - fs.rmdir(path, (er, ...d: any[]) => (er ? rej(er) : res(...d))), - ) + new Promise((res, rej) => fs.rmdir(path, er => (er ? rej(er) : res()))) const stat = (path: fs.PathLike): Promise => new Promise((res, rej) => @@ -75,9 +66,7 @@ const lstat = (path: fs.PathLike): Promise => ) const unlink = (path: fs.PathLike): Promise => - new Promise((res, rej) => - fs.unlink(path, (er, ...d: any[]) => (er ? rej(er) : res(...d))), - ) + new Promise((res, rej) => fs.unlink(path, er => (er ? rej(er) : res()))) export const promises = { chmod, diff --git a/src/ignore-enoent.ts b/src/ignore-enoent.ts index c0667912..2557dcb3 100644 --- a/src/ignore-enoent.ts +++ b/src/ignore-enoent.ts @@ -1,16 +1,20 @@ -export const ignoreENOENT = async (p: Promise) => +import { errorCode } from './error.js' + +export const ignoreENOENT = async (p: Promise, rethrow?: unknown) => p.catch(er => { - if (er.code !== 'ENOENT') { - throw er + if (errorCode(er) === 'ENOENT') { + return } + throw rethrow ?? er }) -export const ignoreENOENTSync = (fn: () => any) => { +export const ignoreENOENTSync = (fn: () => T, rethrow?: unknown) => { try { return fn() } catch (er) { - if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') { - throw er + if (errorCode(er) === 'ENOENT') { + return } + throw rethrow ?? er } } diff --git a/src/index.ts b/src/index.ts index f1ea02fc..fec10503 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,11 +32,11 @@ const wrap = path = await glob(path, options.glob) } if (Array.isArray(path)) { - return !!( + return ( await Promise.all(path.map(p => fn(pathArg(p, options), options))) - ).reduce((a, b) => a && b, true) + ).every(v => v === true) } else { - return !!(await fn(pathArg(path, options), options)) + return fn(pathArg(path, options), options) } } @@ -48,11 +48,11 @@ const wrapSync = path = globSync(path, options.glob) } if (Array.isArray(path)) { - return !!path + return path .map(p => fn(pathArg(p, options), options)) - .reduce((a, b) => a && b, true) + .every(v => v === true) } else { - return !!fn(pathArg(path, options), options) + return fn(pathArg(path, options), options) } } diff --git a/src/opt-arg.ts b/src/opt-arg.ts index 77f1b99b..89d7a04b 100644 --- a/src/opt-arg.ts +++ b/src/opt-arg.ts @@ -1,23 +1,25 @@ import { Dirent, Stats } from 'fs' import { GlobOptions } from 'glob' -const typeOrUndef = (val: any, t: string) => +const typeOrUndef = (val: unknown, t: string) => typeof val === 'undefined' || typeof val === t -export const isRimrafOptions = (o: any): o is RimrafOptions => - !!o && - typeof o === 'object' && +const isRecord = (o: unknown): o is Record => + !!o && typeof o === 'object' + +export const isRimrafOptions = (o: unknown): o is RimrafOptions => + isRecord(o) && typeOrUndef(o.preserveRoot, 'boolean') && typeOrUndef(o.tmp, 'string') && typeOrUndef(o.maxRetries, 'number') && typeOrUndef(o.retryDelay, 'number') && typeOrUndef(o.backoff, 'number') && typeOrUndef(o.maxBackoff, 'number') && - (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) && + (typeOrUndef(o.glob, 'boolean') || isRecord(o.glob)) && typeOrUndef(o.filter, 'function') -export const assertRimrafOptions: (o: any) => void = ( - o: any, +export const assertRimrafOptions: (o: unknown) => void = ( + o: unknown, ): asserts o is RimrafOptions => { if (!isRimrafOptions(o)) { throw new Error('invalid rimraf options') diff --git a/src/path-arg.ts b/src/path-arg.ts index 505c6d11..f6126e4a 100644 --- a/src/path-arg.ts +++ b/src/path-arg.ts @@ -1,7 +1,6 @@ import { parse, resolve } from 'path' import { inspect } from 'util' import { RimrafAsyncOptions } from './index.js' -import platform from './platform.js' const pathArg = (path: string, opt: RimrafAsyncOptions = {}) => { const type = typeof path @@ -39,7 +38,7 @@ const pathArg = (path: string, opt: RimrafAsyncOptions = {}) => { }) } - if (platform === 'win32') { + if (process.platform === 'win32') { const badWinChars = /[*|"<>?:]/ const { root } = parse(path) if (badWinChars.test(path.substring(root.length))) { diff --git a/src/platform.ts b/src/platform.ts deleted file mode 100644 index afdd49ba..00000000 --- a/src/platform.ts +++ /dev/null @@ -1 +0,0 @@ -export default process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform diff --git a/src/readdir-or-error.ts b/src/readdir-or-error.ts index 79970df1..5676a12a 100644 --- a/src/readdir-or-error.ts +++ b/src/readdir-or-error.ts @@ -2,12 +2,13 @@ // or the error that readdir() raised if not. import { promises, readdirSync } from './fs.js' const { readdir } = promises + export const readdirOrError = (path: string) => - readdir(path).catch(er => er as NodeJS.ErrnoException) + readdir(path).catch(er => er as Error) export const readdirOrErrorSync = (path: string) => { try { return readdirSync(path) } catch (er) { - return er as NodeJS.ErrnoException + return er as Error } } diff --git a/src/retry-busy.ts b/src/retry-busy.ts index f727797d..40ceb31d 100644 --- a/src/retry-busy.ts +++ b/src/retry-busy.ts @@ -1,13 +1,15 @@ // note: max backoff is the maximum that any *single* backoff will do +import { setTimeout } from 'timers/promises' import { RimrafAsyncOptions, RimrafOptions } from './index.js' +import { isFsError } from './error.js' export const MAXBACKOFF = 200 export const RATE = 1.2 export const MAXRETRIES = 10 export const codes = new Set(['EMFILE', 'ENFILE', 'EBUSY']) -export const retryBusy = (fn: (path: string) => Promise) => { +export const retryBusy = (fn: (path: string) => Promise) => { const method = async ( path: string, opt: RimrafAsyncOptions, @@ -22,16 +24,12 @@ export const retryBusy = (fn: (path: string) => Promise) => { try { return await fn(path) } catch (er) { - const fer = er as NodeJS.ErrnoException - if (fer?.path === path && fer?.code && codes.has(fer.code)) { + if (isFsError(er) && er.path === path && codes.has(er.code)) { backoff = Math.ceil(backoff * rate) total = backoff + total if (total < mbo) { - return new Promise((res, rej) => { - setTimeout(() => { - method(path, opt, backoff, total).then(res, rej) - }, backoff) - }) + await setTimeout(backoff) + return method(path, opt, backoff, total) } if (retries < max) { retries++ @@ -47,7 +45,7 @@ export const retryBusy = (fn: (path: string) => Promise) => { } // just retries, no async so no backoff -export const retryBusySync = (fn: (path: string) => any) => { +export const retryBusySync = (fn: (path: string) => T) => { const method = (path: string, opt: RimrafOptions) => { const max = opt.maxRetries || MAXRETRIES let retries = 0 @@ -55,11 +53,10 @@ export const retryBusySync = (fn: (path: string) => any) => { try { return fn(path) } catch (er) { - const fer = er as NodeJS.ErrnoException if ( - fer?.path === path && - fer?.code && - codes.has(fer.code) && + isFsError(er) && + er.path === path && + codes.has(er.code) && retries < max ) { retries++ diff --git a/src/rimraf-manual.ts b/src/rimraf-manual.ts index d943460f..1eb45bfd 100644 --- a/src/rimraf-manual.ts +++ b/src/rimraf-manual.ts @@ -1,8 +1,7 @@ -import platform from './platform.js' - import { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js' import { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js' -export const rimrafManual = platform === 'win32' ? rimrafWindows : rimrafPosix +export const rimrafManual = + process.platform === 'win32' ? rimrafWindows : rimrafPosix export const rimrafManualSync = - platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync + process.platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync diff --git a/src/rimraf-move-remove.ts b/src/rimraf-move-remove.ts index daf29104..f6a3ef1b 100644 --- a/src/rimraf-move-remove.ts +++ b/src/rimraf-move-remove.ts @@ -13,77 +13,31 @@ import { basename, parse, resolve } from 'path' import { defaultTmp, defaultTmpSync } from './default-tmp.js' - import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js' - -import { - chmodSync, - lstatSync, - promises as fsPromises, - renameSync, - rmdirSync, - unlinkSync, -} from './fs.js' -const { lstat, rename, unlink, rmdir, chmod } = fsPromises - +import { lstatSync, promises, renameSync, rmdirSync, unlinkSync } from './fs.js' import { Dirent, Stats } from 'fs' import { RimrafAsyncOptions, RimrafSyncOptions } from './index.js' import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js' +import { fixEPERM, fixEPERMSync } from './fix-eperm.js' +import { errorCode } from './error.js' +const { lstat, rename, unlink, rmdir } = promises // crypto.randomBytes is much slower, and Math.random() is enough here const uniqueFilename = (path: string) => `.${basename(path)}.${Math.random()}` -const unlinkFixEPERM = async (path: string) => - unlink(path).catch((er: Error & { code?: string }) => { - if (er.code === 'EPERM') { - return chmod(path, 0o666).then( - () => unlink(path), - er2 => { - if (er2.code === 'ENOENT') { - return - } - throw er - }, - ) - } else if (er.code === 'ENOENT') { - return - } - throw er - }) - -const unlinkFixEPERMSync = (path: string) => { - try { - unlinkSync(path) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'EPERM') { - try { - return chmodSync(path, 0o666) - } catch (er2) { - if ((er2 as NodeJS.ErrnoException)?.code === 'ENOENT') { - return - } - throw er - } - } else if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') { - return - } - throw er - } -} +const unlinkFixEPERM = fixEPERM(unlink) +const unlinkFixEPERMSync = fixEPERMSync(unlinkSync) export const rimrafMoveRemove = async ( path: string, opt: RimrafAsyncOptions, ) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return await rimrafMoveRemoveDir(path, opt, await lstat(path)) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + (await ignoreENOENT( + lstat(path).then(stat => rimrafMoveRemoveDir(path, opt, stat)), + )) ?? true + ) } const rimrafMoveRemoveDir = async ( @@ -91,9 +45,7 @@ const rimrafMoveRemoveDir = async ( opt: RimrafAsyncOptions, ent: Dirent | Stats, ): Promise => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } + opt?.signal?.throwIfAborted() if (!opt.tmp) { return rimrafMoveRemoveDir( path, @@ -111,10 +63,10 @@ const rimrafMoveRemoveDir = async ( // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } @@ -132,7 +84,7 @@ const rimrafMoveRemoveDir = async ( rimrafMoveRemoveDir(resolve(path, ent.name), opt, ent), ), ) - ).reduce((a, b) => a && b, true) + ).every(v => v === true) if (!removedAll) { return false } @@ -150,10 +102,10 @@ const rimrafMoveRemoveDir = async ( return true } -const tmpUnlink = async ( +const tmpUnlink = async ( path: string, tmp: string, - rm: (p: string) => Promise, + rm: (p: string) => Promise, ) => { const tmpFile = resolve(tmp, uniqueFilename(path)) await rename(path, tmpFile) @@ -161,15 +113,12 @@ const tmpUnlink = async ( } export const rimrafMoveRemoveSync = (path: string, opt: RimrafSyncOptions) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return rimrafMoveRemoveDirSync(path, opt, lstatSync(path)) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + ignoreENOENTSync(() => + rimrafMoveRemoveDirSync(path, opt, lstatSync(path)), + ) ?? true + ) } const rimrafMoveRemoveDirSync = ( @@ -177,9 +126,7 @@ const rimrafMoveRemoveDirSync = ( opt: RimrafSyncOptions, ent: Dirent | Stats, ): boolean => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } + opt?.signal?.throwIfAborted() if (!opt.tmp) { return rimrafMoveRemoveDirSync( path, @@ -199,10 +146,10 @@ const rimrafMoveRemoveDirSync = ( // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } diff --git a/src/rimraf-posix.ts b/src/rimraf-posix.ts index 54f0d327..223ecea9 100644 --- a/src/rimraf-posix.ts +++ b/src/rimraf-posix.ts @@ -5,38 +5,29 @@ // SUPER weird breakage happens as a result. import { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js' -const { lstat, rmdir, unlink } = promises - import { parse, resolve } from 'path' - import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js' - import { Dirent, Stats } from 'fs' import { RimrafAsyncOptions, RimrafSyncOptions } from './index.js' import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js' +import { errorCode } from './error.js' +const { lstat, rmdir, unlink } = promises export const rimrafPosix = async (path: string, opt: RimrafAsyncOptions) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return await rimrafPosixDir(path, opt, await lstat(path)) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + (await ignoreENOENT( + lstat(path).then(stat => rimrafPosixDir(path, opt, stat)), + )) ?? true + ) } export const rimrafPosixSync = (path: string, opt: RimrafSyncOptions) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return rimrafPosixDirSync(path, opt, lstatSync(path)) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + ignoreENOENTSync(() => rimrafPosixDirSync(path, opt, lstatSync(path))) ?? + true + ) } const rimrafPosixDir = async ( @@ -44,19 +35,17 @@ const rimrafPosixDir = async ( opt: RimrafAsyncOptions, ent: Dirent | Stats, ): Promise => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } + opt?.signal?.throwIfAborted() const entries = ent.isDirectory() ? await readdirOrError(path) : null if (!Array.isArray(entries)) { // this can only happen if lstat/readdir lied, or if the dir was // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } @@ -72,7 +61,7 @@ const rimrafPosixDir = async ( await Promise.all( entries.map(ent => rimrafPosixDir(resolve(path, ent.name), opt, ent)), ) - ).reduce((a, b) => a && b, true) + ).every(v => v === true) if (!removedAll) { return false @@ -98,19 +87,17 @@ const rimrafPosixDirSync = ( opt: RimrafSyncOptions, ent: Dirent | Stats, ): boolean => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } + opt?.signal?.throwIfAborted() const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null if (!Array.isArray(entries)) { // this can only happen if lstat/readdir lied, or if the dir was // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } diff --git a/src/rimraf-windows.ts b/src/rimraf-windows.ts index 30624986..567e7143 100644 --- a/src/rimraf-windows.ts +++ b/src/rimraf-windows.ts @@ -17,6 +17,7 @@ import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js' import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js' import { retryBusy, retryBusySync } from './retry-busy.js' import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js' +import { errorCode } from './error.js' const { unlink, rmdir, lstat } = promises const rimrafWindowsFile = retryBusy(fixEPERM(unlink)) @@ -26,20 +27,18 @@ const rimrafWindowsDirRetrySync = retryBusySync(fixEPERMSync(rmdirSync)) const rimrafWindowsDirMoveRemoveFallback = async ( path: string, - opt: RimrafAsyncOptions, -): Promise => { - /* c8 ignore start */ - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - /* c8 ignore stop */ // already filtered, remove from options so we don't call unnecessarily - const { filter, ...options } = opt + // eslint-disable-next-line @typescript-eslint/no-unused-vars + { filter, ...opt }: RimrafAsyncOptions, +): Promise => { + /* c8 ignore next */ + opt?.signal?.throwIfAborted() try { - return await rimrafWindowsDirRetry(path, options) + await rimrafWindowsDirRetry(path, opt) + return true } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOTEMPTY') { - return await rimrafMoveRemove(path, options) + if (errorCode(er) === 'ENOTEMPTY') { + return rimrafMoveRemove(path, opt) } throw er } @@ -47,19 +46,17 @@ const rimrafWindowsDirMoveRemoveFallback = async ( const rimrafWindowsDirMoveRemoveFallbackSync = ( path: string, - opt: RimrafSyncOptions, -): boolean => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } // already filtered, remove from options so we don't call unnecessarily - const { filter, ...options } = opt + // eslint-disable-next-line @typescript-eslint/no-unused-vars + { filter, ...opt }: RimrafSyncOptions, +): boolean => { + opt?.signal?.throwIfAborted() try { - return rimrafWindowsDirRetrySync(path, options) + rimrafWindowsDirRetrySync(path, opt) + return true } catch (er) { - const fer = er as NodeJS.ErrnoException - if (fer?.code === 'ENOTEMPTY') { - return rimrafMoveRemoveSync(path, options) + if (errorCode(er) === 'ENOTEMPTY') { + return rimrafMoveRemoveSync(path, opt) } throw er } @@ -70,27 +67,21 @@ const CHILD = Symbol('child') const FINISH = Symbol('finish') export const rimrafWindows = async (path: string, opt: RimrafAsyncOptions) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return await rimrafWindowsDir(path, opt, await lstat(path), START) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + (await ignoreENOENT( + lstat(path).then(stat => rimrafWindowsDir(path, opt, stat, START)), + )) ?? true + ) } export const rimrafWindowsSync = (path: string, opt: RimrafSyncOptions) => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } - try { - return rimrafWindowsDirSync(path, opt, lstatSync(path), START) - } catch (er) { - if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true - throw er - } + opt?.signal?.throwIfAborted() + return ( + ignoreENOENTSync(() => + rimrafWindowsDirSync(path, opt, lstatSync(path), START), + ) ?? true + ) } const rimrafWindowsDir = async ( @@ -99,9 +90,7 @@ const rimrafWindowsDir = async ( ent: Dirent | Stats, state = START, ): Promise => { - if (opt?.signal?.aborted) { - throw opt.signal.reason - } + opt?.signal?.throwIfAborted() const entries = ent.isDirectory() ? await readdirOrError(path) : null if (!Array.isArray(entries)) { @@ -109,10 +98,10 @@ const rimrafWindowsDir = async ( // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } @@ -132,7 +121,7 @@ const rimrafWindowsDir = async ( rimrafWindowsDir(resolve(path, ent.name), opt, ent, s), ), ) - ).reduce((a, b) => a && b, true) + ).every(v => v === true) if (state === START) { return rimrafWindowsDir(path, opt, ent, FINISH) @@ -163,10 +152,10 @@ const rimrafWindowsDirSync = ( // swapped out with a file at just the right moment. /* c8 ignore start */ if (entries) { - if (entries.code === 'ENOENT') { + if (errorCode(entries) === 'ENOENT') { return true } - if (entries.code !== 'ENOTDIR') { + if (errorCode(entries) !== 'ENOTDIR') { throw entries } } @@ -198,9 +187,7 @@ const rimrafWindowsDirSync = ( if (opt.filter && !opt.filter(path, ent)) { return false } - ignoreENOENTSync(() => { - rimrafWindowsDirMoveRemoveFallbackSync(path, opt) - }) + ignoreENOENTSync(() => rimrafWindowsDirMoveRemoveFallbackSync(path, opt)) } return true } diff --git a/src/use-native.ts b/src/use-native.ts index 18a96e2e..d40f40b5 100644 --- a/src/use-native.ts +++ b/src/use-native.ts @@ -1,21 +1,19 @@ import { RimrafAsyncOptions, RimrafOptions } from './index.js' -import platform from './platform.js' -const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version -const versArr = version.replace(/^v/, '').split('.') - -/* c8 ignore start */ -const [major = 0, minor = 0] = versArr.map(v => parseInt(v, 10)) -/* c8 ignore stop */ +/* c8 ignore next */ +const [major = 0, minor = 0] = process.version + .replace(/^v/, '') + .split('.') + .map(v => parseInt(v, 10)) const hasNative = major > 14 || (major === 14 && minor >= 14) // we do NOT use native by default on Windows, because Node's native // rm implementation is less advanced. Change this code if that changes. export const useNative: (opt?: RimrafAsyncOptions) => boolean = - !hasNative || platform === 'win32' ? + !hasNative || process.platform === 'win32' ? () => false : opt => !opt?.signal && !opt?.filter export const useNativeSync: (opt?: RimrafOptions) => boolean = - !hasNative || platform === 'win32' ? + !hasNative || process.platform === 'win32' ? () => false : opt => !opt?.signal && !opt?.filter diff --git a/test/bin.ts b/test/bin.ts index 665f92c8..b1a88193 100644 --- a/test/bin.ts +++ b/test/bin.ts @@ -1,62 +1,88 @@ import { spawn, spawnSync } from 'child_process' -import { readdirSync, statSync } from 'fs' +import { Dirent, readdirSync, statSync } from 'fs' import t from 'tap' -import { fileURLToPath } from 'url' import { RimrafOptions } from '../src/index.js' - -const binModule = fileURLToPath(new URL('../dist/esm/bin.mjs', import.meta.url)) - -t.test('basic arg parsing stuff', async t => { - const LOGS: any[] = [] - const ERRS: any[] = [] - const { log: consoleLog, error: consoleError } = console - process.env.__TESTING_RIMRAF_BIN__ = '1' - t.teardown(() => { - console.log = consoleLog - console.error = consoleError - delete process.env.__TESTING_RIMRAF_BIN__ - }) - console.log = (...msg) => LOGS.push(msg) - console.error = (...msg) => ERRS.push(msg) - - const CALLS: any[] = [] - const rimraf = Object.assign( - async (path: string, opt: RimrafOptions) => - CALLS.push(['rimraf', path, opt]), +import { basename, join, resolve } from 'path' +import { loadPackageJson } from 'package-json-from-dist' + +const { version } = loadPackageJson(import.meta.url, '../package.json') as { + version: string +} + +// Have to use the dist file otherwise coverage doesn't work +// Could be a tap bug or misconfiguration? +const SRC_DIR = '../dist/esm' + +const binDist = join(SRC_DIR, 'bin.mjs') +const spawnSyncBin = (args: string[]) => + spawnSync( + process.execPath, + [resolve(import.meta.dirname, binDist), ...args], { - native: async (path: string, opt: RimrafOptions) => - CALLS.push(['native', path, opt]), - manual: async (path: string, opt: RimrafOptions) => - CALLS.push(['manual', path, opt]), - posix: async (path: string, opt: RimrafOptions) => - CALLS.push(['posix', path, opt]), - windows: async (path: string, opt: RimrafOptions) => - CALLS.push(['windows', path, opt]), - moveRemove: async (path: string, opt: RimrafOptions) => - CALLS.push(['move-remove', path, opt]), + encoding: 'utf8', + timeout: 10_000, }, ) - - const { default: bin } = await t.mockImport('../dist/esm/bin.mjs', { - '../dist/esm/index.js': { - rimraf, - ...rimraf, +const spawnBin = (args: string[]) => { + const child = spawn( + process.execPath, + [resolve(import.meta.dirname, binDist), ...args], + { + stdio: 'pipe', + signal: AbortSignal.timeout(10_000), }, + ) + child.stdout.setEncoding('utf8') + child.stderr.setEncoding('utf8') + return child +} +const mockBin = async ( + argv: string[], + mocks: Record, +): Promise => + new Promise(res => { + t.intercept(process, 'argv', { + value: [process.execPath, basename(binDist), ...argv], + }) + t.intercept(process, 'exit', { value: (code: number) => res(code) }) + void t.mockImport(binDist, mocks) }) - t.afterEach(() => { - LOGS.length = 0 - ERRS.length = 0 - CALLS.length = 0 - }) +t.test('basic arg parsing stuff', async t => { + const impls = new Map([ + ['rimraf', 'rimraf'], + ['native', 'native'], + ['manual', 'manual'], + ['posix', 'posix'], + ['windows', 'windows'], + ['moveRemove', 'move-remove'], + ]) + + const CALLS: [string, string, RimrafOptions][] = [] + t.afterEach(() => (CALLS.length = 0)) + const { rimraf, ...mocks } = [...impls.entries()].reduce< + Record Promise> + >((acc, [k, v]) => { + acc[k] = async (path, opt) => CALLS.push([v, path, opt]) + return acc + }, {}) + const logs = t.capture(console, 'log').args + const errs = t.capture(console, 'error').args + const bin = (...argv: string[]) => + mockBin(argv, { + [join(SRC_DIR, 'index.js')]: { + rimraf: Object.assign(rimraf!, mocks), + ...mocks, + }, + }) t.test('binary version', t => { const cases = [['--version'], ['a', 'b', '--version', 'c']] for (const c of cases) { t.test(c.join(' '), async t => { t.equal(await bin(...c), 0) - t.same(LOGS, [[bin.version]]) - t.same(ERRS, []) + t.strictSame(logs(), [[version]]) + t.strictSame(errs(), []) t.same(CALLS, []) }) } @@ -68,8 +94,10 @@ t.test('basic arg parsing stuff', async t => { for (const c of cases) { t.test(c.join(' '), async t => { t.equal(await bin(...c), 0) - t.same(LOGS, [[bin.help]]) - t.same(ERRS, []) + const l = logs() + t.equal(l.length, 1) + t.match(l[0]![0], `rimraf version ${version}`) + t.strictSame(errs(), []) t.same(CALLS, []) }) } @@ -78,8 +106,8 @@ t.test('basic arg parsing stuff', async t => { t.test('no paths', async t => { t.equal(await bin(), 1) - t.same(LOGS, []) - t.same(ERRS, [ + t.strictSame(logs(), []) + t.strictSame(errs(), [ ['rimraf: must provide a path to remove'], ['run `rimraf --help` for usage information'], ]) @@ -90,8 +118,8 @@ t.test('basic arg parsing stuff', async t => { t.equal(await bin('-fr', 'foo'), 0) t.equal(await bin('foo', '-rf'), 0) t.equal(await bin('foo', '-fr'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [ ['rimraf', ['foo'], {}], ['rimraf', ['foo'], {}], @@ -104,21 +132,15 @@ t.test('basic arg parsing stuff', async t => { t.equal(await bin('-v', 'foo'), 0) t.equal(await bin('--verbose', 'foo'), 0) t.equal(await bin('-v', '-V', '--verbose', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) - const { log } = console - t.teardown(() => { - console.log = log - }) - const logs: any[] = [] - console.log = s => logs.push(s) + t.strictSame(logs(), []) + t.strictSame(errs(), []) for (const c of CALLS) { t.equal(c[0], 'rimraf') t.same(c[1], ['foo']) t.type(c[2].filter, 'function') - t.equal(c[2].filter('x'), true) - t.same(logs, ['x']) - logs.length = 0 + t.equal(c[2].filter?.('x', new Dirent()), true) + + t.strictSame(logs(), [['x']]) } }) @@ -126,19 +148,14 @@ t.test('basic arg parsing stuff', async t => { t.equal(await bin('-V', 'foo'), 0) t.equal(await bin('--no-verbose', 'foo'), 0) t.equal(await bin('-V', '-v', '--no-verbose', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) - const { log } = console - t.teardown(() => { - console.log = log - }) - const logs: any[] = [] - console.log = s => logs.push(s) + t.strictSame(logs(), []) + t.strictSame(errs(), []) for (const c of CALLS) { t.equal(c[0], 'rimraf') t.same(c[1], ['foo']) t.type(c[2].filter, 'undefined') - t.same(logs, []) + + t.strictSame(logs(), []) } }) @@ -149,8 +166,8 @@ t.test('basic arg parsing stuff', async t => { t.equal(await bin('-g', '-G', 'foo'), 0) t.equal(await bin('-G', 'foo'), 0) t.equal(await bin('--no-glob', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [ ['rimraf', ['foo'], { glob: true }], ['rimraf', ['foo'], { glob: true }], @@ -163,27 +180,27 @@ t.test('basic arg parsing stuff', async t => { t.test('dashdash', async t => { t.equal(await bin('--', '-h'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['-h'], {}]]) }) t.test('no preserve root', async t => { t.equal(await bin('--no-preserve-root', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { preserveRoot: false }]]) }) t.test('yes preserve root', async t => { t.equal(await bin('--preserve-root', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { preserveRoot: true }]]) }) t.test('yes preserve root, remove root', async t => { t.equal(await bin('/'), 1) - t.same(LOGS, []) - t.same(ERRS, [ + t.strictSame(logs(), []) + t.strictSame(errs(), [ [`rimraf: it is dangerous to operate recursively on '/'`], ['use --no-preserve-root to override this failsafe'], ]) @@ -191,43 +208,43 @@ t.test('basic arg parsing stuff', async t => { }) t.test('no preserve root, remove root', async t => { t.equal(await bin('/', '--no-preserve-root'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['/'], { preserveRoot: false }]]) }) t.test('--tmp=', async t => { t.equal(await bin('--tmp=some-path', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { tmp: 'some-path' }]]) }) t.test('--tmp=', async t => { t.equal(await bin('--backoff=1.3', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { backoff: 1.3 }]]) }) t.test('--max-retries=n', async t => { t.equal(await bin('--max-retries=100', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { maxRetries: 100 }]]) }) t.test('--retry-delay=n', async t => { t.equal(await bin('--retry-delay=100', 'foo'), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [['rimraf', ['foo'], { retryDelay: 100 }]]) }) t.test('--uknown-option', async t => { t.equal(await bin('--unknown-option=100', 'foo'), 1) - t.same(LOGS, []) - t.same(ERRS, [ + t.strictSame(logs(), []) + t.strictSame(errs(), [ ['unknown option: --unknown-option=100'], ['run `rimraf --help` for usage information'], ]) @@ -236,8 +253,8 @@ t.test('basic arg parsing stuff', async t => { t.test('--impl=asdf', async t => { t.equal(await bin('--impl=asdf', 'foo'), 1) - t.same(LOGS, []) - t.same(ERRS, [ + t.strictSame(logs(), []) + t.strictSame(errs(), [ ['unknown implementation: asdf'], ['run `rimraf --help` for usage information'], ]) @@ -246,37 +263,28 @@ t.test('basic arg parsing stuff', async t => { t.test('native cannot do filters', async t => { t.equal(await bin('--impl=native', '-v', 'foo'), 1) - t.same(ERRS, [ + t.strictSame(errs(), [ ['native implementation does not support -v or -i'], ['run `rimraf --help` for usage information'], ]) - ERRS.length = 0 + t.strictSame(errs(), []) t.equal(await bin('--impl=native', '-i', 'foo'), 1) - t.same(ERRS, [ + t.strictSame(errs(), [ ['native implementation does not support -v or -i'], ['run `rimraf --help` for usage information'], ]) - ERRS.length = 0 t.same(CALLS, []) - t.same(LOGS, []) + t.strictSame(logs(), []) // ok to turn it on and back off though t.equal(await bin('--impl=native', '-i', '-I', 'foo'), 0) t.same(CALLS, [['native', ['foo'], {}]]) }) - const impls = [ - 'rimraf', - 'native', - 'manual', - 'posix', - 'windows', - 'move-remove', - ] - for (const impl of impls) { + for (const impl of impls.values()) { t.test(`--impl=${impl}`, async t => { t.equal(await bin('foo', `--impl=${impl}`), 0) - t.same(LOGS, []) - t.same(ERRS, []) + t.strictSame(logs(), []) + t.strictSame(errs(), []) t.same(CALLS, [[impl, ['foo'], {}]]) }) } @@ -292,10 +300,7 @@ t.test('actually delete something with it', async t => { }, }, }) - - const res = spawnSync(process.execPath, [binModule, path], { - encoding: 'utf8', - }) + const res = spawnSyncBin([path]) t.throws(() => statSync(path)) t.equal(res.status, 0) }) @@ -308,16 +313,20 @@ t.test('print failure when impl throws', async t => { }, }, }) - - const res = spawnSync(process.execPath, [binModule, path], { - env: { - ...process.env, - __RIMRAF_TESTING_BIN_FAIL__: '1', + const err = new Error('simulated rimraf failure') + const logs = t.capture(console, 'log').args + const errs = t.capture(console, 'error').args + const code = await mockBin([path], { + [join(SRC_DIR, 'index.js')]: { + rimraf: async () => { + throw err + }, }, }) + t.strictSame(logs(), []) + t.strictSame(errs(), [[err]]) + t.equal(code, 1) t.equal(statSync(path).isDirectory(), true) - t.equal(res.status, 1) - t.match(res.stderr.toString(), /^Error: simulated rimraf failure/) }) t.test('interactive deletes', t => { @@ -334,15 +343,11 @@ t.test('interactive deletes', t => { } const verboseOpt = ['-v', '-V'] - // t.jobs = scripts.length * verboseOpt.length - - const node = process.execPath - const leftovers = (d: string) => { try { readdirSync(d) return true - } catch (_) { + } catch { return false } } @@ -353,25 +358,14 @@ t.test('interactive deletes', t => { const script = s.slice() t.test(script.join(', '), async t => { const d = t.testdir(fixture) - const args = [binModule, '-i', verbose, d] - const child = spawn(node, args, { - stdio: 'pipe', - }) + const child = spawnBin(['-i', verbose, d]) const out: string[] = [] const err: string[] = [] - const timer = setTimeout(() => { - t.fail('timed out') - child.kill('SIGKILL') - }, 10000) - child.stdout.setEncoding('utf8') - child.stderr.setEncoding('utf8') - let last = '' - child.stdout.on('data', async (c: string) => { - // await new Promise(r => setTimeout(r, 50)) + const last = '' + child.stdout.on('data', (c: string) => { out.push(c.trim()) const s = script.shift() if (s !== undefined) { - last === s out.push(s.trim()) child.stdin.write(s + '\n') } else { @@ -379,14 +373,11 @@ t.test('interactive deletes', t => { child.stdin.write(last + '\n') } }) - child.stderr.on('data', (c: string) => { - err.push(c) - }) + child.stderr.on('data', (c: string) => err.push(c)) return new Promise(res => { child.on( 'close', (code: number | null, signal: NodeJS.Signals | null) => { - clearTimeout(timer) t.same(err, [], 'should not see any stderr') t.equal(code, 0, 'code') t.equal(signal, null, 'signal') diff --git a/test/default-tmp.ts b/test/default-tmp.ts index 66c8b637..ee025bd8 100644 --- a/test/default-tmp.ts +++ b/test/default-tmp.ts @@ -4,12 +4,10 @@ import { tmpdir } from 'os' import { win32 } from 'path' t.test('posix platform', async t => { + t.intercept(process, 'platform', { value: 'posix' }) const { defaultTmp, defaultTmpSync } = (await t.mockImport( - '../dist/esm/default-tmp.js', - { - '../dist/esm/platform.js': 'posix', - }, - )) as typeof import('../dist/esm/default-tmp.js') + '../src/default-tmp.js', + )) as typeof import('../src/default-tmp.js') t.equal(defaultTmpSync('anything'), tmpdir()) t.equal(await defaultTmp('anything').then(t => t), tmpdir()) }) @@ -25,22 +23,22 @@ t.test('windows', async t => { throw Object.assign(new Error('no ents here'), { code: 'ENOENT' }) } } + t.intercept(process, 'platform', { value: 'win32' }) const { defaultTmp, defaultTmpSync } = (await t.mockImport( - '../dist/esm/default-tmp.js', + '../src/default-tmp.js', { os: { tmpdir: () => 'C:\\Windows\\Temp', }, path: win32, - '../dist/esm/platform.js': 'win32', - '../dist/esm/fs.js': { + '../src/fs.js': { statSync: tempDirCheck, promises: { stat: async (path: string) => tempDirCheck(path), }, }, }, - )) as typeof import('../dist/esm/default-tmp.js') + )) as typeof import('../src/default-tmp.js') const expect = { 'c:\\some\\path': 'C:\\Windows\\Temp', diff --git a/test/fix-eperm.ts b/test/fix-eperm.ts index 9e4b0c3d..64fdac65 100644 --- a/test/fix-eperm.ts +++ b/test/fix-eperm.ts @@ -2,20 +2,19 @@ import t from 'tap' t.test('works if it works', async t => { const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', - {}, - )) as typeof import('../dist/esm/fix-eperm.js') - const fixed = fixEPERM(async () => 1) - await fixed('x').then(n => t.equal(n, 1)) - const fixedSync = fixEPERMSync(() => 1) - t.equal(fixedSync('x'), 1) + '../src/fix-eperm.js', + )) as typeof import('../src/fix-eperm.js') + let res: null | number = null + await fixEPERM(async () => (res = 1))('x') + t.equal(res, 1) + fixEPERMSync(() => (res = 2))('x') + t.equal(res, 2) }) t.test('throw non-EPERM just throws', async t => { const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', - {}, - )) as typeof import('../dist/esm/fix-eperm.js') + '../src/fix-eperm.js', + )) as typeof import('../src/fix-eperm.js') const fixed = fixEPERM(() => { throw new Error('oops') }) @@ -29,10 +28,9 @@ t.test('throw non-EPERM just throws', async t => { t.test('throw ENOENT returns void', async t => { const er = Object.assign(new Error('no ents'), { code: 'ENOENT' }) const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', - {}, - )) as typeof import('../dist/esm/fix-eperm.js') - const fixed = fixEPERM(() => { + '../src/fix-eperm.js', + )) as typeof import('../src/fix-eperm.js') + const fixed = fixEPERM(async () => { throw er }) await fixed('x').then(n => t.equal(n, undefined)) @@ -65,14 +63,14 @@ t.test('chmod and try again', async t => { } const chmod = async (p: string, mode: number) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', + '../src/fix-eperm.js', { - '../dist/esm/fs.js': { + '../src/fs.js': { promises: { chmod }, chmodSync, }, }, - )) as typeof import('../dist/esm/fix-eperm.js') + )) as typeof import('../src/fix-eperm.js') const fixed = fixEPERM(asyncMethod) const fixedSync = fixEPERMSync(method) await fixed('async').then(n => t.equal(n, undefined)) @@ -106,14 +104,14 @@ t.test('chmod ENOENT is fine, abort', async t => { } const chmod = async (p: string, mode: number) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', + '../src/fix-eperm.js', { - '../dist/esm/fs.js': { + '../src/fs.js': { promises: { chmod }, chmodSync, }, }, - )) as typeof import('../dist/esm/fix-eperm.js') + )) as typeof import('../src/fix-eperm.js') const fixed = fixEPERM(asyncMethod) const fixedSync = fixEPERMSync(method) await fixed('async').then(n => t.equal(n, undefined)) @@ -147,14 +145,14 @@ t.test('chmod other than ENOENT is failure', async t => { } const chmod = async (p: string, mode: number) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = (await t.mockImport( - '../dist/esm/fix-eperm.js', + '../src/fix-eperm.js', { - '../dist/esm/fs.js': { + '../src/fs.js': { promises: { chmod }, chmodSync, }, }, - )) as typeof import('../dist/esm/fix-eperm.js') + )) as typeof import('../src/fix-eperm.js') const fixed = fixEPERM(asyncMethod) const fixedSync = fixEPERMSync(method) await t.rejects(fixed('async'), { code: 'EPERM' }) diff --git a/test/fs.ts b/test/fs.ts index c196ebb7..be2c78f1 100644 --- a/test/fs.ts +++ b/test/fs.ts @@ -1,47 +1,50 @@ -import t from 'tap' +import t, { Test } from 'tap' // verify that every function in the root is *Sync, and every // function is fs.promises is the promisified version of fs[method], // and that when the cb returns an error, the promised version fails, // and when the cb returns data, the promisified version resolves to it. import realFS from 'fs' -import * as fs from '../dist/esm/fs.js' +import * as fs from '../src/fs.js' +import { useNative } from '../src/use-native.js' + +type MockCb = (e: Error | null, m?: string) => void +type MockFsCb = Record void> +type MockFsPromise = Record Promise> + +const mockFs = async (t: Test, mock: MockFsCb) => + (await t.mockImport('../src/fs.js', { + fs: t.createMock(realFS, mock), + })) as typeof import('../src/fs.js') const mockFSMethodPass = (method: string) => - (...args: any[]) => { - const cb = args.pop() - process.nextTick(() => cb(null, method, 1, 2, 3)) + (...args: unknown[]) => { + process.nextTick(() => (args.at(-1) as MockCb)(null, method)) } const mockFSMethodFail = - (method: string) => - (...args: any[]) => { - const cb = args.pop() - process.nextTick(() => cb(new Error('oops'), method, 1, 2, 3)) + () => + (...args: unknown[]) => { + process.nextTick(() => (args.at(-1) as MockCb)(new Error('oops'))) } -import { useNative } from '../dist/esm/use-native.js' t.type(fs.promises, Object) -const mockFSPass: Record any> = {} -const mockFSFail: Record any> = {} +const mockFSPass: MockFsCb = {} +const mockFSFail: MockFsCb = {} -for (const method of Object.keys( - fs.promises as Record any>, -)) { +for (const method of Object.keys(fs.promises)) { // of course fs.rm is missing when we shouldn't use native :) // also, readdirSync is clubbed to always return file types if (method !== 'rm' || useNative()) { t.type( - (realFS as { [k: string]: any })[method], + (realFS as unknown as MockFsCb)[method], Function, `real fs.${method} is a function`, ) if (method !== 'readdir') { t.equal( - (fs as { [k: string]: any })[`${method}Sync`], - (realFS as unknown as { [k: string]: (...a: any[]) => any })[ - `${method}Sync` - ], + (fs as unknown as MockFsCb)[`${method}Sync`], + (realFS as unknown as MockFsCb)[`${method}Sync`], `has ${method}Sync`, ) } @@ -49,7 +52,7 @@ for (const method of Object.keys( // set up our pass/fails for the next tests mockFSPass[method] = mockFSMethodPass(method) - mockFSFail[method] = mockFSMethodFail(method) + mockFSFail[method] = mockFSMethodFail() } // doesn't have any sync versions that aren't promisified @@ -59,30 +62,35 @@ for (const method of Object.keys(fs)) { } const m = method.replace(/Sync$/, '') t.type( - (fs.promises as { [k: string]: (...a: any[]) => any })[m], + (fs.promises as unknown as MockFsCb)[m], Function, `fs.promises.${m} is a function`, ) } t.test('passing resolves promise', async t => { - const fs = (await t.mockImport('../src/fs.js', { - fs: { ...realFS, ...mockFSPass }, - })) as typeof import('../src/fs.js') + const fs = await mockFs(t, mockFSPass) for (const [m, fn] of Object.entries( - fs.promises as { [k: string]: (...a: any) => Promise }, + fs.promises as unknown as MockFsPromise, )) { - t.same(await fn(), m, `got expected value for ${m}`) + const expected = + ['chmod', 'rename', 'rm', 'rmdir', 'unlink'].includes(m) ? undefined : m + t.same(await fn(), expected, `got expected value for ${m}`) } }) t.test('failing rejects promise', async t => { - const fs = (await t.mockImport('../src/fs.js', { - fs: { ...realFS, ...mockFSFail }, - })) as typeof import('../src/fs.js') + const fs = await mockFs(t, mockFSFail) for (const [m, fn] of Object.entries( - fs.promises as { [k: string]: (...a: any[]) => Promise }, + fs.promises as unknown as MockFsPromise, )) { t.rejects(fn(), { message: 'oops' }, `got expected value for ${m}`) } }) + +t.test('readdirSync', async t => { + const args: unknown[][] = [] + const fs = await mockFs(t, { readdirSync: (...a) => args.push(a) }) + fs.readdirSync('x') + t.strictSame(args, [['x', { withFileTypes: true }]]) +}) diff --git a/test/ignore-enoent.ts b/test/ignore-enoent.ts index e2fea25b..c454a3c4 100644 --- a/test/ignore-enoent.ts +++ b/test/ignore-enoent.ts @@ -1,25 +1,42 @@ import t from 'tap' -import { ignoreENOENT, ignoreENOENTSync } from '../dist/esm/ignore-enoent.js' +import { ignoreENOENT, ignoreENOENTSync } from '../src/ignore-enoent.js' -const enoent = Object.assign(new Error('no ent'), { code: 'ENOENT' }) -const eperm = Object.assign(new Error('eperm'), { code: 'EPERM' }) +const enoent = () => Object.assign(new Error('no ent'), { code: 'ENOENT' }) +const eperm = () => Object.assign(new Error('eperm'), { code: 'EPERM' }) -const throwEnoent = () => { - throw enoent -} -const throwEperm = () => { - throw eperm -} +t.test('async', async t => { + t.resolves(ignoreENOENT(Promise.reject(enoent())), 'enoent is fine') + t.rejects( + ignoreENOENT(Promise.reject(eperm())), + { code: 'EPERM' }, + 'eperm is not', + ) + const rethrow = new Error('rethrow') + t.rejects( + ignoreENOENT(Promise.reject(eperm()), rethrow), + rethrow, + 'or rethrows passed in error', + ) +}) -t.resolves(ignoreENOENT(Promise.reject(enoent)), 'enoent is fine') -t.rejects( - ignoreENOENT(Promise.reject(eperm)), - { code: 'EPERM' }, - 'eperm is not', -) -t.doesNotThrow(() => ignoreENOENTSync(throwEnoent), 'enoent is fine sync') -t.throws( - () => ignoreENOENTSync(throwEperm), - { code: 'EPERM' }, - 'eperm is not fine sync', -) +t.test('sync', t => { + const throwEnoent = () => { + throw enoent() + } + const throwEperm = () => { + throw eperm() + } + t.doesNotThrow(() => ignoreENOENTSync(throwEnoent), 'enoent is fine sync') + t.throws( + () => ignoreENOENTSync(throwEperm), + { code: 'EPERM' }, + 'eperm is not fine sync', + ) + const rethrow = new Error('rethrow') + t.throws( + () => ignoreENOENTSync(throwEperm, rethrow), + rethrow, + 'or rethrows passed in error', + ) + t.end() +}) diff --git a/test/index.ts b/test/index.ts index fe4698ee..a2250320 100644 --- a/test/index.ts +++ b/test/index.ts @@ -9,14 +9,31 @@ import { RimrafSyncOptions, } from '../src/index.js' -import * as OPTARG from '../dist/esm/opt-arg.js' +import * as OPTARG from '../src/opt-arg.js' + +const mockRimraf = + (fn: (path: string, opt: RimrafOptions) => void) => + async (path: string, opt: RimrafOptions) => { + fn(path, opt) + return true + } + +const mockRimrafSync = + (fn: (path: string, opt: RimrafOptions) => void) => + (path: string, opt: RimrafOptions) => { + fn(path, opt) + return true + } t.test('mocky unit tests to select the correct function', async t => { // don't mock rimrafManual, so we can test the platform switch - const CALLS: any[] = [] + const CALLS: ( + | [string, string, RimrafOptions] + | [string, string | RimrafOptions] + )[] = [] let USE_NATIVE = true const mocks = { - '../dist/esm/use-native.js': { + '../src/use-native.js': { useNative: (opt: RimrafOptions) => { CALLS.push(['useNative', opt]) return USE_NATIVE @@ -26,11 +43,11 @@ t.test('mocky unit tests to select the correct function', async t => { return USE_NATIVE }, }, - '../dist/esm/path-arg.js': (path: string) => { + '../src/path-arg.js': (path: string) => { CALLS.push(['pathArg', path]) return path }, - '../dist/esm/opt-arg.js': { + '../src/opt-arg.js': { ...OPTARG, optArg: (opt: RimrafOptions) => { CALLS.push(['optArg', opt]) @@ -41,43 +58,46 @@ t.test('mocky unit tests to select the correct function', async t => { return opt }, }, - '../dist/esm/rimraf-posix.js': { - rimrafPosix: async (path: string, opt: RimrafOptions) => { + '../src/rimraf-posix.js': { + rimrafPosix: mockRimraf((path, opt) => { CALLS.push(['rimrafPosix', path, opt]) - }, - rimrafPosixSync: async (path: string, opt: RimrafOptions) => { + }), + rimrafPosixSync: mockRimrafSync((path, opt) => { CALLS.push(['rimrafPosixSync', path, opt]) - }, + }), }, - '../dist/esm/rimraf-windows.js': { - rimrafWindows: async (path: string, opt: RimrafOptions) => { + '../src/rimraf-windows.js': { + rimrafWindows: mockRimraf((path, opt) => { CALLS.push(['rimrafWindows', path, opt]) - }, - rimrafWindowsSync: async (path: string, opt: RimrafOptions) => { + }), + rimrafWindowsSync: mockRimrafSync((path, opt) => { CALLS.push(['rimrafWindowsSync', path, opt]) - }, + }), }, - '../dist/esm/rimraf-native.js': { - rimrafNative: async (path: string, opt: RimrafOptions) => { + '../src/rimraf-native.js': { + rimrafNative: mockRimraf((path, opt) => { CALLS.push(['rimrafNative', path, opt]) - }, - rimrafNativeSync: async (path: string, opt: RimrafOptions) => { + }), + rimrafNativeSync: mockRimrafSync((path, opt) => { CALLS.push(['rimrafNativeSync', path, opt]) - }, + }), }, } - process.env.__TESTING_RIMRAF_PLATFORM__ = 'posix' - const { rimraf } = (await t.mockImport( - '../dist/esm/index.js', - mocks, - )) as typeof import('../dist/esm/index.js') + t.intercept(process, 'platform', { value: 'posix' }) + const { rimraf } = (await t.mockImport('../src/index.js', { + ...mocks, + '../src/rimraf-manual.js': (await t.mockImport( + '../src/rimraf-manual.js', + mocks, + )) as typeof import('../src/rimraf-manual.js'), + })) as typeof import('../src/index.js') t.afterEach(() => (CALLS.length = 0)) for (const useNative of [true, false]) { t.test(`main function, useNative=${useNative}`, t => { USE_NATIVE = useNative - rimraf('path', { a: 1 } as unknown as RimrafAsyncOptions) - rimraf.sync('path', { a: 2 } as unknown as RimrafSyncOptions) + void rimraf('path', { a: 1 } as RimrafAsyncOptions) + rimraf.sync('path', { a: 2 } as RimrafSyncOptions) t.equal(rimraf.rimraf, rimraf) t.equal(rimraf.rimrafSync, rimraf.sync) t.matchSnapshot(CALLS) @@ -86,32 +106,32 @@ t.test('mocky unit tests to select the correct function', async t => { } t.test('manual', t => { - rimraf.manual('path', { a: 3 } as unknown as RimrafAsyncOptions) - rimraf.manual.sync('path', { a: 4 } as unknown as RimrafSyncOptions) + void rimraf.manual('path', { a: 3 } as RimrafAsyncOptions) + rimraf.manual.sync('path', { a: 4 } as RimrafSyncOptions) t.equal(rimraf.manualSync, rimraf.manual.sync) t.matchSnapshot(CALLS) t.end() }) t.test('native', t => { - rimraf.native('path', { a: 5 } as unknown as RimrafAsyncOptions) - rimraf.native.sync('path', { a: 6 } as unknown as RimrafSyncOptions) + void rimraf.native('path', { a: 5 } as RimrafAsyncOptions) + rimraf.native.sync('path', { a: 6 } as RimrafSyncOptions) t.equal(rimraf.nativeSync, rimraf.native.sync) t.matchSnapshot(CALLS) t.end() }) t.test('posix', t => { - rimraf.posix('path', { a: 7 } as unknown as RimrafAsyncOptions) - rimraf.posix.sync('path', { a: 8 } as unknown as RimrafSyncOptions) + void rimraf.posix('path', { a: 7 } as RimrafAsyncOptions) + rimraf.posix.sync('path', { a: 8 } as RimrafSyncOptions) t.equal(rimraf.posixSync, rimraf.posix.sync) t.matchSnapshot(CALLS) t.end() }) t.test('windows', t => { - rimraf.windows('path', { a: 9 } as unknown as RimrafAsyncOptions) - rimraf.windows.sync('path', { a: 10 } as unknown as RimrafSyncOptions) + void rimraf.windows('path', { a: 9 } as RimrafAsyncOptions) + rimraf.windows.sync('path', { a: 10 } as RimrafSyncOptions) t.equal(rimraf.windowsSync, rimraf.windows.sync) t.matchSnapshot(CALLS) t.end() @@ -157,25 +177,24 @@ t.test('actually delete some stuff', t => { }) t.test('accept array of paths as first arg', async t => { - const ASYNC_CALLS: any[] = [] - const SYNC_CALLS: any[] = [] - const { rimraf, rimrafSync } = (await t.mockImport('../dist/esm/index.js', { - '../dist/esm/use-native.js': { + const ASYNC_CALLS: [string, RimrafOptions][] = [] + const SYNC_CALLS: [string, RimrafOptions][] = [] + const { rimraf, rimrafSync } = (await t.mockImport('../src/index.js', { + '../src/use-native.js': { useNative: () => true, useNativeSync: () => true, }, - '../dist/esm/rimraf-native.js': { - rimrafNative: async (path: string, opt: RimrafOptions) => - ASYNC_CALLS.push([path, opt]), - rimrafNativeSync: (path: string, opt: RimrafOptions) => - SYNC_CALLS.push([path, opt]), + '../src/rimraf-native.js': { + rimrafNative: mockRimraf((path, opt) => { + ASYNC_CALLS.push([path, opt]) + }), + rimrafNativeSync: mockRimrafSync((path, opt) => { + SYNC_CALLS.push([path, opt]) + }), }, - })) as typeof import('../dist/esm/index.js') + })) as typeof import('../src/index.js') t.equal(await rimraf(['a', 'b', 'c']), true) - t.equal( - await rimraf(['i', 'j', 'k'], { x: 'ya' } as unknown as RimrafOptions), - true, - ) + t.equal(await rimraf(['i', 'j', 'k'], { x: 'ya' } as RimrafOptions), true) t.same(ASYNC_CALLS, [ [resolve('a'), {}], [resolve('b'), {}], @@ -189,7 +208,7 @@ t.test('accept array of paths as first arg', async t => { t.equal( rimrafSync(['m', 'n', 'o'], { cat: 'chai', - } as unknown as RimrafSyncOptions), + } as RimrafSyncOptions), true, ) t.same(SYNC_CALLS, [ diff --git a/test/delete-many-files.ts b/test/integration/delete-many-files.ts similarity index 86% rename from test/delete-many-files.ts rename to test/integration/delete-many-files.ts index 6e7648b2..8d4b47f2 100644 --- a/test/delete-many-files.ts +++ b/test/integration/delete-many-files.ts @@ -1,11 +1,12 @@ // this isn't for coverage. it's basically a smoke test, to ensure that // we can delete a lot of files on CI in multiple platforms and node versions. import t from 'tap' - -if (/^v10\./.test(process.version)) { - t.plan(0, 'skip this on node 10, it runs out of memory') - process.exit(0) -} +import { statSync, mkdirSync, readdirSync } from '../../src/fs.js' +import { writeFileSync } from 'fs' +import { resolve, dirname } from 'path' +import { manual } from '../../src/index.js' +import { setTimeout } from 'timers/promises' +const cases = { manual } // run with RIMRAF_TEST_START_CHAR/_END_CHAR/_DEPTH environs to // make this more or less aggressive. @@ -13,10 +14,6 @@ const START = (process.env.RIMRAF_TEST_START_CHAR || 'a').charCodeAt(0) const END = (process.env.RIMRAF_TEST_END_CHAR || 'f').charCodeAt(0) const DEPTH = +(process.env.RIMRAF_TEST_DEPTH || '') || 4 -import { statSync, mkdirSync, readdirSync } from '../dist/esm/fs.js' -import { writeFileSync } from 'fs' -import { resolve, dirname } from 'path' - const create = (path: string, depth = 0) => { mkdirSync(path) for (let i = START; i <= END; i++) { @@ -30,9 +27,6 @@ const create = (path: string, depth = 0) => { return path } -import { manual } from '../dist/esm/index.js' -const cases = { manual } - const base = t.testdir( Object.fromEntries( Object.entries(cases).map(([name]) => [ @@ -45,7 +39,7 @@ const base = t.testdir( ), ) -t.test('create all fixtures', t => { +t.test('create all fixtures', async t => { for (const name of Object.keys(cases)) { for (const type of ['sync', 'async']) { const path = `${base}/${name}/${type}/test` @@ -53,7 +47,7 @@ t.test('create all fixtures', t => { t.equal(statSync(path).isDirectory(), true, `${name}/${type} created`) } } - setTimeout(() => t.end(), 3000) + await setTimeout(3000) }) t.test('delete all fixtures', t => { diff --git a/test/opt-arg.ts b/test/opt-arg.ts index 56ff3704..6689364b 100644 --- a/test/opt-arg.ts +++ b/test/opt-arg.ts @@ -1,9 +1,10 @@ import t from 'tap' -import { optArg as oa, optArgSync as oas } from '../dist/esm/opt-arg.js' +import { optArg as oa, optArgSync as oas } from '../src/opt-arg.js' import { RimrafAsyncOptions, RimrafSyncOptions } from '../src/index.js' const asyncOpt = { a: 1 } as unknown as RimrafAsyncOptions const syncOpt = { s: 1 } as unknown as RimrafSyncOptions +const signal = { x: 1 } as unknown as AbortSignal t.same(oa(asyncOpt), asyncOpt, 'returns equivalent object if provided') t.same(oas(syncOpt), oa(syncOpt), 'optArgSync does the same thing') @@ -102,7 +103,7 @@ t.test('glob option handling', t => { t.same(oa({ glob: true }), { glob: { absolute: true, withFileTypes: false }, }) - const gws = oa({ signal: { x: 1 } as unknown as AbortSignal, glob: true }) + const gws = oa({ signal, glob: true }) t.same(gws, { signal: { x: 1 }, glob: { absolute: true, signal: { x: 1 }, withFileTypes: false }, @@ -112,7 +113,7 @@ t.test('glob option handling', t => { glob: { absolute: true, nodir: true, withFileTypes: false }, }) const gwsg = oa({ - signal: { x: 1 } as unknown as AbortSignal, + signal, glob: { nodir: true }, }) t.same(gwsg, { @@ -127,15 +128,15 @@ t.test('glob option handling', t => { t.equal(gwsg.signal, gwsg.glob?.signal) t.same( oa({ - signal: { x: 1 } as unknown as AbortSignal, - glob: { nodir: true, signal: { y: 1 } as unknown as AbortSignal }, + signal, + glob: { nodir: true, signal }, }), { signal: { x: 1 }, glob: { absolute: true, nodir: true, - signal: { y: 1 }, + signal: { x: 1 }, withFileTypes: false, }, }, diff --git a/test/path-arg.ts b/test/path-arg.ts index 24351655..aeb5f08f 100644 --- a/test/path-arg.ts +++ b/test/path-arg.ts @@ -1,95 +1,81 @@ import * as PATH from 'path' import t from 'tap' -import { fileURLToPath } from 'url' import { inspect } from 'util' -if (!process.env.__TESTING_RIMRAF_PLATFORM__) { - const fake = process.platform === 'win32' ? 'posix' : 'win32' - t.spawn( - process.execPath, - [...process.execArgv, fileURLToPath(import.meta.url)], - { - name: fake, - env: { - ...process.env, - __TESTING_RIMRAF_PLATFORM__: fake, - }, - }, - ) -} +for (const platform of ['win32', 'posix'] as const) { + t.test(platform, async t => { + t.intercept(process, 'platform', { value: platform }) + const path = PATH[platform] || PATH + const { default: pathArg } = (await t.mockImport('../src/path-arg.js', { + path, + })) as typeof import('../src/path-arg.js') -const platform = process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform -const path = PATH[platform as 'win32' | 'posix'] || PATH -const { default: pathArg } = (await t.mockImport('../dist/esm/path-arg.js', { - path, -})) as typeof import('../dist/esm/path-arg.js') + t.equal(pathArg('a/b/c'), path.resolve('a/b/c')) + t.throws( + () => pathArg('a\0b'), + Error('path must be a string without null bytes'), + ) + if (platform === 'win32') { + const badPaths = [ + 'c:\\a\\b:c', + 'c:\\a\\b*c', + 'c:\\a\\b?c', + 'c:\\a\\bc', + 'c:\\a\\b|c', + 'c:\\a\\b"c', + ] + for (const path of badPaths) { + const er = Object.assign(new Error('Illegal characters in path'), { + path, + code: 'EINVAL', + }) + t.throws(() => pathArg(path), er) + } + } -const { resolve } = path + t.throws(() => pathArg('/'), { code: 'ERR_PRESERVE_ROOT' }) -t.equal(pathArg('a/b/c'), resolve('a/b/c')) -t.throws( - () => pathArg('a\0b'), - Error('path must be a string without null bytes'), -) -if (platform === 'win32') { - const badPaths = [ - 'c:\\a\\b:c', - 'c:\\a\\b*c', - 'c:\\a\\b?c', - 'c:\\a\\bc', - 'c:\\a\\b|c', - 'c:\\a\\b"c', - ] - for (const path of badPaths) { - const er = Object.assign(new Error('Illegal characters in path'), { - path, - code: 'EINVAL', + t.throws(() => pathArg('/', { preserveRoot: undefined }), { + code: 'ERR_PRESERVE_ROOT', }) - t.throws(() => pathArg(path), er) - } -} - -t.throws(() => pathArg('/'), { code: 'ERR_PRESERVE_ROOT' }) - -t.throws(() => pathArg('/', { preserveRoot: undefined }), { - code: 'ERR_PRESERVE_ROOT', -}) -t.equal(pathArg('/', { preserveRoot: false }), resolve('/')) + t.equal(pathArg('/', { preserveRoot: false }), path.resolve('/')) -//@ts-expect-error -t.throws(() => pathArg({}), { - code: 'ERR_INVALID_ARG_TYPE', - path: {}, - message: - 'The "path" argument must be of type string. ' + - 'Received an instance of Object', - name: 'TypeError', -}) -//@ts-expect-error -t.throws(() => pathArg([]), { - code: 'ERR_INVALID_ARG_TYPE', - path: [], - message: - 'The "path" argument must be of type string. ' + - 'Received an instance of Array', - name: 'TypeError', -}) -//@ts-expect-error -t.throws(() => pathArg(Object.create(null) as {}), { - code: 'ERR_INVALID_ARG_TYPE', - path: Object.create(null), - message: - 'The "path" argument must be of type string. ' + - `Received ${inspect(Object.create(null))}`, - name: 'TypeError', -}) -//@ts-expect-error -t.throws(() => pathArg(true), { - code: 'ERR_INVALID_ARG_TYPE', - path: true, - message: - 'The "path" argument must be of type string. ' + - `Received type boolean true`, - name: 'TypeError', -}) + //@ts-expect-error + t.throws(() => pathArg({}), { + code: 'ERR_INVALID_ARG_TYPE', + path: {}, + message: + 'The "path" argument must be of type string. ' + + 'Received an instance of Object', + name: 'TypeError', + }) + //@ts-expect-error + t.throws(() => pathArg([]), { + code: 'ERR_INVALID_ARG_TYPE', + path: [], + message: + 'The "path" argument must be of type string. ' + + 'Received an instance of Array', + name: 'TypeError', + }) + //@ts-expect-error + t.throws(() => pathArg(Object.create(null) as object), { + code: 'ERR_INVALID_ARG_TYPE', + path: Object.create(null) as object, + message: + 'The "path" argument must be of type string. ' + + `Received ${inspect(Object.create(null))}`, + name: 'TypeError', + }) + //@ts-expect-error + t.throws(() => pathArg(true), { + code: 'ERR_INVALID_ARG_TYPE', + path: true, + message: + 'The "path" argument must be of type string. ' + + `Received type boolean true`, + name: 'TypeError', + }) + }) +} diff --git a/test/platform.ts b/test/platform.ts deleted file mode 100644 index 0781c42b..00000000 --- a/test/platform.ts +++ /dev/null @@ -1,14 +0,0 @@ -import t from 'tap' -import actual from '../dist/esm/platform.js' -t.test('actual platform', t => { - t.equal(actual, process.platform) - t.end() -}) -t.test('fake platform', async t => { - process.env.__TESTING_RIMRAF_PLATFORM__ = 'not actual platform' - t.equal( - (await t.mockImport('../dist/esm/platform.js')).default, - 'not actual platform', - ) - t.end() -}) diff --git a/test/readdir-or-error.ts b/test/readdir-or-error.ts index b2ebf184..d7764b17 100644 --- a/test/readdir-or-error.ts +++ b/test/readdir-or-error.ts @@ -1,8 +1,5 @@ import t from 'tap' -import { - readdirOrError, - readdirOrErrorSync, -} from '../dist/esm/readdir-or-error.js' +import { readdirOrError, readdirOrErrorSync } from '../src/readdir-or-error.js' const path = t.testdir({ file: 'file', diff --git a/test/retry-busy.ts b/test/retry-busy.ts index 0d6b1104..eaee7af5 100644 --- a/test/retry-busy.ts +++ b/test/retry-busy.ts @@ -5,7 +5,7 @@ import { RATE, retryBusy, retryBusySync, -} from '../dist/esm/retry-busy.js' +} from '../src/retry-busy.js' import t from 'tap' @@ -21,14 +21,14 @@ t.matchSnapshot( t.test('basic working operation when no errors happen', async t => { let calls = 0 - const arg = {} as unknown as string + const arg: string = 'path' const opt = {} - const method = (a: typeof arg, b?: any) => { + const method = (a: string, b?: unknown) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') calls++ } - const asyncMethod = async (a: typeof arg, b?: any) => method(a, b) + const asyncMethod = async (a: string, b?: unknown) => method(a, b) const rBS = retryBusySync(method) rBS(arg, opt) t.equal(calls, 1) @@ -43,9 +43,9 @@ t.test('retry when known error code thrown', t => { t.test(code, async t => { let thrown = false let calls = 0 - const arg = {} as unknown as string + const arg = 'path' const opt = {} - const method = (a: string, b?: any) => { + const method = (a: string, b?: unknown) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') if (!thrown) { @@ -59,7 +59,7 @@ t.test('retry when known error code thrown', t => { thrown = false } } - const asyncMethod = async (a: string, b?: any) => method(a, b) + const asyncMethod = async (a: string, b?: unknown) => method(a, b) const rBS = retryBusySync(method) rBS(arg, opt) t.equal(calls, 2) @@ -80,14 +80,14 @@ t.test('retry and eventually give up', t => { for (const code of codes) { t.test(code, async t => { let calls = 0 - const arg = {} as unknown as string - const method = (a: string, b?: any) => { + const arg = 'path' + const method = (a: string, b?: unknown) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') calls++ throw Object.assign(new Error(code), { path: a, code }) } - const asyncMethod = async (a: string, b?: any) => method(a, b) + const asyncMethod = async (a: string, b?: unknown) => method(a, b) const rBS = retryBusySync(method) t.throws(() => rBS(arg, opt), { path: arg, code }) t.equal(calls, 3) @@ -99,16 +99,16 @@ t.test('retry and eventually give up', t => { }) t.test('throw unknown error gives up right away', async t => { - const arg = {} as unknown as string + const arg = 'path' const opt = {} - const method = (a: string, b?: any) => { + const method = (a: string, b?: unknown) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') - throw Object.assign(new Error('nope'), { path: a, code: 'nope' }) + throw Object.assign(new Error('nope')) } - const asyncMethod = async (a: string, b?: any) => method(a, b) + const asyncMethod = async (a: string, b?: unknown) => method(a, b) const rBS = retryBusySync(method) - t.throws(() => rBS(arg, opt), { code: 'nope' }) + t.throws(() => rBS(arg, opt), { message: 'nope' }) const rB = retryBusy(asyncMethod) - await t.rejects(rB(arg, opt), { code: 'nope' }) + await t.rejects(rB(arg, opt), { message: 'nope' }) }) diff --git a/test/rimraf-manual.ts b/test/rimraf-manual.ts index bd8e3a24..86d175a1 100644 --- a/test/rimraf-manual.ts +++ b/test/rimraf-manual.ts @@ -1,29 +1,20 @@ import t from 'tap' -import { fileURLToPath } from 'url' -import { rimrafManual, rimrafManualSync } from '../dist/esm/rimraf-manual.js' -import { rimrafPosix, rimrafPosixSync } from '../dist/esm/rimraf-posix.js' -import { rimrafWindows, rimrafWindowsSync } from '../dist/esm/rimraf-windows.js' +import { rimrafPosix, rimrafPosixSync } from '../src/rimraf-posix.js' +import { rimrafWindows, rimrafWindowsSync } from '../src/rimraf-windows.js' -if (!process.env.__TESTING_RIMRAF_PLATFORM__) { - const otherPlatform = process.platform !== 'win32' ? 'win32' : 'posix' - t.spawn( - process.execPath, - [...process.execArgv, fileURLToPath(import.meta.url)], - { - name: otherPlatform, - env: { - ...process.env, - __TESTING_RIMRAF_PLATFORM__: otherPlatform, - }, - }, - ) -} +for (const platform of ['win32', 'posix']) { + t.test(platform, async t => { + t.intercept(process, 'platform', { value: platform }) + const { rimrafManual, rimrafManualSync } = (await t.mockImport( + '../src/rimraf-manual.js', + )) as typeof import('../src/rimraf-manual.js') -const platform = process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform + const [expectManual, expectManualSync] = + platform === 'win32' ? + [rimrafWindows, rimrafWindowsSync] + : [rimrafPosix, rimrafPosixSync] -const [expectManual, expectManualSync] = - platform === 'win32' ? - [rimrafWindows, rimrafWindowsSync] - : [rimrafPosix, rimrafPosixSync] -t.equal(rimrafManual, expectManual, 'got expected implementation') -t.equal(rimrafManualSync, expectManualSync, 'got expected implementation') + t.equal(rimrafManual, expectManual, 'got expected implementation') + t.equal(rimrafManualSync, expectManualSync, 'got expected implementation') + }) +} diff --git a/test/rimraf-move-remove.ts b/test/rimraf-move-remove.ts index ff317666..519ddd2a 100644 --- a/test/rimraf-move-remove.ts +++ b/test/rimraf-move-remove.ts @@ -1,4 +1,13 @@ import t from 'tap' +import { Dirent, Mode, Stats, statSync } from 'fs' +import * as PATH from 'path' +import { basename, parse, relative } from 'path' +import * as FS from '../src/fs.js' +import { + rimrafMoveRemove, + rimrafMoveRemoveSync, +} from '../src/rimraf-move-remove.js' + t.formatSnapshot = (calls: string[][]) => calls.map(args => args.map(arg => @@ -10,14 +19,6 @@ t.formatSnapshot = (calls: string[][]) => ), ) -import { Stats, statSync } from 'fs' -import * as PATH from 'path' -import { basename, parse, relative } from 'path' -import { - rimrafMoveRemove, - rimrafMoveRemoveSync, -} from '../dist/esm/rimraf-move-remove.js' - const fixture = { a: 'a', b: 'b', @@ -40,9 +41,19 @@ const fixture = { }, } -t.only('actually delete some stuff', async t => { - const fs = await import('../dist/esm/fs.js') - const fsMock: Record = { ...fs, promises: { ...fs.promises } } +t.test('actually delete some stuff', async t => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type MockFs = (...args: any[]) => Promise + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type MockFsSync = (...args: any[]) => any + const fsMock: { + [k in Exclude]: MockFsSync + } & { + promises: Record + } = { + ...FS, + promises: { ...(FS.promises as Record) }, + } // simulate annoying windows semantics, where an unlink or rmdir // may take an arbitrary amount of time. we only delay unlinks, @@ -50,12 +61,12 @@ t.only('actually delete some stuff', async t => { const { statSync, promises: { unlink }, - } = fs + } = FS const danglers: Promise[] = [] const unlinkLater = (path: string) => { const p = new Promise(res => { - setTimeout(() => unlink(path).then(res, res)) + setTimeout(() => void unlink(path).then(res, res)) }) danglers.push(p) } @@ -66,16 +77,14 @@ t.only('actually delete some stuff', async t => { t.teardown(() => Promise.all(danglers)) const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', - { - '../dist/esm/fs.js': fsMock, - }, - )) as typeof import('../dist/esm/rimraf-posix.js') + '../src/rimraf-posix.js', + { '../src/fs.js': fsMock }, + )) as typeof import('../src/rimraf-posix.js') const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', - { '../dist/esm/fs.js': fsMock }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + '../src/rimraf-move-remove.js', + { '../src/fs.js': fsMock }, + )) as typeof import('../src/rimraf-move-remove.js') t.test('posix does not work here', t => { t.test('sync', t => { @@ -111,17 +120,16 @@ t.only('actually delete some stuff', async t => { t.end() }) -t.only('throw unlink errors', async t => { - const fs = await import('../dist/esm/fs.js') +t.test('throw unlink errors', async t => { + const fs = await import('../src/fs.js') // only throw once here, or else it messes with tap's fixture cleanup // that's probably a bug in t.mock? let threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, + '../src/fs.js': t.createMock(fs, { unlinkSync: (path: string) => { if (threwSync) { return fs.unlinkSync(path) @@ -130,7 +138,6 @@ t.only('throw unlink errors', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { - ...fs.promises, unlink: async (path: string) => { if (threwAsync) { return fs.promises.unlink(path) @@ -139,9 +146,9 @@ t.only('throw unlink errors', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + )) as typeof import('../src/rimraf-move-remove.js') // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' @@ -156,15 +163,14 @@ t.only('throw unlink errors', async t => { t.end() }) -t.only('ignore ENOENT unlink errors', async t => { - const fs = await import('../dist/esm/fs.js') +t.test('ignore ENOENT unlink errors', async t => { + const fs = await import('../src/fs.js') const threwAsync = false let threwSync = false - const { rimrafMoveRemove, rimrafMoveRemoveSync } = await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, + '../src/fs.js': t.createMock(fs, { unlinkSync: (path: string) => { fs.unlinkSync(path) if (threwSync) { @@ -174,7 +180,6 @@ t.only('ignore ENOENT unlink errors', async t => { fs.unlinkSync(path) }, promises: { - ...fs.promises, unlink: async (path: string) => { fs.unlinkSync(path) if (threwAsync) { @@ -184,13 +189,16 @@ t.only('ignore ENOENT unlink errors', async t => { fs.unlinkSync(path) }, }, - }, + }), }, - ) + )) as typeof import('../src/rimraf-move-remove.js') // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' - t.doesNotThrow(() => rimrafMoveRemoveSync(path, {}), 'enoent no problems') + t.doesNotThrow( + () => void rimrafMoveRemoveSync(path, {}), + 'enoent no problems', + ) t.end() }) t.test('async', t => { @@ -202,24 +210,22 @@ t.only('ignore ENOENT unlink errors', async t => { }) t.test('throw rmdir errors', async t => { - const fs = await import('../dist/esm/fs.js') - const { rimrafMoveRemove, rimrafMoveRemoveSync } = await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + const fs = await import('../src/fs.js') + const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, - rmdirSync: (_: string) => { + '../src/fs.js': t.createMock(fs, { + rmdirSync: () => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, promises: { - ...fs.promises, - rmdir: async (_: string) => { + rmdir: async () => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, }, - }, + }), }, - ) + )) as typeof import('../src/rimraf-move-remove.js') t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' @@ -236,24 +242,29 @@ t.test('throw rmdir errors', async t => { }) t.test('throw unexpected readdir errors', async t => { - const fs = await import('../dist/esm/fs.js') + const fs = await import('../src/fs.js') const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, - readdirSync: (_: string) => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) + '../src/readdir-or-error.js': (await t.mockImport( + '../src/readdir-or-error.js', + { + '../src/fs.js': t.createMock(fs, { + readdirSync: () => { + throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) + }, + promises: { + readdir: async () => { + throw Object.assign(new Error('cannot readdir'), { + code: 'FOO', + }) + }, + }, + }), }, - promises: { - ...fs.promises, - readdir: async (_: string) => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) - }, - }, - }, + )) as typeof import('../src/readdir-or-error.js'), }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + )) as typeof import('../src/rimraf-move-remove.js') t.test('sync', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' @@ -272,14 +283,13 @@ t.test('throw unexpected readdir errors', async t => { t.test('refuse to delete the root dir', async t => { const path = await import('path') const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + '../src/rimraf-move-remove.js', { - path: { - ...path, + path: t.createMock(path, { dirname: (path: string) => path, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + )) as typeof import('../src/rimraf-move-remove.js') const d = t.testdir({}) @@ -293,20 +303,28 @@ t.test('refuse to delete the root dir', async t => { }) t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { - const fs = await import('../dist/esm/fs.js') - const CHMODS: any[] = [] + const fs = await import('../src/fs.js') + const CHMODS: unknown[] = [] let threwAsync = false let threwSync = false - const { rimrafMoveRemove, rimrafMoveRemoveSync } = await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - //@ts-ignore - return fs.chmodSync(...args) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(fs, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + return fs.chmodSync(path, mode) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + return fs.promises.chmod(path, mode) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(fs, { unlinkSync: (path: string) => { if (threwSync) { return fs.unlinkSync(path) @@ -315,7 +333,6 @@ t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...fs.promises, unlink: async (path: string) => { if (threwAsync) { return fs.promises.unlink(path) @@ -323,15 +340,10 @@ t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any[]) => { - CHMODS.push(['chmod', ...args]) - //@ts-ignore - return fs.promises.chmod(...args) - }, }, - }, + }), }, - ) + )) as typeof import('../src/rimraf-move-remove.js') t.afterEach(() => (CHMODS.length = 0)) @@ -353,23 +365,34 @@ t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { }) t.test('handle EPERMs, chmod returns ENOENT', async t => { - const fs = await import('../dist/esm/fs.js') - const CHMODS: any[] = [] + const fs = await import('../src/fs.js') + const CHMODS: unknown[] = [] let threwAsync = false let threwSync = false - const { rimrafMoveRemove, rimrafMoveRemoveSync } = await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - try { - fs.unlinkSync(args[0]) - } catch (_) {} - //@ts-ignore - return fs.chmodSync(...args) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(fs, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + try { + fs.unlinkSync(path) + } catch {} + return fs.chmodSync(path, mode) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + try { + fs.unlinkSync(path) + } catch {} + return fs.promises.chmod(path, mode) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(fs, { unlinkSync: (path: string) => { if (threwSync) { return fs.unlinkSync(path) @@ -378,7 +401,6 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...fs.promises, unlink: async (path: string) => { if (threwAsync) { return fs.promises.unlink(path) @@ -386,18 +408,10 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any) => { - CHMODS.push(['chmod', ...args]) - try { - fs.unlinkSync(args[0]) - } catch (_) {} - //@ts-ignore - return fs.promises.chmod(...args) - }, }, - }, + }), }, - ) + )) as typeof import('../src/rimraf-move-remove.js') t.afterEach(() => (CHMODS.length = 0)) @@ -419,22 +433,34 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { }) t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { - const fs = await import('../dist/esm/fs.js') - const CHMODS: any[] = [] + const fs = await import('../src/fs.js') + const CHMODS: unknown[] = [] let threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + '../src/rimraf-move-remove.js', { - '../dist/esm/fs.js': { - ...fs, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - try { - fs.unlinkSync(args[0]) - } catch (_) {} - throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(fs, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + try { + fs.unlinkSync(path) + } catch {} + throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + try { + fs.unlinkSync(path) + } catch {} + throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(fs, { unlinkSync: (path: string) => { if (threwSync) { return fs.unlinkSync(path) @@ -443,7 +469,6 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...fs.promises, unlink: async (path: string) => { if (threwAsync) { return fs.promises.unlink(path) @@ -451,17 +476,10 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any[]) => { - CHMODS.push(['chmod', ...args]) - try { - fs.unlinkSync(args[0]) - } catch (_) {} - throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) - }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + )) as typeof import('../src/rimraf-move-remove.js') t.afterEach(() => (CHMODS.length = 0)) @@ -483,13 +501,12 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { }) t.test('rimraffing root, do not actually rmdir root', async t => { - const fs = await import('../dist/esm/fs.js') + const fs = await import('../src/fs.js') let ROOT: undefined | string = undefined const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( - '../dist/esm/rimraf-move-remove.js', + '../src/rimraf-move-remove.js', { - path: { - ...PATH, + path: t.createMock(PATH, { parse: (path: string) => { const p = parse(path) if (path === ROOT) { @@ -497,9 +514,9 @@ t.test('rimraffing root, do not actually rmdir root', async t => { } return p }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-move-remove.js') + )) as typeof import('../src/rimraf-move-remove.js') t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafMoveRemove(ROOT, { preserveRoot: false }) @@ -519,10 +536,9 @@ t.test( 'abort if the signal says to', { skip: typeof AbortController === 'undefined' }, async t => { - const { rimrafMoveRemove, rimrafMoveRemoveSync } = await t.mockImport( - '../dist/esm/rimraf-move-remove.js', - {}, - ) + const { rimrafMoveRemove, rimrafMoveRemoveSync } = (await t.mockImport( + '../src/rimraf-move-remove.js', + )) as typeof import('../src/rimraf-move-remove.js') t.test('sync', t => { const ac = new AbortController() const { signal } = ac @@ -537,7 +553,7 @@ t.test( const { signal } = ac const opt = { signal, - filter: (p: string, st: Stats) => { + filter: (p: string, st: Stats | Dirent) => { if (basename(p) === 'g' && st.isFile()) { ac.abort(new Error('done')) } diff --git a/test/rimraf-native.ts b/test/rimraf-native.ts index eb14fe23..660853ee 100644 --- a/test/rimraf-native.ts +++ b/test/rimraf-native.ts @@ -1,27 +1,25 @@ import t from 'tap' import { RimrafAsyncOptions, RimrafSyncOptions } from '../src/index.js' -const CALLS: any[] = [] -const fs = { - rmSync: (path: string, options: any) => { - CALLS.push(['rmSync', path, options]) - }, - promises: { - rm: async (path: string, options: any) => { - CALLS.push(['rm', path, options]) - }, - }, -} - +const CALLS: [string, string, unknown][] = [] const { rimrafNative, rimrafNativeSync } = (await t.mockImport( - '../dist/esm/rimraf-native.js', + '../src/rimraf-native.js', { - '../dist/esm/fs.js': fs, + '../src/fs.js': { + rmSync: (path: string, options: unknown) => { + CALLS.push(['rmSync', path, options]) + }, + promises: { + rm: async (path: string, options: unknown) => { + CALLS.push(['rm', path, options]) + }, + }, + }, }, -)) as typeof import('../dist/esm/rimraf-native.js') +)) as typeof import('../src/rimraf-native.js') t.test('calls the right node function', async t => { - await rimrafNative('path', { x: 'y' } as unknown as RimrafAsyncOptions) - rimrafNativeSync('path', { a: 'b' } as unknown as RimrafSyncOptions) + await rimrafNative('path', { x: 'y' } as RimrafAsyncOptions) + rimrafNativeSync('path', { a: 'b' } as RimrafSyncOptions) t.matchSnapshot(CALLS) }) diff --git a/test/rimraf-posix.ts b/test/rimraf-posix.ts index 7dc4465e..5eb2d63a 100644 --- a/test/rimraf-posix.ts +++ b/test/rimraf-posix.ts @@ -1,19 +1,9 @@ -// have to do this *before* loading tap, or else the fact that we -// load rimraf-posix.js for tap's fixture cleanup will cause it to -// have some coverage, but not 100%, failing the coverage check. -// if (process.platform === 'win32') { -// console.log('TAP version 13') -// console.log('1..0 # this test does not work reliably on windows') -// process.exit(0) -// } - import { Dirent, Stats, statSync } from 'fs' import * as PATH from 'path' import { basename, parse, relative } from 'path' import t from 'tap' -import { rimrafPosix, rimrafPosixSync } from '../dist/esm/rimraf-posix.js' - -import * as fs from '../dist/esm/fs.js' +import { rimrafPosix, rimrafPosixSync } from '../src/rimraf-posix.js' +import * as fs from '../src/fs.js' const fixture = { a: 'a', @@ -60,22 +50,20 @@ t.test('actually delete some stuff', t => { t.test('throw unlink errors', async t => { const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', + '../src/rimraf-posix.js', { - '../dist/esm/fs.js': { - ...fs, + '../src/fs.js': t.createMock(fs, { unlinkSync: () => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { - ...fs.promises, unlink: async () => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-posix.js') + )) as typeof import('../src/rimraf-posix.js') const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) @@ -83,22 +71,20 @@ t.test('throw unlink errors', async t => { t.test('throw rmdir errors', async t => { const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', + '../src/rimraf-posix.js', { - '../dist/esm/fs.js': { - ...fs, + '../src/fs.js': t.createMock(fs, { rmdirSync: () => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, promises: { - ...fs.promises, rmdir: async () => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-posix.js') + )) as typeof import('../src/rimraf-posix.js') const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) @@ -106,22 +92,27 @@ t.test('throw rmdir errors', async t => { t.test('throw unexpected readdir errors', async t => { const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', + '../src/rimraf-posix.js', { - '../dist/esm/fs.js': { - ...fs, - readdirSync: () => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) - }, - promises: { - ...fs.promises, - readdir: async () => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) - }, + '../src/readdir-or-error.js': (await t.mockImport( + '../src/readdir-or-error.js', + { + '../src/fs.js': t.createMock(fs, { + readdirSync: () => { + throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) + }, + promises: { + readdir: async () => { + throw Object.assign(new Error('cannot readdir'), { + code: 'FOO', + }) + }, + }, + }), }, - }, + )) as typeof import('../src/readdir-or-error.js'), }, - )) as typeof import('../dist/esm/rimraf-posix.js') + )) as typeof import('../src/rimraf-posix.js') const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) @@ -129,10 +120,9 @@ t.test('throw unexpected readdir errors', async t => { t.test('ignore ENOENTs from unlink/rmdir', async t => { const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', + '../src/rimraf-posix.js', { - '../dist/esm/fs.js': { - ...fs, + '../src/fs.js': t.createMock(fs, { // simulate a case where two rimrafs are happening in parallel, // so the deletion happens AFTER the readdir, but before ours. rmdirSync: (path: string) => { @@ -144,7 +134,6 @@ t.test('ignore ENOENTs from unlink/rmdir', async t => { fs.unlinkSync(path) }, promises: { - ...fs.promises, rmdir: async (path: string) => { fs.rmdirSync(path) return fs.promises.rmdir(path) @@ -154,9 +143,9 @@ t.test('ignore ENOENTs from unlink/rmdir', async t => { return fs.promises.unlink(path) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-posix.js') + )) as typeof import('../src/rimraf-posix.js') const { statSync } = fs t.test('sync', t => { const path = t.testdir(fixture) @@ -176,10 +165,9 @@ t.test('ignore ENOENTs from unlink/rmdir', async t => { t.test('rimraffing root, do not actually rmdir root', async t => { let ROOT: undefined | string = undefined const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', + '../src/rimraf-posix.js', { - path: { - ...PATH, + path: t.createMock(PATH, { parse: (path: string) => { const p = parse(path) if (path === ROOT) { @@ -187,9 +175,9 @@ t.test('rimraffing root, do not actually rmdir root', async t => { } return p }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-posix.js') + )) as typeof import('../src/rimraf-posix.js') t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafPosix(ROOT, { preserveRoot: false }) diff --git a/test/rimraf-windows.ts b/test/rimraf-windows.ts index b737930c..ef9d0938 100644 --- a/test/rimraf-windows.ts +++ b/test/rimraf-windows.ts @@ -1,9 +1,9 @@ -import { Dirent, PathLike, Stats, statSync } from 'fs' +import { Dirent, Mode, PathLike, Stats, statSync } from 'fs' import * as PATH from 'path' import { basename, parse, relative } from 'path' import t from 'tap' -import * as FS from '../dist/esm/fs.js' -import { rimrafWindows, rimrafWindowsSync } from '../dist/esm/rimraf-windows.js' +import * as FS from '../src/fs.js' +import { rimrafWindows, rimrafWindowsSync } from '../src/rimraf-windows.js' t.formatSnapshot = (calls: string[][]) => Array.isArray(calls) ? @@ -41,7 +41,18 @@ const fixture = { } t.test('actually delete some stuff', async t => { - const fsMock: Record = { ...FS, promises: { ...FS.promises } } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type MockFs = (...args: any[]) => Promise + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type MockFsSync = (...args: any[]) => any + const fsMock: { + [k in Exclude]: MockFsSync + } & { + promises: Record + } = { + ...FS, + promises: { ...(FS.promises as Record) }, + } // simulate annoying windows semantics, where an unlink or rmdir // may take an arbitrary amount of time. we only delay unlinks, @@ -54,7 +65,7 @@ t.test('actually delete some stuff', async t => { const danglers: Promise[] = [] const unlinkLater = (path: string) => { const p = new Promise(res => { - setTimeout(() => unlink(path).then(res, res), 100) + setTimeout(() => void unlink(path).then(res, res), 100) }) danglers.push(p) } @@ -67,16 +78,14 @@ t.test('actually delete some stuff', async t => { }) const { rimrafPosix, rimrafPosixSync } = (await t.mockImport( - '../dist/esm/rimraf-posix.js', - { - '../dist/esm/fs.js': fsMock, - }, - )) as typeof import('../dist/esm/rimraf-posix.js') + '../src/rimraf-posix.js', + { '../src/fs.js': fsMock }, + )) as typeof import('../src/rimraf-posix.js') const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', - { '../dist/esm/fs.js': fsMock }, - )) as typeof import('../dist/esm/rimraf-windows.js') + '../src/rimraf-windows.js', + { '../src/fs.js': fsMock }, + )) as typeof import('../src/rimraf-windows.js') t.test('posix does not work here', t => { t.test('sync', t => { @@ -118,10 +127,9 @@ t.test('throw unlink errors', async t => { let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, + '../src/fs.js': t.createMock(FS, { unlinkSync: (path: string) => { if (threwSync) { return FS.unlinkSync(path) @@ -130,7 +138,6 @@ t.test('throw unlink errors', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { - ...FS.promises, unlink: async (path: string) => { if (threwAsync) { return FS.promises.unlink(path) @@ -139,9 +146,9 @@ t.test('throw unlink errors', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' @@ -160,10 +167,9 @@ t.test('ignore ENOENT unlink errors', async t => { const threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, + '../src/fs.js': t.createMock(FS, { unlinkSync: (path: string) => { FS.unlinkSync(path) if (threwSync) { @@ -173,7 +179,6 @@ t.test('ignore ENOENT unlink errors', async t => { FS.unlinkSync(path) }, promises: { - ...FS.promises, unlink: async (path: string) => { FS.unlinkSync(path) if (threwAsync) { @@ -183,9 +188,9 @@ t.test('ignore ENOENT unlink errors', async t => { FS.unlinkSync(path) }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' @@ -202,9 +207,9 @@ t.test('ignore ENOENT unlink errors', async t => { t.test('throw rmdir errors', async t => { const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { + '../src/fs.js': { ...FS, rmdirSync: () => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) @@ -217,7 +222,7 @@ t.test('throw rmdir errors', async t => { }, }, }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' @@ -235,22 +240,27 @@ t.test('throw rmdir errors', async t => { t.test('throw unexpected readdir errors', async t => { const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, - readdirSync: () => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) - }, - promises: { - ...FS.promises, - readdir: async () => { - throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) - }, + '../src/readdir-or-error.js': (await t.mockImport( + '../src/readdir-or-error.js', + { + '../src/fs.js': t.createMock(FS, { + readdirSync: () => { + throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) + }, + promises: { + readdir: async () => { + throw Object.assign(new Error('cannot readdir'), { + code: 'FOO', + }) + }, + }, + }), }, - }, + )) as typeof import('../src/readdir-or-error.js'), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.test('sync', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' @@ -271,15 +281,23 @@ t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - //@ts-ignore - return FS.chmodSync(...args) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(FS, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + return FS.chmodSync(path, mode) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + return FS.promises.chmod(path, mode) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(FS, { unlinkSync: (path: string) => { if (threwSync) { return FS.unlinkSync(path) @@ -288,23 +306,17 @@ t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...FS.promises, - unlink: async (path: String) => { + unlink: async (path: string) => { if (threwAsync) { return FS.promises.unlink(path as PathLike) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any[]) => { - CHMODS.push(['chmod', ...args]) - //@ts-ignore - return FS.promises.chmod(...args) - }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.afterEach(() => (CHMODS.length = 0)) @@ -330,18 +342,29 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - try { - FS.unlinkSync(args[0]) - } catch (_) {} - //@ts-ignore - return FS.chmodSync(...args) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(FS, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + try { + FS.unlinkSync(path) + } catch {} + return FS.chmodSync(path, mode) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + try { + FS.unlinkSync(path) + } catch {} + return FS.promises.chmod(path, mode) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(FS, { unlinkSync: (path: string) => { if (threwSync) { return FS.unlinkSync(path) @@ -350,7 +373,6 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...FS.promises, unlink: async (path: string) => { if (threwAsync) { return FS.promises.unlink(path) @@ -358,18 +380,10 @@ t.test('handle EPERMs, chmod returns ENOENT', async t => { threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any[]) => { - CHMODS.push(['chmod', ...args]) - try { - FS.unlinkSync(args[0]) - } catch (_) {} - //@ts-ignore - return FS.promises.chmod(...args) - }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.afterEach(() => (CHMODS.length = 0)) @@ -395,17 +409,29 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - '../dist/esm/fs.js': { - ...FS, - chmodSync: (...args: any[]) => { - CHMODS.push(['chmodSync', ...args]) - try { - FS.unlinkSync(args[0]) - } catch (_) {} - throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) - }, + '../src/fix-eperm.js': (await t.mockImport('../src/fix-eperm.js', { + '../src/fs.js': t.createMock(FS, { + chmodSync: (path: string, mode: Mode) => { + CHMODS.push(['chmodSync', path, mode]) + try { + FS.unlinkSync(path) + } catch {} + throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) + }, + promises: { + chmod: async (path: string, mode: Mode) => { + CHMODS.push(['chmod', path, mode]) + try { + FS.unlinkSync(path) + } catch {} + throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) + }, + }, + }), + })) as typeof import('../src/fix-eperm.js'), + '../src/fs.js': t.createMock(FS, { unlinkSync: (path: string) => { if (threwSync) { return FS.unlinkSync(path) @@ -414,7 +440,6 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { - ...FS.promises, unlink: async (path: string) => { if (threwAsync) { return FS.promises.unlink(path) @@ -422,17 +447,10 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, - chmod: async (...args: any[]) => { - CHMODS.push(['chmod', ...args]) - try { - FS.unlinkSync(args[0]) - } catch (_) {} - throw Object.assign(new Error('cannot chmod'), { code: 'FOO' }) - }, }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.afterEach(() => (CHMODS.length = 0)) @@ -456,10 +474,9 @@ t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { t.test('rimraffing root, do not actually rmdir root', async t => { let ROOT: string | undefined = undefined const { rimrafWindows, rimrafWindowsSync } = (await t.mockImport( - '../dist/esm/rimraf-windows.js', + '../src/rimraf-windows.js', { - path: { - ...PATH, + path: t.createMock(PATH, { parse: (path: string) => { const p = parse(path) if (path === ROOT) { @@ -467,9 +484,9 @@ t.test('rimraffing root, do not actually rmdir root', async t => { } return p }, - }, + }), }, - )) as typeof import('../dist/esm/rimraf-windows.js') + )) as typeof import('../src/rimraf-windows.js') t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafWindows(ROOT, { preserveRoot: false }) diff --git a/test/use-native.ts b/test/use-native.ts index 38b0a0af..89f8a0bd 100644 --- a/test/use-native.ts +++ b/test/use-native.ts @@ -1,87 +1,27 @@ import t from 'tap' -// node before 14.14 didn't native recursive fs.rm -if (/^v([0-8]\.|1[0-3]\.|14\.[0-9]\.|14\.1[1-3]\.)/.test(process.version)) { - t.plan(0, 'no native recursive fs.rm in this node version') - process.exit(0) -} - -import { fileURLToPath } from 'url' -import { useNative, useNativeSync } from '../dist/esm/use-native.js' - -const args = [...process.execArgv, fileURLToPath(import.meta.url)] - -if (!process.env.__TESTING_RIMRAF_EXPECT_USE_NATIVE__) { - t.spawn( - process.execPath, - args, - { - env: { - ...process.env, - __TESTING_RIMRAF_PLATFORM__: 'darwin', - __TESTING_RIMRAF_NODE_VERSION__: 'v18.0.0', - __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '1', - }, - }, - 'darwin v18', - ) - - t.spawn( - process.execPath, - args, - { - env: { - ...process.env, - __TESTING_RIMRAF_PLATFORM__: 'win32', - __TESTING_RIMRAF_NODE_VERSION__: 'v18.0.0', - __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', - }, - }, - 'win32 v18', - ) - - t.spawn( - process.execPath, - args, - { - env: { - ...process.env, - __TESTING_RIMRAF_NODE_VERSION__: 'v8.9.10', - __TESTING_RIMRAF_PLATFORM__: 'darwin', - __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', - }, - }, - 'darwin v8', - ) - - t.spawn( - process.execPath, - args, - { - env: { - ...process.env, - __TESTING_RIMRAF_NODE_VERSION__: 'v14.13.12', - __TESTING_RIMRAF_PLATFORM__: 'darwin', - __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', - }, - }, - 'darwin v14.13.12', - ) -} else { - const expect = process.env.__TESTING_RIMRAF_EXPECT_USE_NATIVE__ === '1' - if (expect) { - // always need manual if a signal is passed in - const signal = - typeof AbortController !== 'undefined' ? new AbortController().signal : {} - //@ts-ignore - t.equal(useNative({ signal }), false) - //@ts-ignore - t.equal(useNativeSync({ signal }), false) - - // always need manual if a filter is provided - t.equal(useNative({ filter: () => true }), false) - t.equal(useNativeSync({ filter: () => true }), false) - } - t.equal(useNative(), expect) - t.equal(useNativeSync(), expect) +for (const [platform, version, expect] of [ + ['darwin', 'v14.14.0', true], + ['darwin', 'v14.13.9', false], + ['win32', 'v14.14.0', false], + ['win32', 'v14.13.9', false], +] as const) { + t.test(platform, async t => { + t.intercept(process, 'platform', { value: platform }) + t.intercept(process, 'version', { value: version }) + const { useNative, useNativeSync } = (await t.mockImport( + '../src/use-native.js', + )) as typeof import('../src/use-native.js') + if (expect) { + // always need manual if a signal is passed in + const { signal } = new AbortController() + t.equal(useNative({ signal }), false) + t.equal(useNativeSync({ signal }), false) + // always need manual if a filter is provided + t.equal(useNative({ filter: () => true }), false) + t.equal(useNativeSync({ filter: () => true }), false) + } + t.equal(useNative(), expect) + t.equal(useNativeSync(), expect) + }) } diff --git a/tsconfig.json b/tsconfig.json index 7f39495d..222a6005 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "module": "nodenext", "moduleResolution": "nodenext", "noUncheckedIndexedAccess": true, + "useUnknownInCatchVariables": true, "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true,