pax_global_header00006660000000000000000000000064144066470250014522gustar00rootroot0000000000000052 comment=04bcedfd7bb8d39e657d513cc6542758db6dc130 isaacs-rimraf-89ff4ac/000077500000000000000000000000001440664702500147515ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/.github/000077500000000000000000000000001440664702500163115ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/.github/FUNDING.yml000066400000000000000000000001001440664702500201150ustar00rootroot00000000000000# These are supported funding model platforms github: [isaacs] isaacs-rimraf-89ff4ac/.github/workflows/000077500000000000000000000000001440664702500203465ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/.github/workflows/benchmark.yml000066400000000000000000000014261440664702500230260ustar00rootroot00000000000000name: 'benchmarks' on: workflow_dispatch jobs: benchmark: strategy: matrix: node-version: [16.x, 19.x] platform: - os: ubuntu-latest - os: macos-latest - os: windows-latest runs-on: ${{ matrix.platform.os }} defaults: run: shell: bash steps: - name: Checkout Repository uses: actions/checkout@v3 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install dependencies 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 isaacs-rimraf-89ff4ac/.github/workflows/ci.yml000066400000000000000000000016651440664702500214740ustar00rootroot00000000000000name: CI on: [push, pull_request] jobs: build: strategy: matrix: node-version: [14.x, 16.x, 18.x, 19.x] platform: - os: ubuntu-latest shell: bash - os: macos-latest shell: bash - os: windows-latest shell: bash - os: windows-latest shell: powershell fail-fast: false runs-on: ${{ matrix.platform.os }} defaults: run: shell: ${{ matrix.platform.shell }} steps: - name: Checkout Repository uses: actions/checkout@v3 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install dependencies run: npm install - name: Run Tests run: npm test -- -t0 -c env: RIMRAF_TEST_START_CHAR: a RIMRAF_TEST_END_CHAR: f RIMRAF_TEST_DEPTH: 5 isaacs-rimraf-89ff4ac/.github/workflows/commit-if-modified.sh000066400000000000000000000004321440664702500243430ustar00rootroot00000000000000#!/usr/bin/env bash git config --global user.email "$1" shift git config --global user.name "$1" shift message="$1" shift if [ $(git status --porcelain "$@" | egrep '^ M' | wc -l) -gt 0 ]; then git add "$@" git commit -m "$message" git push || git pull --rebase git push fi isaacs-rimraf-89ff4ac/.github/workflows/copyright-year.sh000066400000000000000000000010011440664702500236400ustar00rootroot00000000000000#!/usr/bin/env bash dir=${1:-$PWD} dates=($(git log --date=format:%Y --pretty=format:'%ad' --reverse | sort | uniq)) if [ "${#dates[@]}" -eq 1 ]; then datestr="${dates}" else datestr="${dates}-${dates[${#dates[@]}-1]}" fi stripDate='s/^((.*)Copyright\b(.*?))((?:,\s*)?(([0-9]{4}\s*-\s*[0-9]{4})|(([0-9]{4},\s*)*[0-9]{4})))(?:,)?\s*(.*)\n$/$1$9\n/g' addDate='s/^.*Copyright(?:\s*\(c\))? /Copyright \(c\) '$datestr' /g' for l in $dir/LICENSE*; do perl -pi -e "$stripDate" $l perl -pi -e "$addDate" $l done isaacs-rimraf-89ff4ac/.github/workflows/isaacs-makework.yml000066400000000000000000000022531440664702500241540ustar00rootroot00000000000000name: "various tidying up tasks to silence nagging" on: push: branches: - main workflow_dispatch: permissions: contents: write # for commit-if-modified.sh to push jobs: makework: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Use Node.js uses: actions/setup-node@v2.1.4 with: node-version: 16.x - name: put repo in package.json run: node .github/workflows/package-json-repo.js - name: check in package.json if modified run: | bash -x .github/workflows/commit-if-modified.sh \ "package-json-repo-bot@example.com" \ "package.json Repo Bot" \ "chore: add repo to package.json" \ package.json package-lock.json - name: put all dates in license copyright line run: bash .github/workflows/copyright-year.sh - name: check in licenses if modified run: | bash .github/workflows/commit-if-modified.sh \ "license-year-bot@example.com" \ "License Year Bot" \ "chore: add copyright year to license" \ LICENSE* isaacs-rimraf-89ff4ac/.github/workflows/package-json-repo.js000066400000000000000000000010561440664702500242130ustar00rootroot00000000000000#!/usr/bin/env node const pf = require.resolve(`${process.cwd()}/package.json`) const pj = require(pf) if (!pj.repository && process.env.GITHUB_REPOSITORY) { const fs = require('fs') const server = process.env.GITHUB_SERVER_URL || 'https://github.com' const repo = `${server}/${process.env.GITHUB_REPOSITORY}` pj.repository = repo const json = fs.readFileSync(pf, 'utf8') const match = json.match(/^\s*\{[\r\n]+([ \t]*)"/) const indent = match[1] const output = JSON.stringify(pj, null, indent || 2) + '\n' fs.writeFileSync(pf, output) } isaacs-rimraf-89ff4ac/.github/workflows/static.yml000066400000000000000000000024131440664702500223600ustar00rootroot00000000000000# Simple workflow for deploying static content to GitHub Pages name: Deploy static content to Pages on: # Runs on pushes targeting the default branch push: branches: ["main"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: # Single deploy job since we're just deploying deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: 18.x - name: Install dependencies run: npm install - name: Generate typedocs run: npm run typedoc - name: Setup Pages uses: actions/configure-pages@v3 - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: path: './docs' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v1 isaacs-rimraf-89ff4ac/.github/workflows/typedoc.yml000066400000000000000000000024141440664702500225410ustar00rootroot00000000000000# Simple workflow for deploying static content to GitHub Pages name: Deploy static content to Pages on: # Runs on pushes targeting the default branch push: branches: ["main"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: # Single deploy job since we're just deploying deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: 18.x - name: Install dependencies run: npm install - name: Generate typedocs run: npm run typedoc - name: Setup Pages uses: actions/configure-pages@v3 - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: path: './docs' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v1 isaacs-rimraf-89ff4ac/.gitignore000066400000000000000000000001371440664702500167420ustar00rootroot00000000000000/node_modules/ /.nyc_output /coverage /dist !/typedoc.json !/tsconfig-*.json !/.prettierignore isaacs-rimraf-89ff4ac/.prettierignore000066400000000000000000000001341440664702500200120ustar00rootroot00000000000000/node_modules /example /.github /dist .env /tap-snapshots /.nyc_output /coverage /benchmark isaacs-rimraf-89ff4ac/CHANGELOG.md000066400000000000000000000053121440664702500165630ustar00rootroot00000000000000# 4.4 - Provide Dirent or Stats object as second argument to filter # 4.3 - Return boolean indicating whether the path was fully removed - Add filter option - bin: add --verbose, -v to print files as they are deleted - bin: add --no-verbose, -V to not print files as they are deleted - bin: add -i --interactive to be prompted on each deletion - bin: add -I --no-interactive to not be prompted on each deletion - **4.3.1** Fixed inappropriately following symbolic links to directories # v4.2 - Brought back `glob` support, using the new and improved glob v9 # v4.1 - Improved hybrid module with no need to look at the `.default` dangly bit. `.default` preserved as a reference to `rimraf` for compatibility with anyone who came to rely on it in v4.0. - Accept and ignore `-rf` and `-fr` arguments to the bin. # v4.0 - Remove `glob` dependency entirely. This library now only accepts actual file and folder names to delete. - Accept array of paths or single path. - Windows performance and reliability improved. - All strategies separated into explicitly exported methods. - Drop support for Node.js below version 14 - rewrite in TypeScript - ship CJS/ESM hybrid module - Error on unknown arguments to the bin. (Previously they were silently ignored.) # v3.0 - Add `--preserve-root` option to executable (default true) - Drop support for Node.js below version 6 # v2.7 - Make `glob` an optional dependency # 2.6 - Retry on EBUSY on non-windows platforms as well - Make `rimraf.sync` 10000% more reliable on Windows # 2.5 - Handle Windows EPERM when lstat-ing read-only dirs - Add glob option to pass options to glob # 2.4 - Add EPERM to delay/retry loop - Add `disableGlob` option # 2.3 - Make maxBusyTries and emfileWait configurable - Handle weird SunOS unlink-dir issue - Glob the CLI arg for better Windows support # 2.2 - Handle ENOENT properly on Windows - Allow overriding fs methods - Treat EPERM as indicative of non-empty dir - Remove optional graceful-fs dep - Consistently return null error instead of undefined on success - win32: Treat ENOTEMPTY the same as EBUSY - Add `rimraf` binary # 2.1 - Fix SunOS error code for a non-empty directory - Try rmdir before readdir - Treat EISDIR like EPERM - Remove chmod - Remove lstat polyfill, node 0.7 is not supported # 2.0 - Fix myGid call to check process.getgid - Simplify the EBUSY backoff logic. - Use fs.lstat in node >= 0.7.9 - Remove gently option - remove fiber implementation - Delete files that are marked read-only # 1.0 - Allow ENOENT in sync method - Throw when no callback is provided - Make opts.gently an absolute path - use 'stat' if 'lstat' is not available - Consistent error naming, and rethrow non-ENOENT stat errors - add fiber implementation isaacs-rimraf-89ff4ac/LICENSE000066400000000000000000000014071440664702500157600ustar00rootroot00000000000000The ISC License Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. isaacs-rimraf-89ff4ac/README.md000066400000000000000000000205641440664702500162370ustar00rootroot00000000000000The [UNIX command]() `rm -rf` for node. Install with `npm install rimraf`. ## Major Changes from v3 to v4 - The function returns a `Promise` instead of taking a callback. - Globbing requires the `--glob` option to be set. (Removed in 4.0 and 4.1, opt-in support added in 4.2.) - Functions take arrays of paths, as well as a single path. - Native implementation used by default when available, except on Windows, where this implementation is faster and more reliable. - New implementation on Windows, falling back to "move then remove" strategy when exponential backoff for `EBUSY` fails to resolve the situation. - Simplified implementation on Posix, since the Windows affordances are not necessary there. - As of 4.3, return/resolve value is boolean instead of undefined ## API Hybrid module, load either with `import` or `require()`. ```js // default export is the main rimraf function, or use named imports import rimraf from 'rimraf' // or const rimraf = require('rimraf') // other strategies exported as well import { rimraf, rimrafSync, native, nativeSync } from 'rimraf' // or const { rimraf, rimrafSync, native, nativeSync } = require('rimraf') ``` All removal functions return a boolean indicating that all entries were successfully removed. The only case in which this will not return `true` is if something was omitted from the removal via a `filter` option. ### `rimraf(f, [opts]) -> Promise` This first parameter is a path or array of paths. The second argument is an options object. Options: - `preserveRoot`: If set to boolean `false`, then allow the recursive removal of the root directory. Otherwise, this is not allowed. - `tmp`: Windows only. Temp folder to use to place files and folders for the "move then remove" fallback. Must be on the same physical device as the path being deleted. Defaults to `os.tmpdir()` when that is on the same drive letter as the path being deleted, or `${drive}:\temp` if present, or `${drive}:\` if not. - `maxRetries`: Windows and Native only. Maximum number of retry attempts in case of `EBUSY`, `EMFILE`, and `ENFILE` errors. Default `10` for Windows implementation, `0` for Native implementation. - `backoff`: Windows only. Rate of exponential backoff for async removal in case of `EBUSY`, `EMFILE`, and `ENFILE` errors. Should be a number greater than 1. Default `1.2` - `maxBackoff`: Windows only. Maximum total backoff time in ms to attempt asynchronous retries in case of `EBUSY`, `EMFILE`, and `ENFILE` errors. Default `200`. With the default `1.2` backoff rate, this results in 14 retries, with the final retry being delayed 33ms. - `retryDelay`: Native only. Time to wait between retries, using linear backoff. Default `100`. - `signal` Pass in an AbortSignal to cancel the directory removal. This is useful when removing large folder structures, if you'd like to limit the amount of time spent. Using a `signal` option prevents the use of Node's built-in `fs.rm` because that implementation does not support abort signals. - `filter` Method that returns a boolean indicating whether that path should be deleted. With async rimraf methods, this may return a Promise that resolves to a boolean. (Since Promises are truthy, returning a Promise from a sync filter is the same as just not filtering anything.) The first argument to the filter is the path string. The second argument is either a `Dirent` or `Stats` object for that path. (The first path explored will be a `Stats`, the rest will be `Dirent`.) If a filter method is provided, it will _only_ remove entries if the filter returns (or resolves to) a truthy value. Omitting a directory will still allow its children to be removed, unless they are also filtered out, but any parents of a filtered entry will not be removed, since the directory would not be empty in that case. Using a filter method prevents the use of Node's built-in `fs.rm` because that implementation does not support filtering. Any other options are provided to the native Node.js `fs.rm` implementation when that is used. This will attempt to choose the best implementation, based on Node.js version and `process.platform`. To force a specific implementation, use one of the other functions provided. ### `rimraf.sync(f, [opts])` `rimraf.rimrafSync(f, [opts])` Synchronous form of `rimraf()` Note that, unlike many file system operations, the synchronous form will typically be significantly _slower_ than the async form, because recursive deletion is extremely parallelizable. ### `rimraf.native(f, [opts])` Uses the built-in `fs.rm` implementation that Node.js provides. This is used by default on Node.js versions greater than or equal to `14.14.0`. ### `rimraf.nativeSync(f, [opts])` `rimraf.native.sync(f, [opts])` Synchronous form of `rimraf.native` ### `rimraf.manual(f, [opts])` Use the JavaScript implementation appropriate for your operating system. ### `rimraf.manualSync(f, [opts])` `rimraf.manualSync(f, opts)` Synchronous form of `rimraf.manual()` ### `rimraf.windows(f, [opts])` JavaScript implementation of file removal appropriate for Windows platforms. Works around `unlink` and `rmdir` not being atomic operations, and `EPERM` when deleting files with certain permission modes. First deletes all non-directory files within the tree, and then removes all directories, which should ideally be empty by that time. When an `ENOTEMPTY` is raised in the second pass, falls back to the `rimraf.moveRemove` strategy as needed. ### `rimraf.windows.sync(path, [opts])` `rimraf.windowsSync(path, [opts])` Synchronous form of `rimraf.windows()` ### `rimraf.moveRemove(path, [opts])` Moves all files and folders to the parent directory of `path` with a temporary filename prior to attempting to remove them. Note that, in cases where the operation fails, this _may_ leave files lying around in the parent directory with names like `.file-basename.txt.0.123412341`. Until the Windows kernel provides a way to perform atomic `unlink` and `rmdir` operations, this is unfortunately unavoidable. To move files to a different temporary directory other than the parent, provide `opts.tmp`. Note that this _must_ be on the same physical device as the folder being deleted, or else the operation will fail. This is the slowest strategy, but most reliable on Windows platforms. Used as a last-ditch fallback by `rimraf.windows()`. ### `rimraf.moveRemove.sync(path, [opts])` `rimraf.moveRemoveSync(path, [opts])` Synchronous form of `rimraf.moveRemove()` ### Command Line Interface ``` rimraf version 4.3.0 Usage: rimraf [ ...] Deletes all files and folders at "path", recursively. Options: -- Treat all subsequent arguments as paths -h --help Display this usage info --preserve-root Do not remove '/' recursively (default) --no-preserve-root Do not treat '/' specially -G --no-glob Treat arguments as literal paths, not globs (default) -g --glob Treat arguments as glob patterns -v --verbose Be verbose when deleting files, showing them as they are removed. Not compatible with --impl=native -V --no-verbose Be silent when deleting files, showing nothing as they are removed (default) -i --interactive Ask for confirmation before deleting anything Not compatible with --impl=native -I --no-interactive Do not ask for confirmation before deleting --impl= Specify the implementation to use: rimraf: choose the best option (default) native: the built-in implementation in Node.js manual: the platform-specific JS implementation posix: the Posix JS implementation windows: the Windows JS implementation (falls back to move-remove on ENOTEMPTY) move-remove: a slow reliable Windows fallback Implementation-specific options: --tmp= Temp file folder for 'move-remove' implementation --max-retries= maxRetries for 'native' and 'windows' implementations --retry-delay= retryDelay for 'native' implementation, default 100 --backoff= Exponential backoff factor for retries (default: 1.2) ``` ## mkdirp If you need to _create_ a directory recursively, check out [mkdirp](https://github.com/isaacs/node-mkdirp). isaacs-rimraf-89ff4ac/benchmark/000077500000000000000000000000001440664702500167035ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/benchmark/.gitignore000066400000000000000000000000301440664702500206640ustar00rootroot00000000000000/node_modules /fixtures isaacs-rimraf-89ff4ac/benchmark/create-fixture.js000066400000000000000000000015201440664702500221660ustar00rootroot00000000000000const { 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') 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)) await create(resolve(path, c), start, end, maxDepth, depth + 1) 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') return await create(path, start.charCodeAt(0), end.charCodeAt(0), depth) } isaacs-rimraf-89ff4ac/benchmark/index.js000066400000000000000000000010321440664702500203440ustar00rootroot00000000000000const cases = require('./rimrafs.js') const runTest = require('./run-test.js') const print = require('./print-results.js') 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) } rimraf.sync(__dirname + '/fixtures') return results } main().then(print) isaacs-rimraf-89ff4ac/benchmark/old-rimraf/000077500000000000000000000000001440664702500207375ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/benchmark/old-rimraf/CHANGELOG.md000066400000000000000000000027211440664702500225520ustar00rootroot00000000000000# v3.0 - Add `--preserve-root` option to executable (default true) - Drop support for Node.js below version 6 # v2.7 - Make `glob` an optional dependency # 2.6 - Retry on EBUSY on non-windows platforms as well - Make `rimraf.sync` 10000% more reliable on Windows # 2.5 - Handle Windows EPERM when lstat-ing read-only dirs - Add glob option to pass options to glob # 2.4 - Add EPERM to delay/retry loop - Add `disableGlob` option # 2.3 - Make maxBusyTries and emfileWait configurable - Handle weird SunOS unlink-dir issue - Glob the CLI arg for better Windows support # 2.2 - Handle ENOENT properly on Windows - Allow overriding fs methods - Treat EPERM as indicative of non-empty dir - Remove optional graceful-fs dep - Consistently return null error instead of undefined on success - win32: Treat ENOTEMPTY the same as EBUSY - Add `rimraf` binary # 2.1 - Fix SunOS error code for a non-empty directory - Try rmdir before readdir - Treat EISDIR like EPERM - Remove chmod - Remove lstat polyfill, node 0.7 is not supported # 2.0 - Fix myGid call to check process.getgid - Simplify the EBUSY backoff logic. - Use fs.lstat in node >= 0.7.9 - Remove gently option - remove fiber implementation - Delete files that are marked read-only # 1.0 - Allow ENOENT in sync method - Throw when no callback is provided - Make opts.gently an absolute path - use 'stat' if 'lstat' is not available - Consistent error naming, and rethrow non-ENOENT stat errors - add fiber implementation isaacs-rimraf-89ff4ac/benchmark/old-rimraf/LICENSE000066400000000000000000000013751440664702500217520ustar00rootroot00000000000000The ISC License Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. isaacs-rimraf-89ff4ac/benchmark/old-rimraf/README.md000066400000000000000000000070201440664702500222150ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies) The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node. Install with `npm install rimraf`, or just drop rimraf.js somewhere. ## API `rimraf(f, [opts], callback)` The first parameter will be interpreted as a globbing pattern for files. If you want to disable globbing you can do so with `opts.disableGlob` (defaults to `false`). This might be handy, for instance, if you have filenames that contain globbing wildcard characters. The callback will be called with an error if there is one. Certain errors are handled for you: * Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of `opts.maxBusyTries` times before giving up, adding 100ms of wait between each attempt. The default `maxBusyTries` is 3. * `ENOENT` - If the file doesn't exist, rimraf will return successfully, since your desired outcome is already the case. * `EMFILE` - Since `readdir` requires opening a file descriptor, it's possible to hit `EMFILE` if too many file descriptors are in use. In the sync case, there's nothing to be done for this. But in the async case, rimraf will gradually back off with timeouts up to `opts.emfileWait` ms, which defaults to 1000. ## options * unlink, chmod, stat, lstat, rmdir, readdir, unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync In order to use a custom file system library, you can override specific fs functions on the options object. If any of these functions are present on the options object, then the supplied function will be used instead of the default fs method. Sync methods are only relevant for `rimraf.sync()`, of course. For example: ```javascript var myCustomFS = require('some-custom-fs') rimraf('some-thing', myCustomFS, callback) ``` * maxBusyTries If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered on Windows systems, then rimraf will retry with a linear backoff wait of 100ms longer on each try. The default maxBusyTries is 3. Only relevant for async usage. * emfileWait If an `EMFILE` error is encountered, then rimraf will retry repeatedly with a linear backoff of 1ms longer on each try, until the timeout counter hits this max. The default limit is 1000. If you repeatedly encounter `EMFILE` errors, then consider using [graceful-fs](http://npm.im/graceful-fs) in your program. Only relevant for async usage. * glob Set to `false` to disable [glob](http://npm.im/glob) pattern matching. Set to an object to pass options to the glob module. The default glob options are `{ nosort: true, silent: true }`. Glob version 6 is used in this module. Relevant for both sync and async usage. * disableGlob Set to any non-falsey value to disable globbing entirely. (Equivalent to setting `glob: false`.) ## rimraf.sync It can remove stuff synchronously, too. But that's not so good. Use the async API. It's better. ## CLI If installed with `npm install rimraf -g` it can be used as a global command `rimraf [ ...]` which is useful for cross platform support. ## mkdirp If you need to create a directory recursively, check out [mkdirp](https://github.com/substack/node-mkdirp). isaacs-rimraf-89ff4ac/benchmark/old-rimraf/bin.js000077500000000000000000000035261440664702500220560ustar00rootroot00000000000000#!/usr/bin/env node const rimraf = require('./') const path = require('path') const isRoot = arg => /^(\/|[a-zA-Z]:\\)$/.test(path.resolve(arg)) const filterOutRoot = arg => { const ok = preserveRoot === false || !isRoot(arg) if (!ok) { console.error(`refusing to remove ${arg}`) console.error('Set --no-preserve-root to allow this') } return ok } let help = false let dashdash = false let noglob = false let preserveRoot = true const args = process.argv.slice(2).filter(arg => { if (dashdash) return !!arg else if (arg === '--') dashdash = true else if (arg === '--no-glob' || arg === '-G') noglob = true else if (arg === '--glob' || arg === '-g') noglob = false else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) help = true else if (arg === '--preserve-root') preserveRoot = true else if (arg === '--no-preserve-root') preserveRoot = false else return !!arg }).filter(arg => !preserveRoot || filterOutRoot(arg)) const go = n => { if (n >= args.length) return const options = noglob ? { glob: false } : {} rimraf(args[n], options, er => { if (er) throw er go(n+1) }) } if (help || args.length === 0) { // If they didn't ask for help, then this is not a "success" const log = help ? console.log : console.error log('Usage: rimraf [ ...]') log('') log(' Deletes all files and folders at "path" recursively.') log('') log('Options:') log('') log(' -h, --help Display this usage info') log(' -G, --no-glob Do not expand glob patterns in arguments') log(' -g, --glob Expand glob patterns in arguments (default)') log(' --preserve-root Do not remove \'/\' (default)') log(' --no-preserve-root Do not treat \'/\' specially') log(' -- Stop parsing flags') process.exit(help ? 0 : 1) } else go(0) isaacs-rimraf-89ff4ac/benchmark/old-rimraf/package.json000066400000000000000000000013311440664702500232230ustar00rootroot00000000000000{ "name": "rimraf", "version": "3.0.2", "main": "rimraf.js", "description": "A deep deletion module for node (like `rm -rf`)", "author": "Isaac Z. Schlueter (http://blog.izs.me/)", "license": "ISC", "repository": "git://github.com/isaacs/rimraf.git", "scripts": { "preversion": "npm test", "postversion": "npm publish", "postpublish": "git push origin --follow-tags", "test": "tap test/*.js" }, "bin": "./bin.js", "dependencies": { "glob": "^7.1.3" }, "files": [ "LICENSE", "README.md", "bin.js", "rimraf.js" ], "devDependencies": { "mkdirp": "^0.5.1", "tap": "^12.1.1" }, "funding": { "url": "https://github.com/sponsors/isaacs" } } isaacs-rimraf-89ff4ac/benchmark/old-rimraf/rimraf.js000066400000000000000000000212421440664702500225560ustar00rootroot00000000000000const assert = require("assert") const path = require("path") const fs = require("fs") let glob = undefined try { glob = require("glob") } catch (_err) { // treat glob as optional. } const defaultGlobOpts = { nosort: true, silent: true } // for EMFILE handling let timeout = 0 const isWindows = (process.platform === "win32") const defaults = options => { const methods = [ 'unlink', 'chmod', 'stat', 'lstat', 'rmdir', 'readdir' ] methods.forEach(m => { options[m] = options[m] || fs[m] m = m + 'Sync' options[m] = options[m] || fs[m] }) options.maxBusyTries = options.maxBusyTries || 3 options.emfileWait = options.emfileWait || 1000 if (options.glob === false) { options.disableGlob = true } if (options.disableGlob !== true && glob === undefined) { throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') } options.disableGlob = options.disableGlob || false options.glob = options.glob || defaultGlobOpts } const rimraf = (p, options, cb) => { if (typeof options === 'function') { cb = options options = {} } assert(p, 'rimraf: missing path') assert.equal(typeof p, 'string', 'rimraf: path should be a string') assert.equal(typeof cb, 'function', 'rimraf: callback function required') assert(options, 'rimraf: invalid options argument provided') assert.equal(typeof options, 'object', 'rimraf: options should be object') defaults(options) let busyTries = 0 let errState = null let n = 0 const next = (er) => { errState = errState || er if (--n === 0) cb(errState) } const afterGlob = (er, results) => { if (er) return cb(er) n = results.length if (n === 0) return cb() results.forEach(p => { const CB = (er) => { if (er) { if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && busyTries < options.maxBusyTries) { busyTries ++ // try again, with the same exact callback as this one. return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) } // this one won't happen if graceful-fs is used. if (er.code === "EMFILE" && timeout < options.emfileWait) { return setTimeout(() => rimraf_(p, options, CB), timeout ++) } // already gone if (er.code === "ENOENT") er = null } timeout = 0 next(er) } rimraf_(p, options, CB) }) } if (options.disableGlob || !glob.hasMagic(p)) return afterGlob(null, [p]) options.lstat(p, (er, stat) => { if (!er) return afterGlob(null, [p]) glob(p, options.glob, afterGlob) }) } // Two possible strategies. // 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR // 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR // // Both result in an extra syscall when you guess wrong. However, there // are likely far more normal files in the world than directories. This // is based on the assumption that a the average number of files per // directory is >= 1. // // If anyone ever complains about this, then I guess the strategy could // be made configurable somehow. But until then, YAGNI. const rimraf_ = (p, options, cb) => { assert(p) assert(options) assert(typeof cb === 'function') // sunos lets the root user unlink directories, which is... weird. // so we have to lstat here and make sure it's not a dir. options.lstat(p, (er, st) => { if (er && er.code === "ENOENT") return cb(null) // Windows can EPERM on stat. Life is suffering. if (er && er.code === "EPERM" && isWindows) fixWinEPERM(p, options, er, cb) if (st && st.isDirectory()) return rmdir(p, options, er, cb) options.unlink(p, er => { if (er) { if (er.code === "ENOENT") return cb(null) if (er.code === "EPERM") return (isWindows) ? fixWinEPERM(p, options, er, cb) : rmdir(p, options, er, cb) if (er.code === "EISDIR") return rmdir(p, options, er, cb) } return cb(er) }) }) } const fixWinEPERM = (p, options, er, cb) => { assert(p) assert(options) assert(typeof cb === 'function') options.chmod(p, 0o666, er2 => { if (er2) cb(er2.code === "ENOENT" ? null : er) else options.stat(p, (er3, stats) => { if (er3) cb(er3.code === "ENOENT" ? null : er) else if (stats.isDirectory()) rmdir(p, options, er, cb) else options.unlink(p, cb) }) }) } const fixWinEPERMSync = (p, options, er) => { assert(p) assert(options) try { options.chmodSync(p, 0o666) } catch (er2) { if (er2.code === "ENOENT") return else throw er } let stats try { stats = options.statSync(p) } catch (er3) { if (er3.code === "ENOENT") return else throw er } if (stats.isDirectory()) rmdirSync(p, options, er) else options.unlinkSync(p) } const rmdir = (p, options, originalEr, cb) => { assert(p) assert(options) assert(typeof cb === 'function') // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) // if we guessed wrong, and it's not a directory, then // raise the original error. options.rmdir(p, er => { if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) rmkids(p, options, cb) else if (er && er.code === "ENOTDIR") cb(originalEr) else cb(er) }) } const rmkids = (p, options, cb) => { assert(p) assert(options) assert(typeof cb === 'function') options.readdir(p, (er, files) => { if (er) return cb(er) let n = files.length if (n === 0) return options.rmdir(p, cb) let errState files.forEach(f => { rimraf(path.join(p, f), options, er => { if (errState) return if (er) return cb(errState = er) if (--n === 0) options.rmdir(p, cb) }) }) }) } // this looks simpler, and is strictly *faster*, but will // tie up the JavaScript thread and fail on excessively // deep directory trees. const rimrafSync = (p, options) => { options = options || {} defaults(options) assert(p, 'rimraf: missing path') assert.equal(typeof p, 'string', 'rimraf: path should be a string') assert(options, 'rimraf: missing options') assert.equal(typeof options, 'object', 'rimraf: options should be object') let results if (options.disableGlob || !glob.hasMagic(p)) { results = [p] } else { try { options.lstatSync(p) results = [p] } catch (er) { results = glob.sync(p, options.glob) } } if (!results.length) return for (let i = 0; i < results.length; i++) { const p = results[i] let st try { st = options.lstatSync(p) } catch (er) { if (er.code === "ENOENT") return // Windows can EPERM on stat. Life is suffering. if (er.code === "EPERM" && isWindows) fixWinEPERMSync(p, options, er) } try { // sunos lets the root user unlink directories, which is... weird. if (st && st.isDirectory()) rmdirSync(p, options, null) else options.unlinkSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "EPERM") return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) if (er.code !== "EISDIR") throw er rmdirSync(p, options, er) } } } const rmdirSync = (p, options, originalEr) => { assert(p) assert(options) try { options.rmdirSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "ENOTDIR") throw originalEr if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") rmkidsSync(p, options) } } const rmkidsSync = (p, options) => { assert(p) assert(options) options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) // We only end up here once we got ENOTEMPTY at least once, and // at this point, we are guaranteed to have removed all the kids. // So, we know that it won't be ENOENT or ENOTDIR or anything else. // try really hard to delete stuff on windows, because it has a // PROFOUNDLY annoying habit of not closing handles promptly when // files are deleted, resulting in spurious ENOTEMPTY errors. const retries = isWindows ? 100 : 1 let i = 0 do { let threw = true try { const ret = options.rmdirSync(p, options) threw = false return ret } finally { if (++i < retries && threw) continue } } while (true) } module.exports = rimraf rimraf.sync = rimrafSync isaacs-rimraf-89ff4ac/benchmark/print-results.js000066400000000000000000000032741440664702500221020ustar00rootroot00000000000000const 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 isaacs-rimraf-89ff4ac/benchmark/rimrafs.js000066400000000000000000000022541440664702500207070ustar00rootroot00000000000000// just disable the glob option, and promisify it, for apples-to-apples comp const oldRimraf = () => { const {promisify} = require('util') const oldRimraf = require('./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') 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() }) }) rimraf.sync = path => { const result = spawnSync('rm', ['-rf', path]) if (result.status || result.signal) { throw Object.assign(new Error('command failed'), { code: result.status, signal: result.signal, }) } } return rimraf } module.exports = { native: require('../').native, posix: require('../').posix, windows: require('../').windows, old: oldRimraf(), system: systemRmRf(), } isaacs-rimraf-89ff4ac/benchmark/run-test.js000066400000000000000000000056221440664702500210270ustar00rootroot00000000000000const 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 const cases = require('./rimrafs.js') const create = require('./create-fixture.js') const hrToMS = hr => Math.round(hr[0]*1e9 + hr[1]) / 1e6 const runTest = async (type) => { const rimraf = cases[type] if (!rimraf) throw new Error('unknown rimraf type: ' + type) const opt = { start: START, end: END, depth: DEPTH, } console.error(`\nrunning test for ${type}, iterations=${N} %j...`, opt) // first, create all fixtures const syncPaths = [] const asyncPaths = [] const paraPaths = [] process.stderr.write('creating fixtures...') for (let i = 0; i < N; 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 }), ]) syncPaths.push(syncPath) asyncPaths.push(asyncPath) paraPaths.push(paraPath) process.stderr.write('.') } console.error('done!') 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) } process.stderr.write('.') } 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('.')) } 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('.'))) } await Promise.all(paraRuns) const paraTotal = hrToMS(process.hrtime(startPara)) console.error('done! (%j ms, %j failed)', paraTotal, paraFails.length) // wait a tick to let stderr to clear return Promise.resolve().then(() => ({ syncTimes, syncFails, asyncTimes, asyncFails, paraTimes, paraFails, })) } module.exports = runTest isaacs-rimraf-89ff4ac/fixup.sh000066400000000000000000000004621440664702500164420ustar00rootroot00000000000000#!/usr/bin/env bash cat >dist/cjs/package.json <dist/mjs/package.json < rimraf.sync(path), rmdirRecursive(path, cb) { rimraf(path, {}).then(() => cb(), cb) }, } isaacs-rimraf-89ff4ac/map.js000066400000000000000000000000661440664702500160660ustar00rootroot00000000000000module.exports = test => test.replace(/^test/, 'lib') isaacs-rimraf-89ff4ac/package-lock.json000066400000000000000000005500201440664702500201670ustar00rootroot00000000000000{ "name": "rimraf", "version": "4.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rimraf", "version": "4.4.1", "license": "ISC", "dependencies": { "glob": "^9.2.0" }, "bin": { "rimraf": "dist/cjs/src/bin.js" }, "devDependencies": { "@types/node": "^18.11.9", "@types/tap": "^15.0.7", "c8": "^7.12.0", "eslint-config-prettier": "^8.6.0", "mkdirp": "1", "prettier": "^2.8.2", "tap": "^16.3.4", "ts-node": "^10.9.1", "typedoc": "^0.23.21", "typescript": "^4.9.3" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.21.0", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.21.0", "@babel/helpers": "^7.21.0", "@babel/parser": "^7.21.0", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.0", "@babel/types": "^7.21.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { "version": "7.21.1", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "dev": true, "dependencies": { "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.2", "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.0", "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/parser": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.21.1", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.21.2", "@babel/types": "^7.21.2", "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/types": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@eslint/eslintrc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", "dev": true, "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { "version": "8.35.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", "dev": true, "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.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, "peer": true, "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true, "peer": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "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, "peer": true, "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, "peer": true, "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, "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/node": { "version": "18.14.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.5.tgz", "integrity": "sha512-CRT4tMK/DHYhw1fcCEBwME9CSaZNclxfzVMe7GsO6ULSwsttbj70wSiX6rZdIjGblu93sTJxLdhNIT85KKI7Qw==", "dev": true }, "node_modules/@types/tap": { "version": "15.0.8", "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.8.tgz", "integrity": "sha512-ZfeoiZlLIaFi4t6wccwbTEicrHREkP0bOq8dZVi/nWvG5F8O7LlS2cSUZBiOW/D4cgWS/p2uhM3lJoyzFAl80w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "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, "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" }, "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, "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-sequence-parser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", "dev": true }, "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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "dependencies": { "default-require-extensions": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "peer": true }, "node_modules/async-hook-domain": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/bind-obj-methods": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", "dev": true, "engines": { "node": ">=10" } }, "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, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/c8": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^2.0.0", "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.0", "istanbul-reports": "^3.1.4", "rimraf": "^3.0.2", "test-exclude": "^6.0.0", "v8-to-istanbul": "^9.0.0", "yargs": "^16.2.0", "yargs-parser": "^20.2.9" }, "bin": { "c8": "bin/c8.js" }, "engines": { "node": ">=10.12.0" } }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" }, "engines": { "node": ">=8" } }, "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, "peer": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001460", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz", "integrity": "sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } ] }, "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, "peer": true, "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/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "bin": { "color-support": "bin.js" } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "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 }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "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, "peer": true }, "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "dependencies": { "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "peer": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/electron-to-chromium": { "version": "1.4.319", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.319.tgz", "integrity": "sha512-WeoI6NwZUgteKB+Wmn692S35QycwwNxwgTomNnoCJ79znBAjtBi6C/cIW62JkXmpJRX5rKNYSLDBdAM8l5fH0w==", "dev": true }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" } }, "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, "peer": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.35.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", "dev": true, "peer": true, "dependencies": { "@eslint/eslintrc": "^2.0.0", "@eslint/js": "8.35.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", "espree": "^9.4.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "peer": true, "dependencies": { "eslint-visitor-keys": "^2.0.0" }, "engines": { "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "peer": true, "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "peer": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "peer": true, "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, "peer": true, "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, "peer": true, "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, "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", "dev": true }, "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, "peer": true }, "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, "peer": true }, "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, "peer": true }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "peer": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/findit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", "dev": true }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "peer": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true, "peer": true }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", "dev": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "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, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { "node": ">=8.0.0" } }, "node_modules/glob": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz", "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==", "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^7.4.1", "minipass": "^4.2.4", "path-scurry": "^1.6.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "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, "peer": true, "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "peer": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true, "peer": true }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "peer": true, "engines": { "node": ">= 4" } }, "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, "peer": true, "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", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "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, "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "peer": true, "engines": { "node": ">=8" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "dependencies": { "append-transform": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^8.3.2" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jackspeak": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", "dev": true, "dependencies": { "cliui": "^7.0.4" }, "engines": { "node": ">=8" } }, "node_modules/js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", "dev": true, "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" } }, "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 }, "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, "peer": true, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "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, "peer": true }, "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, "peer": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "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, "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/libtap": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz", "integrity": "sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg==", "dev": true, "dependencies": { "async-hook-domain": "^2.0.4", "bind-obj-methods": "^3.0.0", "diff": "^4.0.2", "function-loop": "^2.0.1", "minipass": "^3.1.5", "own-or": "^1.0.0", "own-or-env": "^1.0.2", "signal-exit": "^3.0.4", "stack-utils": "^2.0.4", "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "tcompare": "^5.0.6", "trivial-deferred": "^1.0.1" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/libtap/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/libtap/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, "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, "peer": true }, "node_modules/lru-cache": { "version": "7.18.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", "engines": { "node": ">=12" } }, "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "node_modules/marked": { "version": "4.2.12", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { "node": ">= 12" } }, "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, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minipass": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", "engines": { "node": ">=8" } }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "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, "peer": true }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "dependencies": { "process-on-spawn": "^1.0.0" }, "engines": { "node": ">=8" } }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", "convert-source-map": "^1.7.0", "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" }, "bin": { "nyc": "bin/nyc.js" }, "engines": { "node": ">=8.9" } }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "engines": { "node": ">=6" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "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, "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "peer": true, "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.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", "dev": true }, "node_modules/own-or-env": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", "dev": true, "dependencies": { "own-or": "^1.0.0" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" }, "engines": { "node": ">=8" } }, "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, "peer": true, "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-scurry": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", "dependencies": { "lru-cache": "^7.14.1", "minipass": "^4.0.2" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "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, "peer": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "dependencies": { "fromentries": "^1.2.0" }, "engines": { "node": ">=8" } }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "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" } ], "peer": true }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "peer": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "dependencies": { "es6-error": "^4.0.1" }, "engines": { "node": ">=4" } }, "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, "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "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, "peer": true, "engines": { "node": ">=4" } }, "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, "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/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" } ], "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/shiki": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", "vscode-oniguruma": "^1.7.0", "vscode-textmate": "^8.0.0" } }, "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 }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" }, "engines": { "node": ">=8" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { "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, "peer": true, "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", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap": { "version": "16.3.4", "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.4.tgz", "integrity": "sha512-SAexdt2ZF4XBgye6TPucFI2y7VE0qeFXlXucJIV1XDPCs+iJodk0MYacr1zR6Ycltzz7PYg8zrblDXKbAZM2LQ==", "bundleDependencies": [ "ink", "treport", "@types/react", "@isaacs/import-jsx", "react" ], "dev": true, "dependencies": { "@isaacs/import-jsx": "^4.0.1", "@types/react": "^17.0.52", "chokidar": "^3.3.0", "findit": "^2.0.0", "foreground-child": "^2.0.0", "fs-exists-cached": "^1.0.0", "glob": "^7.2.3", "ink": "^3.2.0", "isexe": "^2.0.0", "istanbul-lib-processinfo": "^2.0.3", "jackspeak": "^1.4.2", "libtap": "^1.4.0", "minipass": "^3.3.4", "mkdirp": "^1.0.4", "nyc": "^15.1.0", "opener": "^1.5.1", "react": "^17.0.2", "rimraf": "^3.0.0", "signal-exit": "^3.0.6", "source-map-support": "^0.5.16", "tap-mocha-reporter": "^5.0.3", "tap-parser": "^11.0.2", "tap-yaml": "^1.0.2", "tcompare": "^5.0.7", "treport": "^3.0.4", "which": "^2.0.2" }, "bin": { "tap": "bin/run.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "coveralls": "^3.1.1", "flow-remove-types": ">=2.112.0", "ts-node": ">=8.5.2", "typescript": ">=3.7.2" }, "peerDependenciesMeta": { "coveralls": { "optional": true }, "flow-remove-types": { "optional": true }, "ts-node": { "optional": true }, "typescript": { "optional": true } } }, "node_modules/tap-mocha-reporter": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", "dev": true, "dependencies": { "color-support": "^1.1.0", "debug": "^4.1.1", "diff": "^4.0.1", "escape-string-regexp": "^2.0.0", "glob": "^7.0.5", "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" }, "bin": { "tap-mocha-reporter": "index.js" }, "engines": { "node": ">= 8" } }, "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/tap-mocha-reporter/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap-parser": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", "dev": true, "dependencies": { "events-to-array": "^1.0.1", "minipass": "^3.1.6", "tap-yaml": "^1.0.0" }, "bin": { "tap-parser": "bin/cmd.js" }, "engines": { "node": ">= 8" } }, "node_modules/tap-parser/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap-parser/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/tap-yaml": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", "dev": true, "dependencies": { "yaml": "^1.10.2" } }, "node_modules/tap/node_modules/@ampproject/remapping": { "version": "2.1.2", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, "engines": { "node": ">=6.0.0" } }, "node_modules/tap/node_modules/@babel/code-frame": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/highlight": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/compat-data": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/core": { "version": "7.17.8", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.8", "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/tap/node_modules/@babel/generator": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-compilation-targets": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/tap/node_modules/@babel/helper-environment-visitor": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-function-name": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-get-function-arity": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-hoist-variables": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-module-imports": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-module-transforms": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-plugin-utils": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-simple-access": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-validator-identifier": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-validator-option": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helpers": { "version": "7.17.8", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/highlight": { "version": "7.16.10", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/parser": { "version": "7.17.8", "dev": true, "inBundle": true, "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.17.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.16.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { "version": "7.17.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { "version": "7.17.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-jsx": "^7.16.7", "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/tap/node_modules/@babel/template": { "version": "7.16.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/traverse": { "version": "7.17.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.17.3", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/types": { "version": "7.17.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@isaacs/import-jsx": { "version": "4.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@babel/core": "^7.5.5", "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-transform-destructuring": "^7.5.0", "@babel/plugin-transform-react-jsx": "^7.3.0", "caller-path": "^3.0.1", "find-cache-dir": "^3.2.0", "make-dir": "^3.0.2", "resolve-from": "^3.0.0", "rimraf": "^3.0.0" }, "engines": { "node": ">=10" } }, "node_modules/tap/node_modules/@jridgewell/resolve-uri": { "version": "3.0.5", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/@jridgewell/trace-mapping": { "version": "0.3.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/tap/node_modules/@types/prop-types": { "version": "15.7.4", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/@types/react": { "version": "17.0.52", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/tap/node_modules/@types/scheduler": { "version": "0.16.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/@types/yoga-layout": { "version": "1.9.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", "dev": true, "inBundle": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/ansi-regex": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/ansi-styles": { "version": "3.2.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/ansicolors": { "version": "0.3.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/astral-regex": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/auto-bind": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/tap/node_modules/browserslist": { "version": "4.20.2", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "inBundle": true, "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001317", "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/tap/node_modules/caller-callsite": { "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "callsites": "^3.1.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/caller-path": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "caller-callsite": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/callsites": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/caniuse-lite": { "version": "1.0.30001319", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } ], "inBundle": true, "license": "CC-BY-4.0" }, "node_modules/tap/node_modules/cardinal": { "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" }, "bin": { "cdl": "bin/cdl.js" } }, "node_modules/tap/node_modules/chalk": { "version": "2.4.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/ci-info": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/cli-boxes": { "version": "2.2.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/cli-cursor": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/cli-truncate": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/code-excerpt": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "convert-to-spaces": "^1.0.1" }, "engines": { "node": ">=10" } }, "node_modules/tap/node_modules/color-convert": { "version": "1.9.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/tap/node_modules/color-name": { "version": "1.1.3", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/commondir": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/concat-map": { "version": "0.0.1", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/convert-source-map": { "version": "1.8.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.1" } }, "node_modules/tap/node_modules/convert-to-spaces": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/tap/node_modules/csstype": { "version": "3.0.11", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/debug": { "version": "4.3.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/tap/node_modules/electron-to-chromium": { "version": "1.4.89", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/escalade": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/escape-string-regexp": { "version": "1.0.5", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/tap/node_modules/esprima": { "version": "4.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/events-to-array": { "version": "1.1.2", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/find-cache-dir": { "version": "3.3.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/tap/node_modules/find-up": { "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/fs.realpath": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/glob": { "version": "7.2.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap/node_modules/globals": { "version": "11.12.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/has-flag": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/indent-string": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/inflight": { "version": "1.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/tap/node_modules/inherits": { "version": "2.0.4", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/ink": { "version": "3.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "auto-bind": "4.0.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.0", "cli-cursor": "^3.1.0", "cli-truncate": "^2.1.0", "code-excerpt": "^3.0.0", "indent-string": "^4.0.0", "is-ci": "^2.0.0", "lodash": "^4.17.20", "patch-console": "^1.0.0", "react-devtools-core": "^4.19.1", "react-reconciler": "^0.26.2", "scheduler": "^0.20.2", "signal-exit": "^3.0.2", "slice-ansi": "^3.0.0", "stack-utils": "^2.0.2", "string-width": "^4.2.2", "type-fest": "^0.12.0", "widest-line": "^3.1.0", "wrap-ansi": "^6.2.0", "ws": "^7.5.5", "yoga-layout-prebuilt": "^1.9.6" }, "engines": { "node": ">=10" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true } } }, "node_modules/tap/node_modules/ink/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/tap/node_modules/ink/node_modules/chalk": { "version": "4.1.2", "dev": true, "inBundle": 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/tap/node_modules/ink/node_modules/color-convert": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/tap/node_modules/ink/node_modules/color-name": { "version": "1.1.4", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/ink/node_modules/has-flag": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/ink/node_modules/supports-color": { "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/is-ci": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "node_modules/tap/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/js-tokens": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/jsesc": { "version": "2.5.2", "dev": true, "inBundle": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/json5": { "version": "2.2.3", "dev": true, "inBundle": true, "license": "MIT", "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/locate-path": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/lodash": { "version": "4.17.21", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/loose-envify": { "version": "1.4.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/tap/node_modules/make-dir": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/mimic-fn": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/minimatch": { "version": "3.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/tap/node_modules/minipass": { "version": "3.3.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/ms": { "version": "2.1.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/node-releases": { "version": "2.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/object-assign": { "version": "4.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/once": { "version": "1.4.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/tap/node_modules/onetime": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/p-limit": { "version": "2.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/p-locate": { "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/p-try": { "version": "2.2.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/patch-console": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/tap/node_modules/path-exists": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/path-is-absolute": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/picocolors": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/pkg-dir": { "version": "4.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/punycode": { "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tap/node_modules/react": { "version": "17.0.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/react-devtools-core": { "version": "4.24.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "node_modules/tap/node_modules/react-reconciler": { "version": "0.26.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "scheduler": "^0.20.2" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { "react": "^17.0.2" } }, "node_modules/tap/node_modules/redeyed": { "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "esprima": "~4.0.0" } }, "node_modules/tap/node_modules/resolve-from": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/restore-cursor": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/rimraf": { "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/scheduler": { "version": "0.20.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "node_modules/tap/node_modules/semver": { "version": "6.3.0", "dev": true, "inBundle": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/tap/node_modules/shell-quote": { "version": "1.7.3", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/signal-exit": { "version": "3.0.7", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/slice-ansi": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/source-map": { "version": "0.5.7", "dev": true, "inBundle": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/stack-utils": { "version": "2.0.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/tap/node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/string-width": { "version": "4.2.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/strip-ansi": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/supports-color": { "version": "5.5.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/tap-parser": { "version": "11.0.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "events-to-array": "^1.0.1", "minipass": "^3.1.6", "tap-yaml": "^1.0.0" }, "bin": { "tap-parser": "bin/cmd.js" }, "engines": { "node": ">= 8" } }, "node_modules/tap/node_modules/tap-yaml": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yaml": "^1.10.2" } }, "node_modules/tap/node_modules/to-fast-properties": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tap/node_modules/treport": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/import-jsx": "^4.0.1", "cardinal": "^2.1.1", "chalk": "^3.0.0", "ink": "^3.2.0", "ms": "^2.1.2", "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" }, "peerDependencies": { "react": "^17.0.2" } }, "node_modules/tap/node_modules/treport/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/tap/node_modules/treport/node_modules/chalk": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/treport/node_modules/color-convert": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/tap/node_modules/treport/node_modules/color-name": { "version": "1.1.4", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/treport/node_modules/has-flag": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/treport/node_modules/supports-color": { "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/type-fest": { "version": "0.12.0", "dev": true, "inBundle": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tap/node_modules/unicode-length": { "version": "2.0.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "punycode": "^2.0.0", "strip-ansi": "^3.0.1" } }, "node_modules/tap/node_modules/unicode-length/node_modules/ansi-regex": { "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/unicode-length/node_modules/strip-ansi": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/tap/node_modules/widest-line": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/wrap-ansi": { "version": "6.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/wrappy": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/ws": { "version": "7.5.7", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/tap/node_modules/yallist": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/tap/node_modules/yaml": { "version": "1.10.2", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/tap/node_modules/yoga-layout-prebuilt": { "version": "1.10.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@types/yoga-layout": "1.9.2" }, "engines": { "node": ">=8" } }, "node_modules/tcompare": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", "dev": true, "dependencies": { "diff": "^4.0.2" }, "engines": { "node": ">=10" } }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/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, "peer": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", "integrity": "sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==", "dev": true }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "@swc/wasm": { "optional": true } } }, "node_modules/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, "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "peer": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typedoc": { "version": "0.23.26", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.26.tgz", "integrity": "sha512-5m4KwR5tOLnk0OtMaRn9IdbeRM32uPemN9kur7YK9wFqx8U0CYrvO9aVq6ysdZSV1c824BTm+BuQl2Ze/k1HtA==", "dev": true, "dependencies": { "lunr": "^2.3.9", "marked": "^4.2.12", "minimatch": "^7.1.3", "shiki": "^0.14.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { "node": ">= 14.14" }, "peerDependencies": { "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/unicode-length": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", "dev": true, "dependencies": { "punycode": "^2.0.0" } }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "browserslist-lint": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "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, "peer": true, "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, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/vscode-oniguruma": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", "dev": true }, "node_modules/vscode-textmate": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", "dev": true }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" }, "engines": { "node": ">=10" } }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } } } } isaacs-rimraf-89ff4ac/package.json000066400000000000000000000041051440664702500172370ustar00rootroot00000000000000{ "name": "rimraf", "version": "4.4.1", "main": "./dist/cjs/src/index-cjs.js", "module": "./dist/mjs/index.js", "types": "./dist/mjs/index.d.ts", "bin": "./dist/cjs/src/bin.js", "exports": { ".": { "import": { "types": "./dist/mjs/index.d.ts", "default": "./dist/mjs/index.js" }, "require": { "types": "./dist/cjs/src/index.d.ts", "default": "./dist/cjs/src/index-cjs.js" } } }, "files": [ "dist" ], "description": "A deep deletion module for node (like `rm -rf`)", "author": "Isaac Z. Schlueter (http://blog.izs.me/)", "license": "ISC", "repository": "git://github.com/isaacs/rimraf.git", "scripts": { "preversion": "npm test", "postversion": "npm publish", "prepublishOnly": "git push origin --follow-tags", "preprepare": "rm -rf dist", "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", "postprepare": "bash fixup.sh", "pretest": "npm run prepare", "presnap": "npm run prepare", "test": "c8 tap", "snap": "c8 tap", "format": "prettier --write . --loglevel warn", "benchmark": "node benchmark/index.js", "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" }, "prettier": { "semi": false, "printWidth": 80, "tabWidth": 2, "useTabs": false, "singleQuote": true, "jsxSingleQuote": false, "bracketSameLine": true, "arrowParens": "avoid", "endOfLine": "lf" }, "devDependencies": { "@types/node": "^18.11.9", "@types/tap": "^15.0.7", "c8": "^7.12.0", "eslint-config-prettier": "^8.6.0", "mkdirp": "1", "prettier": "^2.8.2", "tap": "^16.3.4", "ts-node": "^10.9.1", "typedoc": "^0.23.21", "typescript": "^4.9.3" }, "tap": { "coverage": false, "libtap-settings": "libtap-settings.js", "node-arg": [ "--no-warnings", "--loader", "ts-node/esm" ], "ts": false }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "engines": { "node": ">=14" }, "dependencies": { "glob": "^9.2.0" } } isaacs-rimraf-89ff4ac/src/000077500000000000000000000000001440664702500155405ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/src/bin.ts000077500000000000000000000174701440664702500166740ustar00rootroot00000000000000#!/usr/bin/env node import { version } from '../package.json' import rimraf from './index-cjs.js' import type { RimrafAsyncOptions } from './index.js' const runHelpForUsage = () => console.error('run `rimraf --help` for usage information') export const help = `rimraf version ${version} Usage: rimraf [ ...] Deletes all files and folders at "path", recursively. Options: -- Treat all subsequent arguments as paths -h --help Display this usage info --preserve-root Do not remove '/' recursively (default) --no-preserve-root Do not treat '/' specially -G --no-glob Treat arguments as literal paths, not globs (default) -g --glob Treat arguments as glob patterns -v --verbose Be verbose when deleting files, showing them as they are removed. Not compatible with --impl=native -V --no-verbose Be silent when deleting files, showing nothing as they are removed (default) -i --interactive Ask for confirmation before deleting anything Not compatible with --impl=native -I --no-interactive Do not ask for confirmation before deleting --impl= Specify the implementation to use: rimraf: choose the best option (default) native: the built-in implementation in Node.js manual: the platform-specific JS implementation posix: the Posix JS implementation windows: the Windows JS implementation (falls back to move-remove on ENOTEMPTY) move-remove: a slow reliable Windows fallback Implementation-specific options: --tmp= Temp file folder for 'move-remove' implementation --max-retries= maxRetries for 'native' and 'windows' implementations --retry-delay= retryDelay for 'native' implementation, default 100 --backoff= Exponential backoff factor for retries (default: 1.2) ` import { parse, relative, resolve } from 'path' const cwd = process.cwd() import { createInterface, Interface } from 'readline' import { Dirent, Stats } from 'fs' const prompt = async (rl: Interface, q: string) => new Promise(res => rl.question(q, res)) const interactiveRimraf = async ( impl: (path: string | string[], opt?: RimrafAsyncOptions) => Promise, paths: string[], opt: RimrafAsyncOptions ) => { const existingFilter = opt.filter || (() => true) let allRemaining = false let noneRemaining = false const queue: (() => Promise)[] = [] let processing = false const processQueue = async () => { if (processing) return processing = true let next: (() => Promise) | undefined while ((next = queue.shift())) { await next() } processing = false } const oneAtATime = (fn: (s: string, e: Dirent | Stats) => Promise) => async (s: string, e: Dirent | Stats): Promise => { const p = new Promise(res => { queue.push(async () => { const result = await fn(s, e) res(result) return result }) }) processQueue() return p } const rl = createInterface({ input: process.stdin, output: process.stdout, }) opt.filter = oneAtATime( async (path: string, ent: Dirent | Stats): Promise => { if (noneRemaining) { return false } while (!allRemaining) { const a = ( await prompt(rl, `rm? ${relative(cwd, path)}\n[(Yes)/No/All/Quit] > `) ).trim() if (/^n/i.test(a)) { return false } else if (/^a/i.test(a)) { allRemaining = true break } else if (/^q/i.test(a)) { noneRemaining = true return false } else if (a === '' || /^y/i.test(a)) { break } else { continue } } return existingFilter(path, ent) } ) await impl(paths, opt) rl.close() } const main = async (...args: string[]) => { const verboseFilter = (s: string) => { console.log(relative(cwd, s)) 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 let impl: ( path: string | string[], opt?: RimrafAsyncOptions ) => Promise = rimraf let interactive = false for (const arg of args) { if (dashdash) { paths.push(arg) continue } if (arg === '--') { dashdash = true continue } else if (arg === '-rf' || arg === '-fr') { // this never did anything, but people put it there I guess continue } else if (arg === '-h' || arg === '--help') { console.log(help) return 0 } else if (arg === '--interactive' || arg === '-i') { interactive = true continue } else if (arg === '--no-interactive' || arg === '-I') { interactive = false continue } else if (arg === '--verbose' || arg === '-v') { opt.filter = verboseFilter continue } else if (arg === '--no-verbose' || arg === '-V') { opt.filter = undefined continue } else if (arg === '-g' || arg === '--glob') { opt.glob = true continue } else if (arg === '-G' || arg === '--no-glob') { opt.glob = false continue } else if (arg === '--preserve-root') { opt.preserveRoot = true continue } else if (arg === '--no-preserve-root') { opt.preserveRoot = false continue } else if (/^--tmp=/.test(arg)) { const val = arg.substring('--tmp='.length) opt.tmp = val continue } else if (/^--max-retries=/.test(arg)) { const val = +arg.substring('--max-retries='.length) opt.maxRetries = val continue } else if (/^--retry-delay=/.test(arg)) { const val = +arg.substring('--retry-delay='.length) opt.retryDelay = val continue } else if (/^--backoff=/.test(arg)) { const val = +arg.substring('--backoff='.length) opt.backoff = val continue } else if (/^--impl=/.test(arg)) { const val = arg.substring('--impl='.length) switch (val) { case 'rimraf': impl = rimraf continue case 'native': case 'manual': case 'posix': case 'windows': impl = rimraf[val] continue case 'move-remove': impl = rimraf.moveRemove continue default: console.error(`unknown implementation: ${val}`) runHelpForUsage() return 1 } } else if (/^-/.test(arg)) { console.error(`unknown option: ${arg}`) runHelpForUsage() return 1 } else { paths.push(arg) } } if (opt.preserveRoot !== false) { for (const path of paths.map(p => resolve(p))) { if (path === parse(path).root) { console.error(`rimraf: it is dangerous to operate recursively on '/'`) console.error('use --no-preserve-root to override this failsafe') return 1 } } } if (!paths.length) { console.error('rimraf: must provide a path to remove') runHelpForUsage() return 1 } if (impl === rimraf.native && (interactive || opt.filter)) { console.error('native implementation does not support -v or -i') runHelpForUsage() return 1 } if (interactive) { await interactiveRimraf(impl, paths, opt) } else { await impl(paths, opt) } return 0 } main.help = help export default main if ( typeof require === 'function' && typeof module === 'object' && require.main === module ) { const args = process.argv.slice(2) main(...args).then( code => process.exit(code), er => { console.error(er) process.exit(1) } ) } isaacs-rimraf-89ff4ac/src/default-tmp.ts000066400000000000000000000036701440664702500203400ustar00rootroot00000000000000// The default temporary folder location for use in the windows algorithm. // It's TEMPting to use dirname(path), since that's guaranteed to be on the // same device. However, this means that: // rimraf(path).then(() => rimraf(dirname(path))) // will often fail with EBUSY, because the parent dir contains // marked-for-deletion directory entries (which do not show up in readdir). // The approach here is to use os.tmpdir() if it's on the same drive letter, // or resolve(path, '\\temp') if it exists, or the root of the drive if not. // On Posix (not that you'd be likely to use the windows algorithm there), // it uses os.tmpdir() always. 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) { return false } } const isDir = (path: string) => stat(path).then( st => st.isDirectory(), () => false ) const win32DefaultTmp = async (path: string) => { const { root } = parse(path) const tmp = tmpdir() const { root: tmpRoot } = parse(tmp) if (root.toLowerCase() === tmpRoot.toLowerCase()) { return tmp } const driveTmp = resolve(root, '/temp') if (await isDir(driveTmp)) { return driveTmp } return root } const win32DefaultTmpSync = (path: string) => { const { root } = parse(path) const tmp = tmpdir() const { root: tmpRoot } = parse(tmp) if (root.toLowerCase() === tmpRoot.toLowerCase()) { return tmp } const driveTmp = resolve(root, '/temp') if (isDirSync(driveTmp)) { return driveTmp } return root } const posixDefaultTmp = async () => tmpdir() const posixDefaultTmpSync = () => tmpdir() export const defaultTmp = platform === 'win32' ? win32DefaultTmp : posixDefaultTmp export const defaultTmpSync = platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync isaacs-rimraf-89ff4ac/src/fix-eperm.ts000066400000000000000000000022101440664702500177770ustar00rootroot00000000000000import { chmodSync, promises } from './fs.js' const { chmod } = promises export const fixEPERM = (fn: (path: string) => Promise) => async (path: string) => { try { return await 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 } return 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') { return } throw er } return fn(path) } throw er } } isaacs-rimraf-89ff4ac/src/fs.ts000066400000000000000000000045001440664702500165170ustar00rootroot00000000000000// promisify ourselves, because older nodes don't have fs.promises import fs, { Dirent } from 'fs' // sync ones just take the sync version from node export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs' import { readdirSync as rdSync } from 'fs' export const readdirSync = (path: fs.PathLike): Dirent[] => rdSync(path, { withFileTypes: true }) // unrolled for better inlining, this seems to get better performance // than something like: // const makeCb = (res, rej) => (er, ...d) => er ? rej(er) : res(...d) // 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))) ) const mkdir = ( path: fs.PathLike, options?: | fs.Mode | (fs.MakeDirectoryOptions & { recursive?: boolean | null }) | undefined | null ): Promise => new Promise((res, rej) => fs.mkdir(path, options, (er, made) => (er ? rej(er) : res(made))) ) const readdir = (path: fs.PathLike): Promise => new Promise((res, rej) => fs.readdir(path, { withFileTypes: true }, (er, data) => er ? rej(er) : res(data) ) ) 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))) ) 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))) ) const rmdir = (path: fs.PathLike): Promise => new Promise((res, rej) => fs.rmdir(path, (er, ...d: any[]) => (er ? rej(er) : res(...d))) ) const stat = (path: fs.PathLike): Promise => new Promise((res, rej) => fs.stat(path, (er, data) => (er ? rej(er) : res(data))) ) const lstat = (path: fs.PathLike): Promise => new Promise((res, rej) => fs.lstat(path, (er, data) => (er ? rej(er) : res(data))) ) const unlink = (path: fs.PathLike): Promise => new Promise((res, rej) => fs.unlink(path, (er, ...d: any[]) => (er ? rej(er) : res(...d))) ) export const promises = { chmod, mkdir, readdir, rename, rm, rmdir, stat, lstat, unlink, } isaacs-rimraf-89ff4ac/src/ignore-enoent.ts000066400000000000000000000004711440664702500206630ustar00rootroot00000000000000export const ignoreENOENT = async (p: Promise) => p.catch(er => { if (er.code !== 'ENOENT') { throw er } }) export const ignoreENOENTSync = (fn: () => any) => { try { return fn() } catch (er) { if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') { throw er } } } isaacs-rimraf-89ff4ac/src/index-cjs.ts000066400000000000000000000001251440664702500177720ustar00rootroot00000000000000import rimraf from './index.js' export = Object.assign(rimraf, { default: rimraf }) isaacs-rimraf-89ff4ac/src/index.ts000066400000000000000000000101211440664702500172120ustar00rootroot00000000000000import { optArg, optArgSync } from './opt-arg.js' import pathArg from './path-arg.js' import { glob, GlobOptions, globSync } from 'glob' export interface RimrafAsyncOptions { preserveRoot?: boolean tmp?: string maxRetries?: number retryDelay?: number backoff?: number maxBackoff?: number signal?: AbortSignal glob?: boolean | GlobOptions filter?: | ((path: string, ent: Dirent | Stats) => boolean) | ((path: string, ent: Dirent | Stats) => Promise) } export interface RimrafSyncOptions extends RimrafAsyncOptions { filter?: (path: string, ent: Dirent | Stats) => boolean } export type RimrafOptions = RimrafSyncOptions | RimrafAsyncOptions const typeOrUndef = (val: any, t: string) => typeof val === 'undefined' || typeof val === t export const isRimrafOptions = (o: any): o is RimrafOptions => !!o && typeof o === 'object' && 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.filter, 'function') export const assertRimrafOptions: (o: any) => void = ( o: any ): asserts o is RimrafOptions => { if (!isRimrafOptions(o)) { throw new Error('invalid rimraf options') } } import { Dirent, Stats } from 'fs' import { rimrafManual, rimrafManualSync } from './rimraf-manual.js' import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js' import { rimrafNative, rimrafNativeSync } from './rimraf-native.js' import { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js' import { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js' import { useNative, useNativeSync } from './use-native.js' const wrap = (fn: (p: string, o: RimrafAsyncOptions) => Promise) => async ( path: string | string[], opt?: RimrafAsyncOptions ): Promise => { const options = optArg(opt) if (options.glob) { path = await glob(path, options.glob) } if (Array.isArray(path)) { return !!( await Promise.all(path.map(p => fn(pathArg(p, options), options))) ).reduce((a, b) => a && b, true) } else { return !!(await fn(pathArg(path, options), options)) } } const wrapSync = (fn: (p: string, o: RimrafSyncOptions) => boolean) => (path: string | string[], opt?: RimrafSyncOptions): boolean => { const options = optArgSync(opt) if (options.glob) { path = globSync(path, options.glob) } if (Array.isArray(path)) { return !!path .map(p => fn(pathArg(p, options), options)) .reduce((a, b) => a && b, true) } else { return !!fn(pathArg(path, options), options) } } export const nativeSync = wrapSync(rimrafNativeSync) export const native = Object.assign(wrap(rimrafNative), { sync: nativeSync }) export const manualSync = wrapSync(rimrafManualSync) export const manual = Object.assign(wrap(rimrafManual), { sync: manualSync }) export const windowsSync = wrapSync(rimrafWindowsSync) export const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync }) export const posixSync = wrapSync(rimrafPosixSync) export const posix = Object.assign(wrap(rimrafPosix), { sync: posixSync }) export const moveRemoveSync = wrapSync(rimrafMoveRemoveSync) export const moveRemove = Object.assign(wrap(rimrafMoveRemove), { sync: moveRemoveSync, }) export const rimrafSync = wrapSync((path, opt) => useNativeSync(opt) ? rimrafNativeSync(path, opt) : rimrafManualSync(path, opt) ) export const sync = rimrafSync export const rimraf = Object.assign( wrap((path, opt) => useNative(opt) ? rimrafNative(path, opt) : rimrafManual(path, opt) ), { // this weirdness because it's easier than explicitly declaring rimraf: manual, sync: rimrafSync, rimrafSync: rimrafSync, manual, manualSync, native, nativeSync, posix, posixSync, windows, windowsSync, moveRemove, moveRemoveSync, } ) rimraf.rimraf = rimraf export default rimraf isaacs-rimraf-89ff4ac/src/opt-arg.ts000066400000000000000000000020461440664702500174630ustar00rootroot00000000000000import { GlobOptions } from 'glob' import { assertRimrafOptions, RimrafAsyncOptions, RimrafOptions, RimrafSyncOptions, } from './index.js' const optArgT = ( opt: T ): | (T & { glob: GlobOptions & { withFileTypes: false } }) | (T & { glob: undefined }) => { assertRimrafOptions(opt) const { glob, ...options } = opt if (!glob) { return options as T & { glob: undefined } } const globOpt = glob === true ? opt.signal ? { signal: opt.signal } : {} : opt.signal ? { signal: opt.signal, ...glob, } : glob return { ...options, glob: { ...globOpt, // always get absolute paths from glob, to ensure // that we are referencing the correct thing. absolute: true, withFileTypes: false, }, } as T & { glob: GlobOptions & { withFileTypes: false } } } export const optArg = (opt: RimrafAsyncOptions = {}) => optArgT(opt) export const optArgSync = (opt: RimrafSyncOptions = {}) => optArgT(opt) isaacs-rimraf-89ff4ac/src/path-arg.ts000066400000000000000000000030231440664702500176110ustar00rootroot00000000000000import { 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 if (type !== 'string') { const ctor = path && type === 'object' && path.constructor const received = ctor && ctor.name ? `an instance of ${ctor.name}` : type === 'object' ? inspect(path) : `type ${type} ${path}` const msg = 'The "path" argument must be of type string. ' + `Received ${received}` throw Object.assign(new TypeError(msg), { path, code: 'ERR_INVALID_ARG_TYPE', }) } if (/\0/.test(path)) { // simulate same failure that node raises const msg = 'path must be a string without null bytes' throw Object.assign(new TypeError(msg), { path, code: 'ERR_INVALID_ARG_VALUE', }) } path = resolve(path) const { root } = parse(path) if (path === root && opt.preserveRoot !== false) { const msg = 'refusing to remove root directory without preserveRoot:false' throw Object.assign(new Error(msg), { path, code: 'ERR_PRESERVE_ROOT', }) } if (platform === 'win32') { const badWinChars = /[*|"<>?:]/ const { root } = parse(path) if (badWinChars.test(path.substring(root.length))) { throw Object.assign(new Error('Illegal characters in path.'), { path, code: 'EINVAL', }) } } return path } export default pathArg isaacs-rimraf-89ff4ac/src/platform.ts000066400000000000000000000001131440664702500177270ustar00rootroot00000000000000export default process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform isaacs-rimraf-89ff4ac/src/readdir-or-error.ts000066400000000000000000000006601440664702500212710ustar00rootroot00000000000000// returns an array of entries if readdir() works, // 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) export const readdirOrErrorSync = (path: string) => { try { return readdirSync(path) } catch (er) { return er as NodeJS.ErrnoException } } isaacs-rimraf-89ff4ac/src/retry-busy.ts000066400000000000000000000034611440664702500202410ustar00rootroot00000000000000// note: max backoff is the maximum that any *single* backoff will do import { RimrafAsyncOptions, RimrafOptions } from '.' 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) => { const method = async ( path: string, opt: RimrafAsyncOptions, backoff = 1, total = 0 ) => { const mbo = opt.maxBackoff || MAXBACKOFF const rate = opt.backoff || RATE const max = opt.maxRetries || MAXRETRIES let retries = 0 while (true) { try { return await fn(path) } catch (er) { const fer = er as NodeJS.ErrnoException if (fer?.path === path && fer?.code && codes.has(fer.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) }) } if (retries < max) { retries++ continue } } throw er } } } return method } // just retries, no async so no backoff export const retryBusySync = (fn: (path: string) => any) => { const method = (path: string, opt: RimrafOptions) => { const max = opt.maxRetries || MAXRETRIES let retries = 0 while (true) { try { return fn(path) } catch (er) { const fer = er as NodeJS.ErrnoException if ( fer?.path === path && fer?.code && codes.has(fer.code) && retries < max ) { retries++ continue } throw er } } } return method } isaacs-rimraf-89ff4ac/src/rimraf-manual.ts000066400000000000000000000005331440664702500206440ustar00rootroot00000000000000import 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 rimrafManualSync = platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync isaacs-rimraf-89ff4ac/src/rimraf-move-remove.ts000066400000000000000000000141171440664702500216330ustar00rootroot00000000000000// https://youtu.be/uhRWMGBjlO8?t=537 // // 1. readdir // 2. for each entry // a. if a non-empty directory, recurse // b. if an empty directory, move to random hidden file name in $TEMP // c. unlink/rmdir $TEMP // // This works around the fact that unlink/rmdir is non-atomic and takes // a non-deterministic amount of time to complete. // // However, it is HELLA SLOW, like 2-10x slower than a naive recursive rm. 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 { Dirent, Stats } from 'fs' import { RimrafAsyncOptions, RimrafSyncOptions } from '.' import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js' // 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 } } 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 } } const rimrafMoveRemoveDir = async ( path: string, opt: RimrafAsyncOptions, ent: Dirent | Stats ): Promise => { if (opt?.signal?.aborted) { throw opt.signal.reason } if (!opt.tmp) { return rimrafMoveRemoveDir( path, { ...opt, tmp: await defaultTmp(path) }, ent ) } if (path === opt.tmp && parse(path).root !== path) { throw new Error('cannot delete temp directory used for deletion') } 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !(await opt.filter(path, ent))) { return false } await ignoreENOENT(tmpUnlink(path, opt.tmp, unlinkFixEPERM)) return true } const removedAll = ( await Promise.all( entries.map(ent => rimrafMoveRemoveDir(resolve(path, ent.name), opt, ent)) ) ).reduce((a, b) => a && b, true) if (!removedAll) { return false } // we don't ever ACTUALLY try to unlink /, because that can never work // but when preserveRoot is false, we could be operating on it. // No need to check if preserveRoot is not false. if (opt.preserveRoot === false && path === parse(path).root) { return false } if (opt.filter && !(await opt.filter(path, ent))) { return false } await ignoreENOENT(tmpUnlink(path, opt.tmp, rmdir)) return true } const tmpUnlink = async ( path: string, tmp: string, rm: (p: string) => Promise ) => { const tmpFile = resolve(tmp, uniqueFilename(path)) await rename(path, tmpFile) return await rm(tmpFile) } 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 } } const rimrafMoveRemoveDirSync = ( path: string, opt: RimrafSyncOptions, ent: Dirent | Stats ): boolean => { if (opt?.signal?.aborted) { throw opt.signal.reason } if (!opt.tmp) { return rimrafMoveRemoveDirSync( path, { ...opt, tmp: defaultTmpSync(path) }, ent ) } const tmp: string = opt.tmp if (path === opt.tmp && parse(path).root !== path) { throw new Error('cannot delete temp directory used for deletion') } 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !opt.filter(path, ent)) { return false } ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, unlinkFixEPERMSync)) return true } let removedAll = true for (const ent of entries) { const p = resolve(path, ent.name) removedAll = rimrafMoveRemoveDirSync(p, opt, ent) && removedAll } if (!removedAll) { return false } if (opt.preserveRoot === false && path === parse(path).root) { return false } if (opt.filter && !opt.filter(path, ent)) { return false } ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, rmdirSync)) return true } const tmpUnlinkSync = ( path: string, tmp: string, rmSync: (p: string) => void ) => { const tmpFile = resolve(tmp, uniqueFilename(path)) renameSync(path, tmpFile) return rmSync(tmpFile) } isaacs-rimraf-89ff4ac/src/rimraf-native.ts000066400000000000000000000007631440664702500206620ustar00rootroot00000000000000import { RimrafAsyncOptions, RimrafSyncOptions } from '.' import { promises, rmSync } from './fs.js' const { rm } = promises export const rimrafNative = async ( path: string, opt: RimrafAsyncOptions ): Promise => { await rm(path, { ...opt, force: true, recursive: true, }) return true } export const rimrafNativeSync = ( path: string, opt: RimrafSyncOptions ): boolean => { rmSync(path, { ...opt, force: true, recursive: true, }) return true } isaacs-rimraf-89ff4ac/src/rimraf-posix.ts000066400000000000000000000074261440664702500205410ustar00rootroot00000000000000// the simple recursive removal, where unlink and rmdir are atomic // Note that this approach does NOT work on Windows! // We stat first and only unlink if the Dirent isn't a directory, // because sunos will let root unlink a directory, and some // 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 '.' import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js' 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 } } 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 } } const rimrafPosixDir = async ( path: string, opt: RimrafAsyncOptions, ent: Dirent | Stats ): Promise => { if (opt?.signal?.aborted) { throw opt.signal.reason } 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !(await opt.filter(path, ent))) { return false } await ignoreENOENT(unlink(path)) return true } const removedAll = ( await Promise.all( entries.map(ent => rimrafPosixDir(resolve(path, ent.name), opt, ent)) ) ).reduce((a, b) => a && b, true) if (!removedAll) { return false } // we don't ever ACTUALLY try to unlink /, because that can never work // but when preserveRoot is false, we could be operating on it. // No need to check if preserveRoot is not false. if (opt.preserveRoot === false && path === parse(path).root) { return false } if (opt.filter && !(await opt.filter(path, ent))) { return false } await ignoreENOENT(rmdir(path)) return true } const rimrafPosixDirSync = ( path: string, opt: RimrafSyncOptions, ent: Dirent | Stats ): boolean => { if (opt?.signal?.aborted) { throw opt.signal.reason } 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !opt.filter(path, ent)) { return false } ignoreENOENTSync(() => unlinkSync(path)) return true } let removedAll: boolean = true for (const ent of entries) { const p = resolve(path, ent.name) removedAll = rimrafPosixDirSync(p, opt, ent) && removedAll } if (opt.preserveRoot === false && path === parse(path).root) { return false } if (!removedAll) { return false } if (opt.filter && !opt.filter(path, ent)) { return false } ignoreENOENTSync(() => rmdirSync(path)) return true } isaacs-rimraf-89ff4ac/src/rimraf-windows.ts000066400000000000000000000134331440664702500210640ustar00rootroot00000000000000// This is the same as rimrafPosix, with the following changes: // // 1. EBUSY, ENFILE, EMFILE trigger retries and/or exponential backoff // 2. All non-directories are removed first and then all directories are // removed in a second sweep. // 3. If we hit ENOTEMPTY in the second sweep, fall back to move-remove on // the that folder. // // Note: "move then remove" is 2-10 times slower, and just as unreliable. import { Dirent, Stats } from 'fs' import { parse, resolve } from 'path' import { RimrafAsyncOptions, RimrafSyncOptions } from '.' import { fixEPERM, fixEPERMSync } from './fix-eperm.js' import { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js' 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' const { unlink, rmdir, lstat } = promises const rimrafWindowsFile = retryBusy(fixEPERM(unlink)) const rimrafWindowsFileSync = retryBusySync(fixEPERMSync(unlinkSync)) const rimrafWindowsDirRetry = retryBusy(fixEPERM(rmdir)) 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 try { return await rimrafWindowsDirRetry(path, options) } catch (er) { if ((er as NodeJS.ErrnoException)?.code === 'ENOTEMPTY') { return await rimrafMoveRemove(path, options) } throw er } } 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 try { return rimrafWindowsDirRetrySync(path, options) } catch (er) { const fer = er as NodeJS.ErrnoException if (fer?.code === 'ENOTEMPTY') { return rimrafMoveRemoveSync(path, options) } throw er } } const START = Symbol('start') 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 } } 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 } } const rimrafWindowsDir = async ( path: string, opt: RimrafAsyncOptions, ent: Dirent | Stats, state = START ): Promise => { if (opt?.signal?.aborted) { throw opt.signal.reason } 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !(await opt.filter(path, ent))) { return false } // is a file await ignoreENOENT(rimrafWindowsFile(path, opt)) return true } const s = state === START ? CHILD : state const removedAll = ( await Promise.all( entries.map(ent => rimrafWindowsDir(resolve(path, ent.name), opt, ent, s)) ) ).reduce((a, b) => a && b, true) if (state === START) { return rimrafWindowsDir(path, opt, ent, FINISH) } else if (state === FINISH) { if (opt.preserveRoot === false && path === parse(path).root) { return false } if (!removedAll) { return false } if (opt.filter && !(await opt.filter(path, ent))) { return false } await ignoreENOENT(rimrafWindowsDirMoveRemoveFallback(path, opt)) } return true } const rimrafWindowsDirSync = ( path: string, opt: RimrafSyncOptions, ent: Dirent | Stats, state = START ): boolean => { 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') { return true } if (entries.code !== 'ENOTDIR') { throw entries } } /* c8 ignore stop */ if (opt.filter && !opt.filter(path, ent)) { return false } // is a file ignoreENOENTSync(() => rimrafWindowsFileSync(path, opt)) return true } let removedAll = true for (const ent of entries) { const s = state === START ? CHILD : state const p = resolve(path, ent.name) removedAll = rimrafWindowsDirSync(p, opt, ent, s) && removedAll } if (state === START) { return rimrafWindowsDirSync(path, opt, ent, FINISH) } else if (state === FINISH) { if (opt.preserveRoot === false && path === parse(path).root) { return false } if (!removedAll) { return false } if (opt.filter && !opt.filter(path, ent)) { return false } ignoreENOENTSync(() => { rimrafWindowsDirMoveRemoveFallbackSync(path, opt) }) } return true } isaacs-rimraf-89ff4ac/src/use-native.ts000066400000000000000000000014101440664702500201640ustar00rootroot00000000000000const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version const versArr = version.replace(/^v/, '').split('.') const hasNative = +versArr[0] > 14 || (+versArr[0] === 14 && +versArr[1] >= 14) import { RimrafAsyncOptions, RimrafOptions } from './index.js' // we do NOT use native by default on Windows, because Node's native // rm implementation is less advanced. Change this code if that changes. import platform from './platform.js' export const useNative: (opt?: RimrafAsyncOptions) => boolean = !hasNative || platform === 'win32' ? () => false : opt => !opt?.signal && !opt?.filter export const useNativeSync: (opt?: RimrafOptions) => boolean = !hasNative || platform === 'win32' ? () => false : opt => !opt?.signal && !opt?.filter isaacs-rimraf-89ff4ac/tap-snapshots/000077500000000000000000000000001440664702500175555ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/tap-snapshots/test/000077500000000000000000000000001440664702500205345ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/tap-snapshots/test/bin.js.test.cjs000066400000000000000000000020721440664702500233770ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/bin.js TAP interactive deletes -V a > had any leftover 1`] = ` false ` exports[`test/bin.js TAP interactive deletes -V hehaha, yes i think so, , A > had any leftover 1`] = ` false ` exports[`test/bin.js TAP interactive deletes -V no, n, N, N, Q > had any leftover 1`] = ` true ` exports[`test/bin.js TAP interactive deletes -V y, YOLO, no, quit > had any leftover 1`] = ` true ` exports[`test/bin.js TAP interactive deletes -v a > had any leftover 1`] = ` false ` exports[`test/bin.js TAP interactive deletes -v hehaha, yes i think so, , A > had any leftover 1`] = ` false ` exports[`test/bin.js TAP interactive deletes -v no, n, N, N, Q > had any leftover 1`] = ` true ` exports[`test/bin.js TAP interactive deletes -v y, YOLO, no, quit > had any leftover 1`] = ` true ` isaacs-rimraf-89ff4ac/tap-snapshots/test/index.js.test.cjs000066400000000000000000000070331440664702500237400ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/index.js TAP mocky unit tests to select the correct function main function, useNative=false > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 1, }, ], Array [ "pathArg", "path", ], Array [ "useNative", Object { "a": 1, }, ], Array [ "rimrafPosix", "path", Object { "a": 1, }, ], Array [ "optArg", Object { "a": 2, }, ], Array [ "pathArg", "path", ], Array [ "useNativeSync", Object { "a": 2, }, ], Array [ "rimrafPosixSync", "path", Object { "a": 2, }, ], ] ` exports[`test/index.js TAP mocky unit tests to select the correct function main function, useNative=true > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 1, }, ], Array [ "pathArg", "path", ], Array [ "useNative", Object { "a": 1, }, ], Array [ "rimrafNative", "path", Object { "a": 1, }, ], Array [ "optArg", Object { "a": 2, }, ], Array [ "pathArg", "path", ], Array [ "useNativeSync", Object { "a": 2, }, ], Array [ "rimrafNativeSync", "path", Object { "a": 2, }, ], ] ` exports[`test/index.js TAP mocky unit tests to select the correct function manual > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 3, }, ], Array [ "pathArg", "path", ], Array [ "rimrafPosix", "path", Object { "a": 3, }, ], Array [ "optArg", Object { "a": 4, }, ], Array [ "pathArg", "path", ], Array [ "rimrafPosixSync", "path", Object { "a": 4, }, ], ] ` exports[`test/index.js TAP mocky unit tests to select the correct function native > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 5, }, ], Array [ "pathArg", "path", ], Array [ "rimrafNative", "path", Object { "a": 5, }, ], Array [ "optArg", Object { "a": 6, }, ], Array [ "pathArg", "path", ], Array [ "rimrafNativeSync", "path", Object { "a": 6, }, ], ] ` exports[`test/index.js TAP mocky unit tests to select the correct function posix > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 7, }, ], Array [ "pathArg", "path", ], Array [ "rimrafPosix", "path", Object { "a": 7, }, ], Array [ "optArg", Object { "a": 8, }, ], Array [ "pathArg", "path", ], Array [ "rimrafPosixSync", "path", Object { "a": 8, }, ], ] ` exports[`test/index.js TAP mocky unit tests to select the correct function windows > must match snapshot 1`] = ` Array [ Array [ "optArg", Object { "a": 9, }, ], Array [ "pathArg", "path", ], Array [ "rimrafWindows", "path", Object { "a": 9, }, ], Array [ "optArg", Object { "a": 10, }, ], Array [ "pathArg", "path", ], Array [ "rimrafWindowsSync", "path", Object { "a": 10, }, ], ] ` isaacs-rimraf-89ff4ac/tap-snapshots/test/retry-busy.js.test.cjs000066400000000000000000000007401440664702500247540ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/retry-busy.js TAP > default settings 1`] = ` Object { "codes": Set { "EMFILE", "ENFILE", "EBUSY", }, "MAXBACKOFF": 200, "MAXRETRIES": 10, "RATE": 1.2, } ` isaacs-rimraf-89ff4ac/tap-snapshots/test/rimraf-move-remove.js.test.cjs000066400000000000000000000175721440664702500263610ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/rimraf-move-remove.js TAP filter function filter=i async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP filter function filter=i async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP filter function filter=i sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-i-sync/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP filter function filter=j async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP filter function filter=j async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP filter function filter=j sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/a", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/b", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/d", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/e", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/g", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/h", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/j", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/k", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/l", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/m", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/m/n", "test/tap-testdir-rimraf-move-remove-filter-function-filter-j-sync/c/f/i/m/o", ] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs on unlink by trying to chmod 0o666 async > must match snapshot 1`] = ` Array [ Array [ "chmod", "{tmpfile}", "438", ], ] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs on unlink by trying to chmod 0o666 sync > must match snapshot 1`] = ` Array [ Array [ "chmodSync", "{tmpfile}", "438", ], ] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs, chmod raises something other than ENOENT async > must match snapshot 1`] = ` Array [] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs, chmod raises something other than ENOENT sync > must match snapshot 1`] = ` Array [ Array [ "chmodSync", "{tmpfile}", "438", ], ] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs, chmod returns ENOENT async > must match snapshot 1`] = ` Array [ Array [ "chmod", "{tmpfile}", "438", ], ] ` exports[`test/rimraf-move-remove.js TAP handle EPERMs, chmod returns ENOENT sync > must match snapshot 1`] = ` Array [ Array [ "chmodSync", "{tmpfile}", "438", ], ] ` isaacs-rimraf-89ff4ac/tap-snapshots/test/rimraf-native.js.test.cjs000066400000000000000000000011761440664702500253770ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/rimraf-native.js TAP calls the right node function > must match snapshot 1`] = ` Array [ Array [ "rm", "path", Object { "force": true, "recursive": true, "x": "y", }, ], Array [ "rmSync", "path", Object { "a": "b", "force": true, "recursive": true, }, ], ] ` isaacs-rimraf-89ff4ac/tap-snapshots/test/rimraf-posix.js.test.cjs000066400000000000000000000145041440664702500252520ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/rimraf-posix.js TAP filter function filter=i async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/a", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/b", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async/c/f/i/m/o", ] ` exports[`test/rimraf-posix.js TAP filter function filter=i async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/a", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/b", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-i-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-posix.js TAP filter function filter=i sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/a", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/b", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-i-sync/c/f/i/m/o", ] ` exports[`test/rimraf-posix.js TAP filter function filter=j async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/a", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/b", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async/c/f/i/m/o", ] ` exports[`test/rimraf-posix.js TAP filter function filter=j async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/a", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/b", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-j-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-posix.js TAP filter function filter=j sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/a", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/b", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/d", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/e", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/g", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/h", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/j", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/k", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/l", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/m", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/m/n", "test/tap-testdir-rimraf-posix-filter-function-filter-j-sync/c/f/i/m/o", ] ` isaacs-rimraf-89ff4ac/tap-snapshots/test/rimraf-windows.js.test.cjs000066400000000000000000000165471440664702500256130ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/rimraf-windows.js TAP filter function filter=i async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/a", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/b", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP filter function filter=i async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/a", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/b", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-i-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP filter function filter=i sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/a", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/b", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-i-sync/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP filter function filter=j async > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/a", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/b", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP filter function filter=j async filter > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/a", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/b", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-j-async-filter/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP filter function filter=j sync > paths seen 1`] = ` Array [ "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/a", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/b", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/d", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/e", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/g", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/h", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/j", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/k", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/l", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/m", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/m/n", "test/tap-testdir-rimraf-windows-filter-function-filter-j-sync/c/f/i/m/o", ] ` exports[`test/rimraf-windows.js TAP handle EPERMs on unlink by trying to chmod 0o666 async > chmods 1`] = ` 1 ` exports[`test/rimraf-windows.js TAP handle EPERMs on unlink by trying to chmod 0o666 sync > chmods 1`] = ` 1 ` exports[`test/rimraf-windows.js TAP handle EPERMs, chmod raises something other than ENOENT async > chmods 1`] = ` 0 ` exports[`test/rimraf-windows.js TAP handle EPERMs, chmod raises something other than ENOENT sync > chmods 1`] = ` 1 ` exports[`test/rimraf-windows.js TAP handle EPERMs, chmod returns ENOENT async > chmods 1`] = ` 1 ` exports[`test/rimraf-windows.js TAP handle EPERMs, chmod returns ENOENT sync > chmods 1`] = ` 1 ` isaacs-rimraf-89ff4ac/test/000077500000000000000000000000001440664702500157305ustar00rootroot00000000000000isaacs-rimraf-89ff4ac/test/bin.js000066400000000000000000000243051440664702500170420ustar00rootroot00000000000000const { basename } = require('path') const t = require('tap') const { readdirSync } = require('fs') t.test('basic arg parsing stuff', t => { const LOGS = [] const ERRS = [] const { log: consoleLog, error: consoleError } = console t.teardown(() => { console.log = consoleLog console.error = consoleError }) console.log = (...msg) => LOGS.push(msg) console.error = (...msg) => ERRS.push(msg) const CALLS = [] const rimraf = async (path, opt) => CALLS.push(['rimraf', path, opt]) const bin = t.mock('../dist/cjs/src/bin.js', { '../dist/cjs/src/index.js': Object.assign(rimraf, { native: async (path, opt) => CALLS.push(['native', path, opt]), manual: async (path, opt) => CALLS.push(['manual', path, opt]), posix: async (path, opt) => CALLS.push(['posix', path, opt]), windows: async (path, opt) => CALLS.push(['windows', path, opt]), moveRemove: async (path, opt) => CALLS.push(['move-remove', path, opt]), }), }).default t.afterEach(() => { LOGS.length = 0 ERRS.length = 0 CALLS.length = 0 }) t.test('helpful output', t => { const cases = [['-h'], ['--help'], ['a', 'b', '--help', 'c']] 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, []) t.same(CALLS, []) }) } t.end() }) t.test('no paths', async t => { t.equal(await bin(), 1) t.same(LOGS, []) t.same(ERRS, [ ['rimraf: must provide a path to remove'], ['run `rimraf --help` for usage information'], ]) }) t.test('unnecessary -rf', async t => { t.equal(await bin('-rf', 'foo'), 0) 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.same(CALLS, [ ['rimraf', ['foo'], {}], ['rimraf', ['foo'], {}], ['rimraf', ['foo'], {}], ['rimraf', ['foo'], {}], ]) }) t.test('verbose', 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 = [] console.log = s => logs.push(s) 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.test('silent', 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 = [] console.log = s => logs.push(s) 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.test('glob true', async t => { t.equal(await bin('-g', 'foo'), 0) t.equal(await bin('--glob', 'foo'), 0) t.equal(await bin('-G', '-g', 'foo'), 0) 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.same(CALLS, [ ['rimraf', ['foo'], { glob: true }], ['rimraf', ['foo'], { glob: true }], ['rimraf', ['foo'], { glob: true }], ['rimraf', ['foo'], { glob: false }], ['rimraf', ['foo'], { glob: false }], ['rimraf', ['foo'], { glob: false }], ]) }) t.test('dashdash', async t => { t.equal(await bin('--', '-h'), 0) t.same(LOGS, []) t.same(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.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.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, [ [`rimraf: it is dangerous to operate recursively on '/'`], ['use --no-preserve-root to override this failsafe'], ]) t.same(CALLS, []) }) t.test('no preserve root, remove root', async t => { t.equal(await bin('/', '--no-preserve-root'), 0) t.same(LOGS, []) t.same(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.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.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.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.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, [ ['unknown option: --unknown-option=100'], ['run `rimraf --help` for usage information'], ]) t.same(CALLS, []) }) t.test('--impl=asdf', async t => { t.equal(await bin('--impl=asdf', 'foo'), 1) t.same(LOGS, []) t.same(ERRS, [ ['unknown implementation: asdf'], ['run `rimraf --help` for usage information'], ]) t.same(CALLS, []) }) t.test('native cannot do filters', async t => { t.equal(await bin('--impl=native', '-v', 'foo'), 1) t.same(ERRS, [ ['native implementation does not support -v or -i'], ['run `rimraf --help` for usage information'], ]) ERRS.length = 0 t.equal(await bin('--impl=native', '-i', 'foo'), 1) t.same(ERRS, [ ['native implementation does not support -v or -i'], ['run `rimraf --help` for usage information'], ]) ERRS.length = 0 t.same(CALLS, []) t.same(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) { t.test(`--impl=${impl}`, async t => { t.equal(await bin('foo', `--impl=${impl}`), 0) t.same(LOGS, []) t.same(ERRS, []) t.same(CALLS, [[impl, ['foo'], {}]]) }) } t.end() }) t.test('actually delete something with it', async t => { const path = t.testdir({ a: { b: { c: '1', }, }, }) const bin = require.resolve('../dist/cjs/src/bin.js') const { spawnSync } = require('child_process') const res = spawnSync(process.execPath, [bin, path]) const { statSync, readdirSync } = require('fs') t.throws(() => statSync(path)) t.equal(res.status, 0) }) t.test('print failure when impl throws', async t => { const path = t.testdir({ a: { b: { c: '1', }, }, }) const bin = require.resolve('../dist/cjs/src/bin.js') const { spawnSync } = require('child_process') const res = spawnSync(process.execPath, [bin, path], { env: { ...process.env, __RIMRAF_TESTING_BIN_FAIL__: '1', }, }) const { statSync } = require('fs') 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 => { const scripts = [ ['a'], ['y', 'YOLO', 'no', 'quit'], ['hehaha', 'yes i think so', '', 'A'], ['no', 'n', 'N', 'N', 'Q'], ] const fixture = { a: { b: '', c: '', d: '' }, b: { c: '', d: '', e: '' }, c: { d: '', e: '', f: '' }, } const verboseOpt = ['-v', '-V'] // t.jobs = scripts.length * verboseOpt.length const { spawn } = require('child_process') const bin = require.resolve('../dist/cjs/src/bin.js') const node = process.execPath const leftovers = d => { try { readdirSync(d) return true } catch (_) { return false } } for (const verbose of verboseOpt) { t.test(verbose, async t => { for (const s of scripts) { const script = s.slice() t.test(script.join(', '), async t => { const d = t.testdir(fixture) const args = [bin, '-i', verbose, d] const child = spawn(node, args, { stdio: 'pipe', }) const out = [] const err = [] 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 => { // await new Promise(r => setTimeout(r, 50)) out.push(c.trim()) const s = script.shift() if (s !== undefined) { last === s out.push(s.trim()) child.stdin.write(s + '\n') } else { // keep writing whatever the last option was child.stdin.write(last + '\n') } }) child.stderr.on('data', c => { err.push(c) }) return new Promise(res => { child.on('close', (code, signal) => { clearTimeout(timer) t.same(err, [], 'should not see any stderr') t.equal(code, 0, 'code') t.equal(signal, null, 'signal') t.matchSnapshot(leftovers(d), 'had any leftover') res() }) }) }) } t.end() }) } t.end() }) isaacs-rimraf-89ff4ac/test/default-tmp.js000066400000000000000000000031251440664702500205110ustar00rootroot00000000000000const t = require('tap') t.test('posix platform', async t => { const { tmpdir } = require('os') const { defaultTmp, defaultTmpSync } = t.mock( '../dist/cjs/src/default-tmp.js', { '../dist/cjs/src/platform.js': 'posix', } ) t.equal(defaultTmpSync('anything'), tmpdir()) t.equal(await defaultTmp('anything').then(t => t), tmpdir()) }) t.test('windows', async t => { const tempDirCheck = path => { switch (path.toLowerCase()) { case 'd:\\temp': return { isDirectory: () => true } case 'e:\\temp': return { isDirectory: () => false } default: throw Object.assign(new Error('no ents here'), { code: 'ENOENT' }) } } const { defaultTmp, defaultTmpSync } = t.mock( '../dist/cjs/src/default-tmp.js', { os: { tmpdir: () => 'C:\\Windows\\Temp', }, path: require('path').win32, '../dist/cjs/src/platform.js': 'win32', '../dist/cjs/src/fs.js': { statSync: tempDirCheck, promises: { stat: async path => tempDirCheck(path), }, }, } ) const expect = { 'c:\\some\\path': 'C:\\Windows\\Temp', 'C:\\some\\path': 'C:\\Windows\\Temp', 'd:\\some\\path': 'd:\\temp', 'D:\\some\\path': 'D:\\temp', 'e:\\some\\path': 'e:\\', 'E:\\some\\path': 'E:\\', 'f:\\some\\path': 'f:\\', 'F:\\some\\path': 'F:\\', } for (const [path, tmp] of Object.entries(expect)) { t.test(`${path} -> ${tmp}`, async t => { t.equal(defaultTmpSync(path), tmp, 'sync') t.equal(await defaultTmp(path), tmp, 'async') }) } t.end() }) isaacs-rimraf-89ff4ac/test/delete-many-files.js000066400000000000000000000044141440664702500215750ustar00rootroot00000000000000// 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. const t = require('tap') if (/^v10\./.test(process.version)) { t.plan(0, 'skip this on node 10, it runs out of memory') process.exit(0) } // run with RIMRAF_TEST_START_CHAR/_END_CHAR/_DEPTH environs to // make this more or less aggressive. 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 const { statSync, mkdirSync, readdirSync } = require('../dist/cjs/src/fs.js') const { writeFileSync } = require('fs') const { resolve, dirname } = require('path') const create = (path, depth = 0) => { mkdirSync(path) for (let i = START; i <= END; i++) { const c = String.fromCharCode(i) if (depth < DEPTH && i - START >= depth) { create(resolve(path, c), depth + 1) } else { writeFileSync(resolve(path, c), c) } } return path } const cases = { manual: require('../').manual, } const base = t.testdir( Object.keys(cases).reduce((o, c) => { o[c] = { sync: {}, async: {} } return o }, {}) ) const createAllFixtures = t => { for (const name of Object.keys(cases)) { for (const type of ['sync', 'async']) { const path = `${base}/${name}/${type}/test` create(path) t.equal(statSync(path).isDirectory(), true, `${name}/${type} created`) } } setTimeout(() => t.end(), 3000) } t.test('create all fixtures', createAllFixtures) t.test('delete all fixtures', t => { for (const [name, rimraf] of Object.entries(cases)) { t.test(name, t => { t.test('async', async t => { const path = `${base}/${name}/async/test` await rimraf(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'fully removed') t.same(readdirSync(dirname(path)), [], 'no temp entries left behind') }) t.test('sync', t => { const path = `${base}/${name}/sync/test` rimraf.sync(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'fully removed') t.same(readdirSync(dirname(path)), [], 'no temp entries left behind') t.end() }) t.end() }) } t.end() }) isaacs-rimraf-89ff4ac/test/fix-eperm.js000066400000000000000000000101531440664702500201620ustar00rootroot00000000000000const t = require('tap') const fs = require('../dist/cjs/src/fs.js') t.test('works if it works', async t => { const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', {}) const fixed = fixEPERM(() => 1) await fixed().then(n => t.equal(n, 1)) const fixedSync = fixEPERMSync(() => 1) t.equal(fixedSync(), 1) }) t.test('throw non-EPERM just throws', async t => { const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', {}) const fixed = fixEPERM(() => { throw new Error('oops') }) await t.rejects(fixed(), new Error('oops')) const fixedSync = fixEPERMSync(() => { throw new Error('oops') }) t.throws(() => fixedSync(), new Error('oops')) }) t.test('throw ENOENT returns void', async t => { const er = Object.assign(new Error('no ents'), { code: 'ENOENT' }) const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', {}) const fixed = fixEPERM(() => { throw er }) await fixed().then(n => t.equal(n, undefined)) const fixedSync = fixEPERMSync(() => { throw er }) t.equal(fixedSync(), undefined) }) t.test('chmod and try again', async t => { const seen = new Set() const finished = new Set() const eperm = Object.assign(new Error('perm'), { code: 'EPERM' }) const method = p => { if (!seen.has(p)) { seen.add(p) throw eperm } else { t.equal(chmods.has(p), true) t.equal(finished.has(p), false) finished.add(p) } } const chmods = new Set() const chmodSync = (p, mode) => { t.equal(chmods.has(p), false) chmods.add(p) t.equal(mode, 0o666) } const chmod = async (p, mode) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', { '../dist/cjs/src/fs.js': { promises: { chmod }, chmodSync, }, }) const fixed = fixEPERM(method) const fixedSync = fixEPERMSync(method) await fixed('async').then(n => t.equal(n, undefined)) t.equal(fixedSync('sync'), undefined) t.equal(chmods.size, 2) t.equal(seen.size, 2) t.equal(finished.size, 2) }) t.test('chmod ENOENT is fine, abort', async t => { const seen = new Set() const finished = new Set() const eperm = Object.assign(new Error('perm'), { code: 'EPERM' }) const method = p => { if (!seen.has(p)) { seen.add(p) throw eperm } else { t.equal(chmods.has(p), true) t.equal(finished.has(p), false) finished.add(p) } } const chmods = new Set() const chmodSync = (p, mode) => { t.equal(chmods.has(p), false) chmods.add(p) t.equal(mode, 0o666) throw Object.assign(new Error('no ent'), { code: 'ENOENT' }) } const chmod = async (p, mode) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', { '../dist/cjs/src/fs.js': { promises: { chmod }, chmodSync, }, }) const fixed = fixEPERM(method) const fixedSync = fixEPERMSync(method) await fixed('async').then(n => t.equal(n, undefined)) t.equal(fixedSync('sync'), undefined) t.equal(chmods.size, 2) t.equal(seen.size, 2) t.equal(finished.size, 0) }) t.test('chmod other than ENOENT is failure', async t => { const seen = new Set() const finished = new Set() const eperm = Object.assign(new Error('perm'), { code: 'EPERM' }) const method = p => { if (!seen.has(p)) { seen.add(p) throw eperm } else { t.equal(chmods.has(p), true) t.equal(finished.has(p), false) finished.add(p) } } const chmods = new Set() const chmodSync = (p, mode) => { t.equal(chmods.has(p), false) chmods.add(p) t.equal(mode, 0o666) throw Object.assign(new Error('ent bro'), { code: 'OHNO' }) } const chmod = async (p, mode) => chmodSync(p, mode) const { fixEPERM, fixEPERMSync } = t.mock('../dist/cjs/src/fix-eperm.js', { '../dist/cjs/src/fs.js': { promises: { chmod }, chmodSync, }, }) const fixed = fixEPERM(method) const fixedSync = fixEPERMSync(method) t.rejects(fixed('async'), { code: 'EPERM' }) t.throws(() => fixedSync('sync'), { code: 'EPERM' }) t.equal(chmods.size, 2) t.equal(seen.size, 2) t.equal(finished.size, 0) }) isaacs-rimraf-89ff4ac/test/fs.ts000066400000000000000000000050051440664702500167100ustar00rootroot00000000000000import t 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/cjs/src/fs.js' const mockFSMethodPass = (method: string) => (...args: any[]) => { const cb = args.pop() process.nextTick(() => cb(null, method, 1, 2, 3)) } const mockFSMethodFail = (method: string) => (...args: any[]) => { const cb = args.pop() process.nextTick(() => cb(new Error('oops'), method, 1, 2, 3)) } import { useNative } from '../dist/cjs/src/use-native.js' t.type(fs.promises, Object) const mockFSPass: { [k: string]: (...a: any[]) => any } = {} const mockFSFail: { [k: string]: (...a: any[]) => any } = {} for (const method of Object.keys( fs.promises as { [k: string]: (...a: any[]) => any } )) { // 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], 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` ], `has ${method}Sync` ) } } // set up our pass/fails for the next tests mockFSPass[method] = mockFSMethodPass(method) mockFSFail[method] = mockFSMethodFail(method) } // doesn't have any sync versions that aren't promisified for (const method of Object.keys(fs)) { if (method === 'promises') { continue } const m = method.replace(/Sync$/, '') t.type( (fs.promises as { [k: string]: (...a: any[]) => any })[m], Function, `fs.promises.${m} is a function` ) } t.test('passing resolves promise', async t => { const fs = t.mock('../src/fs', { fs: mockFSPass }) for (const [m, fn] of Object.entries( fs.promises as { [k: string]: (...a: any) => Promise } )) { t.same(await fn(), m, `got expected value for ${m}`) } }) t.test('failing rejects promise', async t => { const fs = t.mock('../src/fs', { fs: mockFSFail }) for (const [m, fn] of Object.entries( fs.promises as { [k: string]: (...a: any[]) => Promise } )) { t.rejects(fn(), { message: 'oops' }, `got expected value for ${m}`) } }) isaacs-rimraf-89ff4ac/test/ignore-enoent.js000066400000000000000000000012431440664702500210370ustar00rootroot00000000000000const t = require('tap') const { ignoreENOENT, ignoreENOENTSync, } = require('../dist/cjs/src/ignore-enoent.js') 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.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' ) isaacs-rimraf-89ff4ac/test/index.js000066400000000000000000000133571440664702500174060ustar00rootroot00000000000000const { statSync } = require('fs') const t = require('tap') t.same( require('../package.json').exports, { '.': { import: { default: './dist/mjs/index.js', types: './dist/mjs/index.d.ts', }, require: { default: './dist/cjs/src/index-cjs.js', types: './dist/cjs/src/index.d.ts', }, }, }, 'nothing else exported except main' ) t.test('mocky unit tests to select the correct function', t => { // don't mock rimrafManual, so we can test the platform switch const CALLS = [] let USE_NATIVE = true const mocks = { '../dist/cjs/src/use-native.js': { useNative: opt => { CALLS.push(['useNative', opt]) return USE_NATIVE }, useNativeSync: opt => { CALLS.push(['useNativeSync', opt]) return USE_NATIVE }, }, '../dist/cjs/src/path-arg.js': path => { CALLS.push(['pathArg', path]) return path }, '../dist/cjs/src/opt-arg.js': { optArg: opt => { CALLS.push(['optArg', opt]) return opt }, optArgSync: opt => { CALLS.push(['optArg', opt]) return opt }, }, '../dist/cjs/src/rimraf-posix.js': { rimrafPosix: async (path, opt) => { CALLS.push(['rimrafPosix', path, opt]) }, rimrafPosixSync: async (path, opt) => { CALLS.push(['rimrafPosixSync', path, opt]) }, }, '../dist/cjs/src/rimraf-windows.js': { rimrafWindows: async (path, opt) => { CALLS.push(['rimrafWindows', path, opt]) }, rimrafWindowsSync: async (path, opt) => { CALLS.push(['rimrafWindowsSync', path, opt]) }, }, '../dist/cjs/src/rimraf-native.js': { rimrafNative: async (path, opt) => { CALLS.push(['rimrafNative', path, opt]) }, rimrafNativeSync: async (path, opt) => { CALLS.push(['rimrafNativeSync', path, opt]) }, }, } process.env.__TESTING_RIMRAF_PLATFORM__ = 'posix' const rimraf = t.mock('../', mocks) 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 }) rimraf.sync('path', { a: 2 }) t.equal(rimraf.rimraf, rimraf) t.equal(rimraf.rimrafSync, rimraf.sync) t.matchSnapshot(CALLS) t.end() }) } t.test('manual', t => { rimraf.manual('path', { a: 3 }) rimraf.manual.sync('path', { a: 4 }) t.equal(rimraf.manualSync, rimraf.manual.sync) t.matchSnapshot(CALLS) t.end() }) t.test('native', t => { rimraf.native('path', { a: 5 }) rimraf.native.sync('path', { a: 6 }) t.equal(rimraf.nativeSync, rimraf.native.sync) t.matchSnapshot(CALLS) t.end() }) t.test('posix', t => { rimraf.posix('path', { a: 7 }) rimraf.posix.sync('path', { a: 8 }) t.equal(rimraf.posixSync, rimraf.posix.sync) t.matchSnapshot(CALLS) t.end() }) t.test('windows', t => { rimraf.windows('path', { a: 9 }) rimraf.windows.sync('path', { a: 10 }) t.equal(rimraf.windowsSync, rimraf.windows.sync) t.matchSnapshot(CALLS) t.end() }) t.end() }) t.test('actually delete some stuff', t => { const fixture = { a: 'a', b: 'b', c: { d: 'd', e: 'e', f: { g: 'g', h: 'h', i: { j: 'j', k: 'k', l: 'l', m: { n: 'n', o: 'o', }, }, }, }, } const { rimraf } = require('../') const { statSync } = require('fs') t.test('sync', t => { const path = t.testdir(fixture) rimraf.sync(path) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await rimraf(path) t.throws(() => statSync(path), { code: 'ENOENT' }) }) t.end() }) t.test('accept array of paths as first arg', async t => { const { resolve } = require('path') const ASYNC_CALLS = [] const SYNC_CALLS = [] const { rimraf, rimrafSync } = t.mock('../', { '../dist/cjs/src/use-native.js': { useNative: () => true, useNativeSync: () => true, }, '../dist/cjs/src/rimraf-native.js': { rimrafNative: async (path, opt) => ASYNC_CALLS.push([path, opt]), rimrafNativeSync: (path, opt) => SYNC_CALLS.push([path, opt]), }, }) t.equal(await rimraf(['a', 'b', 'c']), true) t.equal(await rimraf(['i', 'j', 'k'], { x: 'ya' }), true) t.same(ASYNC_CALLS, [ [resolve('a'), {}], [resolve('b'), {}], [resolve('c'), {}], [resolve('i'), { x: 'ya' }], [resolve('j'), { x: 'ya' }], [resolve('k'), { x: 'ya' }], ]) t.equal(rimrafSync(['x', 'y', 'z']), true) t.equal(rimrafSync(['m', 'n', 'o'], { cat: 'chai' }), true) t.same(SYNC_CALLS, [ [resolve('x'), {}], [resolve('y'), {}], [resolve('z'), {}], [resolve('m'), { cat: 'chai' }], [resolve('n'), { cat: 'chai' }], [resolve('o'), { cat: 'chai' }], ]) }) t.test('deleting globs', t => { const { rimraf, rimrafSync } = require('../') const fixture = { a: 'a', b: 'b', c: { d: 'd', e: 'e', f: { g: 'g', h: 'h', i: { j: 'j', k: 'k', l: 'l', m: { n: 'n', o: 'o', }, }, }, }, } t.test('sync', t => { const cwd = t.testdir(fixture) rimrafSync('**/f/**/m', { glob: { cwd } }) t.throws(() => statSync(cwd + '/c/f/i/m')) statSync(cwd + '/c/f/i/l') t.end() }) t.test('async', async t => { const cwd = t.testdir(fixture) await rimraf('**/f/**/m', { glob: { cwd } }) t.throws(() => statSync(cwd + '/c/f/i/m')) statSync(cwd + '/c/f/i/l') }) t.end() }) isaacs-rimraf-89ff4ac/test/opt-arg.js000066400000000000000000000066671440664702500176560ustar00rootroot00000000000000const t = require('tap') const { optArg: oa, optArgSync: oas } = require('../dist/cjs/src/opt-arg.js') const opt = { a: 1 } t.same(oa(opt), opt, 'returns equivalent object if provided') t.same(oas(opt), oa(opt), 'optArgSync does the same thing') t.same(oa(), {}, 'returns new object otherwise') t.throws(() => oa(true)) t.throws(() => oa(null)) t.throws(() => oa('hello')) t.throws(() => oa({ maxRetries: 'banana' })) t.test('every kind of invalid option value', t => { // skip them when it's undefined, and skip the case // where they're all undefined, otherwise try every // possible combination of the values here. const badBool = [undefined, 1, null, 'x', {}] const badNum = [undefined, true, false, null, 'x', '1', {}] const badStr = [undefined, { toString: () => 'hi' }, /hi/, Symbol.for('hi')] for (const preserveRoot of badBool) { for (const tmp of badStr) { for (const maxRetries of badNum) { for (const retryDelay of badNum) { for (const backoff of badNum) { for (const maxBackoff of badNum) { if ( preserveRoot === undefined && maxRetries === undefined && retryDelay === undefined && backoff === undefined && maxBackoff === undefined && tmp === undefined ) { continue } t.throws(() => oa({ preserveRoot, maxRetries, retryDelay, backoff, maxBackoff, tmp, }) ) } } } } } } t.end() }) t.test('test every allowed combination', t => { const goodBool = [undefined, true, false] // note that a few of these actually aren't *valid*, // but it's verifying what the initial opt checker does. const goodNum = [undefined, 1, Math.pow(2, 32), -1] const goodStr = [undefined, 'hi'] for (const preserveRoot of goodBool) { for (const tmp of goodStr) { for (const maxRetries of goodNum) { for (const retryDelay of goodNum) { for (const backoff of goodNum) { for (const maxBackoff of goodNum) { t.ok( oa({ preserveRoot, maxRetries, retryDelay, backoff, maxBackoff, tmp, }) ) } } } } } } t.end() }) t.test('glob option handling', t => { t.same(oa({ glob: true }), { glob: { absolute: true, withFileTypes: false }, }) const gws = oa({ signal: { x: 1 }, glob: true }) t.same(gws, { signal: { x: 1 }, glob: { absolute: true, signal: { x: 1 }, withFileTypes: false }, }) t.equal(gws.signal, gws.glob.signal) t.same(oa({ glob: { nodir: true } }), { glob: { absolute: true, nodir: true, withFileTypes: false }, }) const gwsg = oa({ signal: { x: 1 }, glob: { nodir: true } }) t.same(gwsg, { signal: { x: 1 }, glob: { absolute: true, nodir: true, withFileTypes: false, signal: { x: 1 }, }, }) t.equal(gwsg.signal, gwsg.glob.signal) t.same(oa({ signal: { x: 1 }, glob: { nodir: true, signal: { y: 1 } } }), { signal: { x: 1 }, glob: { absolute: true, nodir: true, signal: { y: 1 }, withFileTypes: false, }, }) t.end() }) isaacs-rimraf-89ff4ac/test/path-arg.js000066400000000000000000000040621440664702500177730ustar00rootroot00000000000000const t = require('tap') if (!process.env.__TESTING_RIMRAF_PLATFORM__) { const fake = process.platform === 'win32' ? 'posix' : 'win32' t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_PLATFORM__: fake, }, }) } const platform = process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform const path = require('path')[platform] || require('path') const pathArg = t.mock('../dist/cjs/src/path-arg.js', { path, }).default const { resolve } = path 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(path), er) } } t.throws(() => pathArg('/'), { code: 'ERR_PRESERVE_ROOT' }) t.throws(() => pathArg('/', { preserveRoot: null }), { code: 'ERR_PRESERVE_ROOT', }) t.equal(pathArg('/', { preserveRoot: false }), resolve('/')) 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', }) 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', }) const { inspect } = require('util') t.throws(() => pathArg(Object.create(null)), { 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', }) 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', }) isaacs-rimraf-89ff4ac/test/platform.js000066400000000000000000000005211440664702500201100ustar00rootroot00000000000000const t = require('tap') t.test('actual platform', t => { t.equal(require('../dist/cjs/src/platform.js').default, process.platform) t.end() }) t.test('fake platform', t => { process.env.__TESTING_RIMRAF_PLATFORM__ = 'not actual platform' t.equal(t.mock('../dist/cjs/src/platform.js').default, 'not actual platform') t.end() }) isaacs-rimraf-89ff4ac/test/readdir-or-error.js000066400000000000000000000015631440664702500214520ustar00rootroot00000000000000const t = require('tap') const { readdirOrError, readdirOrErrorSync, } = require('../dist/cjs/src/readdir-or-error.js') const path = t.testdir({ file: 'file', empty: {}, full: { x: 'x', y: 'y', z: 'z', }, }) // [path, expected] const cases = [ ['file', { code: 'ENOTDIR' }], ['empty', []], ['full', ['x', 'y', 'z']], ] for (const [c, expect] of cases) { t.test(c, async t => { const p = `${path}/${c}` const resAsync = await readdirOrError(p) const resSync = readdirOrErrorSync(p) if (Array.isArray(expect)) { t.same( resAsync.map(e => e.name).sort(), expect.sort(), 'got async result' ) t.same(resSync.map(e => e.name).sort(), expect.sort(), 'got sync result') } else { t.match(resAsync, expect, 'got async result') t.match(resSync, expect, 'got sync result') } }) } isaacs-rimraf-89ff4ac/test/retry-busy.js000066400000000000000000000052401440664702500204140ustar00rootroot00000000000000const { retryBusy, retryBusySync, MAXBACKOFF, RATE, MAXRETRIES, codes, } = require('../dist/cjs/src/retry-busy.js') const t = require('tap') t.matchSnapshot( { MAXBACKOFF, RATE, MAXRETRIES, codes, }, 'default settings' ) t.test('basic working operation when no errors happen', async t => { let calls = 0 const arg = {} const opt = {} const method = (a, b) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') calls++ } const rBS = retryBusySync(method) rBS(arg, opt) t.equal(calls, 1) const rB = retryBusy(method) await rB(arg, opt).then(() => t.equal(calls, 2)) }) t.test('retry when known error code thrown', t => { t.plan(codes.size) for (const code of codes) { t.test(code, async t => { let thrown = false let calls = 0 const arg = {} const opt = {} const method = (a, b) => { t.equal(a, arg, 'got first argument') t.equal(b, undefined, 'did not get another argument') if (!thrown) { thrown = true t.equal(calls, 0, 'first call') calls++ throw Object.assign(new Error(code), { path: a, code }) } else { t.equal(calls, 1, 'second call') calls++ thrown = false } } const rBS = retryBusySync(method) rBS(arg, opt) t.equal(calls, 2) calls = 0 const rB = retryBusy(method) await rB(arg, opt).then(() => t.equal(calls, 2)) }) } }) t.test('retry and eventually give up', t => { t.plan(codes.size) const opt = { maxBackoff: 2, maxRetries: 2, } for (const code of codes) { t.test(code, async t => { let calls = 0 const arg = {} const method = (a, b) => { 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 rBS = retryBusySync(method) t.throws(() => rBS(arg, opt), { path: arg, code }) t.equal(calls, 3) calls = 0 const rB = retryBusy(method) await t.rejects(rB(arg, opt)).then(() => t.equal(calls, 3)) }) } }) t.test('throw unknown error gives up right away', async t => { const arg = {} const opt = {} const method = (a, b) => { 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' }) } const rBS = retryBusySync(method) t.throws(() => rBS(arg, opt), { code: 'nope' }) const rB = retryBusy(method) await t.rejects(rB(arg, opt), { code: 'nope' }) }) isaacs-rimraf-89ff4ac/test/rimraf-manual.js000066400000000000000000000016421440664702500210240ustar00rootroot00000000000000const t = require('tap') const { rimrafWindows, rimrafWindowsSync, } = require('../dist/cjs/src/rimraf-windows.js') const { rimrafPosix, rimrafPosixSync, } = require('../dist/cjs/src/rimraf-posix.js') const { rimrafManual, rimrafManualSync, } = require('../dist/cjs/src/rimraf-manual.js') if (!process.env.__TESTING_RIMRAF_PLATFORM__) { const otherPlatform = process.platform !== 'win32' ? 'win32' : 'posix' t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_PLATFORM__: otherPlatform, }, }) } const platform = process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform const [expectManual, expectManualSync] = platform === 'win32' ? [rimrafWindows, rimrafWindowsSync] : [rimrafPosix, rimrafPosixSync] t.equal(rimrafManual, expectManual, 'got expected implementation') t.equal(rimrafManualSync, expectManualSync, 'got expected implementation') isaacs-rimraf-89ff4ac/test/rimraf-move-remove.js000066400000000000000000000464331440664702500220170ustar00rootroot00000000000000const t = require('tap') t.formatSnapshot = calls => calls.map(args => args.map(arg => String(arg) .split(process.cwd()) .join('{CWD}') .replace(/\\/g, '/') .replace(/.*\/(\.[a-z]\.)[^/]*$/, '{tmpfile}') ) ) const { relative, basename } = require('path') const { statSync } = require('fs') const fixture = { a: 'a', b: 'b', c: { d: 'd', e: 'e', f: { g: 'g', h: 'h', i: { j: 'j', k: 'k', l: 'l', m: { n: 'n', o: 'o', }, }, }, }, } t.only('actually delete some stuff', async t => { const fs = require('../dist/cjs/src/fs.js') const fsMock = { ...fs, promises: { ...fs.promises } } // simulate annoying windows semantics, where an unlink or rmdir // may take an arbitrary amount of time. we only delay unlinks, // to ensure that we will get an error when we try to rmdir. const { statSync, promises: { unlink }, } = fs const danglers = [] const unlinkLater = path => { const p = new Promise(res => { setTimeout(() => unlink(path).then(res, res)) }) danglers.push(p) } fsMock.unlinkSync = path => unlinkLater(path) fsMock.promises.unlink = async path => unlinkLater(path) // but actually do wait to clean them up, though t.teardown(() => Promise.all(danglers)) const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': fsMock, } ) const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': fsMock } ) t.test('posix does not work here', t => { t.test('sync', t => { const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path)) t.end() }) t.test('async', t => { const path = t.testdir(fixture) t.rejects(() => rimrafPosix(path)) t.end() }) t.end() }) t.test('sync', t => { const path = t.testdir(fixture) rimrafMoveRemoveSync(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.doesNotThrow( () => rimrafMoveRemoveSync(path, {}), 'deleting a second time is OK' ) t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await rimrafMoveRemove(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.resolves(rimrafMoveRemove(path, {}), 'deleting a second time is OK') }) t.end() }) t.only('throw unlink errors', async t => { const fs = require('../dist/cjs/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 } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, }, } ) // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafMoveRemoveSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafMoveRemove(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.only('ignore ENOENT unlink errors', async t => { const fs = require('../dist/cjs/src/fs.js') const threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, unlinkSync: path => { fs.unlinkSync(path) if (threwSync) { return } threwSync = true fs.unlinkSync(path) }, promises: { ...fs.promises, unlink: async path => { fs.unlinkSync(path) if (threwAsync) { return } threwSync = true fs.unlinkSync(path) }, }, }, } ) // 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.end() }) t.test('async', t => { const path = t.testdir({ test: fixture }) + '/test' t.resolves(() => rimrafMoveRemove(path, {}), 'enoent no problems') t.end() }) t.end() }) t.test('throw rmdir errors', async t => { const fs = require('../dist/cjs/src/fs.js') const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, rmdirSync: path => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, promises: { ...fs.promises, rmdir: async path => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, }, }, } ) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafMoveRemoveSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafMoveRemove(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.test('throw unexpected readdir errors', async t => { const fs = require('../dist/cjs/src/fs.js') const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, readdirSync: path => { throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) }, promises: { ...fs.promises, readdir: async path => { throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) }, }, }, } ) t.test('sync', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafMoveRemoveSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafMoveRemove(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.test('refuse to delete the root dir', async t => { const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { path: { ...require('path'), dirname: path => path, }, } ) const d = t.testdir({}) // not brave enough to pass the actual c:\\ here... t.throws(() => rimrafMoveRemoveSync(d, { tmp: d }), { message: 'cannot delete temp directory used for deletion', }) t.rejects(() => rimrafMoveRemove(d, { tmp: d }), { message: 'cannot delete temp directory used for deletion', }) }) t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) return fs.chmodSync(...args) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) return fs.promises.chmod(...args) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' rimrafMoveRemoveSync(path, {}) t.matchSnapshot(CHMODS) t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' await rimrafMoveRemove(path, {}) t.matchSnapshot(CHMODS) t.end() }) t.end() }) t.test('handle EPERMs, chmod returns ENOENT', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} return fs.chmodSync(...args) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} return fs.promises.chmod(...args) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' rimrafMoveRemoveSync(path, {}) t.matchSnapshot(CHMODS) t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' await rimrafMoveRemove(path, {}) t.matchSnapshot(CHMODS) t.end() }) t.end() }) t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} throw new Error('cannot chmod', { code: 'FOO' }) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} throw new Error('cannot chmod', { code: 'FOO' }) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafMoveRemoveSync(path, {}), { code: 'EPERM' }) t.matchSnapshot(CHMODS) t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafMoveRemove(path, {}), { code: 'EPERM' }) t.matchSnapshot(CHMODS) t.end() }) t.end() }) t.test('rimraffing root, do not actually rmdir root', async t => { const fs = require('../dist/cjs/src/fs.js') let ROOT = null const { parse } = require('path') const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', { path: { ...require('path'), parse: path => { const p = parse(path) if (path === ROOT) { p.root = path } return p }, }, } ) t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafMoveRemove(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.test('sync', async t => { ROOT = t.testdir(fixture) rimrafMoveRemoveSync(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.end() }) t.test( 'abort if the signal says to', { skip: typeof AbortController === 'undefined' }, t => { const { rimrafMoveRemove, rimrafMoveRemoveSync } = t.mock( '../dist/cjs/src/rimraf-move-remove.js', {} ) t.test('sync', t => { const ac = new AbortController() const { signal } = ac ac.abort(new Error('aborted rimraf')) const d = t.testdir(fixture) t.throws(() => rimrafMoveRemoveSync(d, { signal })) t.end() }) t.test('sync abort in filter', t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac const opt = { signal, filter: (p, st) => { if (basename(p) === 'g' && st.isFile()) { ac.abort(new Error('done')) } return true }, } t.throws(() => rimrafMoveRemoveSync(d, opt), { message: 'done' }) t.end() }) t.test('async', async t => { const ac = new AbortController() const { signal } = ac const d = t.testdir(fixture) const p = t.rejects(() => rimrafMoveRemove(d, { signal })) ac.abort(new Error('aborted rimraf')) await p }) t.test('async, pre-aborted', async t => { const ac = new AbortController() const { signal } = ac const d = t.testdir(fixture) ac.abort(new Error('aborted rimraf')) await t.rejects(() => rimrafMoveRemove(d, { signal })) }) t.end() } ) t.test('filter function', t => { t.formatSnapshot = undefined const { rimrafMoveRemove, rimrafMoveRemoveSync, } = require('../dist/cjs/src/rimraf-move-remove.js') for (const f of ['i', 'j']) { t.test(`filter=${f}`, t => { t.test('sync', t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } rimrafMoveRemoveSync(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) t.end() }) t.test('async', async t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } await rimrafMoveRemove(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.test('async filter', async t => { const dir = t.testdir(fixture) const saw = [] const filter = async p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) await new Promise(setImmediate) return basename(p) !== f } await rimrafMoveRemove(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.end() }) } t.end() }) t.test('do not follow symlinks', t => { const { rimrafMoveRemove, rimrafMoveRemoveSync, } = require('../dist/cjs/src/rimraf-move-remove.js') const fixture = { x: { y: t.fixture('symlink', '../z'), z: '', }, z: { a: '', b: { c: '' }, }, } t.test('sync', t => { const d = t.testdir(fixture) t.equal(rimrafMoveRemoveSync(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') t.end() }) t.test('async', async t => { const d = t.testdir(fixture) t.equal(await rimrafMoveRemove(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') }) t.end() }) isaacs-rimraf-89ff4ac/test/rimraf-native.js000066400000000000000000000010241440664702500210270ustar00rootroot00000000000000const t = require('tap') const CALLS = [] const fs = { rmSync: (path, options) => { CALLS.push(['rmSync', path, options]) }, promises: { rm: async (path, options) => { CALLS.push(['rm', path, options]) }, }, } const { rimrafNative, rimrafNativeSync } = t.mock( '../dist/cjs/src/rimraf-native.js', { '../dist/cjs/src/fs.js': fs, } ) t.test('calls the right node function', async t => { await rimrafNative('path', { x: 'y' }) rimrafNativeSync('path', { a: 'b' }) t.matchSnapshot(CALLS) }) isaacs-rimraf-89ff4ac/test/rimraf-posix.js000066400000000000000000000257171440664702500207220ustar00rootroot00000000000000// 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) // } const t = require('tap') const { rimrafPosix, rimrafPosixSync, } = require('../dist/cjs/src/rimraf-posix.js') const { parse, relative, basename } = require('path') const { statSync } = require('fs') const fs = require('../dist/cjs/src/fs.js') const fixture = { a: 'a', b: 'b', c: { d: 'd', e: 'e', f: { g: 'g', h: 'h', i: { j: 'j', k: 'k', l: 'l', m: { n: 'n', o: 'o', }, }, }, }, } t.test('actually delete some stuff', t => { const { statSync } = fs t.test('sync', t => { const path = t.testdir(fixture) rimrafPosixSync(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.doesNotThrow( () => rimrafPosixSync(path, {}), 'deleting a second time is OK' ) t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await rimrafPosix(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.resolves(rimrafPosix(path, {}), 'deleting a second time is OK') }) t.end() }) t.test('throw unlink errors', async t => { const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': { ...fs, unlinkSync: path => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { ...fs.promises, unlink: async path => { throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, }, } ) const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) }) t.test('throw rmdir errors', async t => { const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': { ...fs, rmdirSync: path => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, promises: { ...fs.promises, rmdir: async path => { throw Object.assign(new Error('cannot rmdir'), { code: 'FOO' }) }, }, }, } ) const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) }) t.test('throw unexpected readdir errors', async t => { const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': { ...fs, readdirSync: path => { throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) }, promises: { ...fs.promises, readdir: async path => { throw Object.assign(new Error('cannot readdir'), { code: 'FOO' }) }, }, }, } ) const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path, {}), { code: 'FOO' }) t.rejects(rimrafPosix(path, {}), { code: 'FOO' }) }) t.test('ignore ENOENTs from unlink/rmdir', async t => { const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': { ...fs, // simulate a case where two rimrafs are happening in parallel, // so the deletion happens AFTER the readdir, but before ours. rmdirSync: path => { fs.rmdirSync(path) fs.rmdirSync(path) }, unlinkSync: path => { fs.unlinkSync(path) fs.unlinkSync(path) }, promises: { ...fs.promises, rmdir: async path => { fs.rmdirSync(path) return fs.promises.rmdir(path) }, unlink: async path => { fs.unlinkSync(path) return fs.promises.unlink(path) }, }, }, } ) const { statSync } = fs t.test('sync', t => { const path = t.testdir(fixture) rimrafPosixSync(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await rimrafPosix(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') }) t.end() }) t.test('rimraffing root, do not actually rmdir root', async t => { let ROOT = null const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { path: { ...require('path'), parse: path => { const p = parse(path) if (path === ROOT) { p.root = path } return p }, }, } ) t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafPosix(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.test('sync', async t => { ROOT = t.testdir(fixture) rimrafPosixSync(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.end() }) t.test( 'abort on signal', { skip: typeof AbortController === 'undefined' }, t => { const { rimrafPosix, rimrafPosixSync, } = require('../dist/cjs/src/rimraf-posix.js') t.test('sync', t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac ac.abort(new Error('aborted rimraf')) t.throws(() => rimrafPosixSync(d, { signal })) t.end() }) t.test('sync abort in filter', t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac const opt = { signal, filter: (p, st) => { if (basename(p) === 'g' && st.isFile()) { ac.abort(new Error('done')) } return true }, } t.throws(() => rimrafPosixSync(d, opt), { message: 'done' }) t.end() }) t.test('async', async t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac const p = t.rejects(() => rimrafPosix(d, { signal })) ac.abort(new Error('aborted rimraf')) await p }) t.test('async preaborted', async t => { const d = t.testdir(fixture) const ac = new AbortController() ac.abort(new Error('aborted rimraf')) const { signal } = ac await t.rejects(() => rimrafPosix(d, { signal })) }) t.end() } ) t.test('filter function', t => { t.formatSnapshot = undefined const { rimrafPosix, rimrafPosixSync, } = require('../dist/cjs/src/rimraf-posix.js') for (const f of ['i', 'j']) { t.test(`filter=${f}`, t => { t.test('sync', t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } rimrafPosixSync(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) t.end() }) t.test('async', async t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } await rimrafPosix(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.test('async filter', async t => { const dir = t.testdir(fixture) const saw = [] const filter = async p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) await new Promise(setImmediate) return basename(p) !== f } await rimrafPosix(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.end() }) } t.end() }) t.test('do not follow symlinks', t => { const fixture = { x: { y: t.fixture('symlink', '../z'), z: '', }, z: { a: '', b: { c: '' }, }, } t.test('sync', t => { const d = t.testdir(fixture) t.equal(rimrafPosixSync(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') t.end() }) t.test('async', async t => { const d = t.testdir(fixture) t.equal(await rimrafPosix(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') }) t.end() }) isaacs-rimraf-89ff4ac/test/rimraf-windows.js000066400000000000000000000452441440664702500212470ustar00rootroot00000000000000const t = require('tap') const { parse, basename, relative } = require('path') const { statSync } = require('fs') t.formatSnapshot = calls => Array.isArray(calls) ? calls.map(args => args.map(arg => String(arg) .split(process.cwd()) .join('{CWD}') .replace(/\\/g, '/') .replace(/.*\/(\.[a-z]\.)[^/]*$/, '{tmpfile}') ) ) : calls const fixture = { a: 'a', b: 'b', c: { d: 'd', e: 'e', f: { g: 'g', h: 'h', i: { j: 'j', k: 'k', l: 'l', m: { n: 'n', o: 'o', }, }, }, }, } t.test('actually delete some stuff', async t => { const fs = require('../dist/cjs/src/fs.js') const fsMock = { ...fs, promises: { ...fs.promises } } // simulate annoying windows semantics, where an unlink or rmdir // may take an arbitrary amount of time. we only delay unlinks, // to ensure that we will get an error when we try to rmdir. const { statSync, promises: { unlink }, } = fs const danglers = [] const unlinkLater = path => { const p = new Promise(res => { setTimeout(() => unlink(path).then(res, res), 100) }) danglers.push(p) } fsMock.unlinkSync = path => unlinkLater(path) fsMock.promises.unlink = async path => unlinkLater(path) // but actually do wait to clean them up, though t.teardown(async () => { await Promise.all(danglers) }) const { rimrafPosix, rimrafPosixSync } = t.mock( '../dist/cjs/src/rimraf-posix.js', { '../dist/cjs/src/fs.js': fsMock, } ) const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': fsMock } ) t.test('posix does not work here', t => { t.test('sync', t => { const path = t.testdir(fixture) t.throws(() => rimrafPosixSync(path)) t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await t.rejects(() => rimrafPosix(path)) t.end() }) t.end() }) t.test('sync', t => { const path = t.testdir(fixture) rimrafWindowsSync(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') t.doesNotThrow( () => rimrafWindowsSync(path, {}), 'deleting a second time is OK' ) t.end() }) t.test('async', async t => { const path = t.testdir(fixture) await rimrafWindows(path, {}) t.throws(() => statSync(path), { code: 'ENOENT' }, 'deleted') await t.resolves(rimrafWindows(path, {}), 'deleting a second time is OK') }) t.end() }) t.test('throw unlink errors', async t => { const fs = require('../dist/cjs/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 { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...fs, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'FOO' }) }, }, }, } ) // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafWindowsSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafWindows(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.test('ignore ENOENT unlink errors', async t => { const fs = require('../dist/cjs/src/fs.js') const threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...fs, unlinkSync: path => { fs.unlinkSync(path) if (threwSync) { return } threwSync = true fs.unlinkSync(path) }, promises: { ...fs.promises, unlink: async path => { fs.unlinkSync(path) if (threwAsync) { return } threwSync = true fs.unlinkSync(path) }, }, }, } ) // nest to clean up the mess t.test('sync', t => { const path = t.testdir({ test: fixture }) + '/test' t.doesNotThrow(() => rimrafWindowsSync(path, {}), 'enoent no problems') t.end() }) t.test('async', t => { const path = t.testdir({ test: fixture }) + '/test' t.resolves(() => rimrafWindows(path, {}), 'enoent no problems') t.end() }) t.end() }) t.test('throw rmdir errors', async t => { const fs = require('../dist/cjs/src/fs.js') const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...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' }) }, }, }, } ) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafWindowsSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafWindows(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.test('throw unexpected readdir errors', async t => { const fs = require('../dist/cjs/src/fs.js') const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/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' }) }, }, }, } ) t.test('sync', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafWindowsSync(path, {}), { code: 'FOO' }) t.end() }) t.test('async', t => { // nest to clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafWindows(path, {}), { code: 'FOO' }) t.end() }) t.end() }) t.test('handle EPERMs on unlink by trying to chmod 0o666', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) return fs.chmodSync(...args) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) return fs.promises.chmod(...args) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' rimrafWindowsSync(path, {}) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' await rimrafWindows(path, {}) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.end() }) t.test('handle EPERMs, chmod returns ENOENT', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} return fs.chmodSync(...args) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} return fs.promises.chmod(...args) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' rimrafWindowsSync(path, {}) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' await rimrafWindows(path, {}) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.end() }) t.test('handle EPERMs, chmod raises something other than ENOENT', async t => { const fs = require('../dist/cjs/src/fs.js') const CHMODS = [] let threwAsync = false let threwSync = false const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { '../dist/cjs/src/fs.js': { ...fs, chmodSync: (...args) => { CHMODS.push(['chmodSync', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} throw new Error('cannot chmod', { code: 'FOO' }) }, unlinkSync: path => { if (threwSync) { return fs.unlinkSync(path) } threwSync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, promises: { ...fs.promises, unlink: async path => { if (threwAsync) { return fs.promises.unlink(path) } threwAsync = true throw Object.assign(new Error('cannot unlink'), { code: 'EPERM' }) }, chmod: async (...args) => { CHMODS.push(['chmod', ...args]) try { fs.unlinkSync(args[0]) } catch (_) {} throw new Error('cannot chmod', { code: 'FOO' }) }, }, }, } ) t.afterEach(() => (CHMODS.length = 0)) t.test('sync', t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.throws(() => rimrafWindowsSync(path, {}), { code: 'EPERM' }) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.test('async', async t => { // nest it so that we clean up the mess const path = t.testdir({ test: fixture }) + '/test' t.rejects(rimrafWindows(path, {}), { code: 'EPERM' }) t.matchSnapshot(CHMODS.length, 'chmods') t.end() }) t.end() }) t.test('rimraffing root, do not actually rmdir root', async t => { const fs = require('../dist/cjs/src/fs.js') let ROOT = null const { rimrafWindows, rimrafWindowsSync } = t.mock( '../dist/cjs/src/rimraf-windows.js', { path: { ...require('path'), parse: path => { const p = parse(path) if (path === ROOT) { p.root = path } return p }, }, } ) t.test('async', async t => { ROOT = t.testdir(fixture) await rimrafWindows(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.test('sync', async t => { ROOT = t.testdir(fixture) rimrafWindowsSync(ROOT, { preserveRoot: false }) t.equal(fs.statSync(ROOT).isDirectory(), true, 'root still present') t.same(fs.readdirSync(ROOT), [], 'entries all gone') }) t.end() }) t.test( 'abort on signal', { skip: typeof AbortController === 'undefined' }, t => { const { rimrafWindows, rimrafWindowsSync, } = require('../dist/cjs/src/rimraf-windows.js') t.test('sync', t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac ac.abort(new Error('aborted rimraf')) t.throws(() => rimrafWindowsSync(d, { signal })) t.end() }) t.test('sync abort in filter', t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac const opt = { signal, filter: (p, st) => { if (basename(p) === 'g' && st.isFile()) { ac.abort(new Error('done')) } return true }, } t.throws(() => rimrafWindowsSync(d, opt), { message: 'done' }) t.end() }) t.test('async', async t => { const d = t.testdir(fixture) const ac = new AbortController() const { signal } = ac const p = t.rejects(() => rimrafWindows(d, { signal })) ac.abort(new Error('aborted rimraf')) await p }) t.test('async, pre-aborted', async t => { const ac = new AbortController() const { signal } = ac const d = t.testdir(fixture) ac.abort(new Error('aborted rimraf')) await t.rejects(() => rimrafWindows(d, { signal })) }) t.end() } ) t.test('filter function', t => { t.formatSnapshot = undefined const { rimrafWindows, rimrafWindowsSync, } = require('../dist/cjs/src/rimraf-windows.js') for (const f of ['i', 'j']) { t.test(`filter=${f}`, t => { t.test('sync', t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } rimrafWindowsSync(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) t.end() }) t.test('async', async t => { const dir = t.testdir(fixture) const saw = [] const filter = p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) return basename(p) !== f } await rimrafWindows(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.test('async filter', async t => { const dir = t.testdir(fixture) const saw = [] const filter = async p => { saw.push(relative(process.cwd(), p).replace(/\\/g, '/')) await new Promise(setImmediate) return basename(p) !== f } await rimrafWindows(dir, { filter }) t.matchSnapshot( saw.sort((a, b) => a.localeCompare(b, 'en')), 'paths seen' ) statSync(dir) statSync(dir + '/c') statSync(dir + '/c/f') statSync(dir + '/c/f/i') if (f === 'j') { statSync(dir + '/c/f/i/j') } else { t.throws(() => statSync(dir + '/c/f/i/j')) } t.throws(() => statSync(dir + '/a')) t.throws(() => statSync(dir + '/b')) t.throws(() => statSync(dir + '/c/d')) t.throws(() => statSync(dir + '/c/e')) t.throws(() => statSync(dir + '/c/f/g')) t.throws(() => statSync(dir + '/c/f/h')) t.throws(() => statSync(dir + '/c/f/i/k')) t.throws(() => statSync(dir + '/c/f/i/l')) t.throws(() => statSync(dir + '/c/f/i/m')) }) t.end() }) } t.end() }) t.test('do not follow symlinks', t => { const { rimrafWindows, rimrafWindowsSync, } = require('../dist/cjs/src/rimraf-windows.js') const fixture = { x: { y: t.fixture('symlink', '../z'), z: '', }, z: { a: '', b: { c: '' }, }, } t.test('sync', t => { const d = t.testdir(fixture) t.equal(rimrafWindowsSync(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') t.end() }) t.test('async', async t => { const d = t.testdir(fixture) t.equal(await rimrafWindows(d + '/x', {}), true) statSync(d + '/z') statSync(d + '/z/a') statSync(d + '/z/b/c') }) t.end() }) isaacs-rimraf-89ff4ac/test/use-native.js000066400000000000000000000034011440664702500203440ustar00rootroot00000000000000// 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)) { console.log('TAP version 13') console.log('1..0 # no native recursive fs.rm in this node version') process.exit(0) } const t = require('tap') const { useNative, useNativeSync } = require('../dist/cjs/src/use-native.js') if (!process.env.__TESTING_RIMRAF_EXPECT_USE_NATIVE__) { t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_PLATFORM__: 'darwin', __TESTING_RIMRAF_NODE_VERSION__: 'v18.0.0', __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '1', }, }) t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_PLATFORM__: 'win32', __TESTING_RIMRAF_NODE_VERSION__: 'v18.0.0', __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', }, }) t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_NODE_VERSION__: 'v8.9.10', __TESTING_RIMRAF_PLATFORM__: 'darwin', __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', }, }) t.spawn(process.execPath, [__filename], { env: { ...process.env, __TESTING_RIMRAF_NODE_VERSION__: 'v14.13.12', __TESTING_RIMRAF_PLATFORM__: 'darwin', __TESTING_RIMRAF_EXPECT_USE_NATIVE__: '0', }, }) } 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) } t.equal(useNative(), expect) t.equal(useNativeSync(), expect) } isaacs-rimraf-89ff4ac/tsconfig-base.json000066400000000000000000000007461440664702500203770ustar00rootroot00000000000000{ "exclude": ["./test", "./tap-snapshots"], "include": ["src/**/*.ts"], "compilerOptions": { "allowSyntheticDefaultImports": true, "declaration": true, "declarationMap": true, "inlineSources": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, "moduleResolution": "node", "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, "strict": true, "target": "es2022" } } isaacs-rimraf-89ff4ac/tsconfig-esm.json000066400000000000000000000003031440664702500202360ustar00rootroot00000000000000{ "extends": "./tsconfig-base.json", "exclude": ["./test", "./tap-snapshots", "src/index-cjs.ts", "src/bin.ts"], "compilerOptions": { "module": "esnext", "outDir": "dist/mjs" } } isaacs-rimraf-89ff4ac/tsconfig.json000066400000000000000000000002271440664702500174610ustar00rootroot00000000000000{ "extends": "./tsconfig-base.json", "compilerOptions": { "module": "commonjs", "outDir": "dist/cjs", "moduleResolution": "Node" } } isaacs-rimraf-89ff4ac/typedoc.json000066400000000000000000000001221440664702500173060ustar00rootroot00000000000000{ "navigationLinks": { "isaacs projects": "https://isaacs.github.io/" } }